diff options
| author | Ralph Amissah <ralph@amissah.com> | 2015-03-19 23:47:17 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2015-03-23 21:46:12 -0400 | 
| commit | e7ce21ab4a724ee6743b4bb7d53c02aef06b805d (patch) | |
| tree | 8bddf44cc19feb036ee2a1c6c439b81ba43a6234 | |
| parent | d: ao & elsewhere, use of map & select (diff) | |
d: bibliography marked up section of citations & metadata
* if any order is as follows: endnotes; bibliography; index
* to trigger, identify the bibliography section using heading
  1~biblio
* and either:
  * provide tagged bibliography at end of document, along with
    an id for use in footnotes & the short title that should
    be used to substitute the id
  or:
  * tag citations in footnotes that should appear in
    bibliography
* bibliography currently sorted on last name year and title
* first pass (see documentation to be provided)
| -rw-r--r-- | data/doc/sisu/CHANGELOG_v6 | 10 | ||||
| -rw-r--r-- | lib/sisu/develop/ao.rb | 6 | ||||
| -rw-r--r-- | lib/sisu/develop/ao_doc_str.rb | 153 | ||||
| -rw-r--r-- | lib/sisu/develop/ao_references.rb | 502 | ||||
| -rw-r--r-- | lib/sisu/develop/ao_syntax.rb | 22 | ||||
| -rw-r--r-- | lib/sisu/develop/dp.rb | 35 | 
6 files changed, 701 insertions, 27 deletions
| diff --git a/data/doc/sisu/CHANGELOG_v6 b/data/doc/sisu/CHANGELOG_v6 index e51e0883..06eb3618 100644 --- a/data/doc/sisu/CHANGELOG_v6 +++ b/data/doc/sisu/CHANGELOG_v6 @@ -128,6 +128,16 @@ http://www.jus.uio.no/sisu/pkg/src/sisu_6.4.0.orig.tar.xz    * ao and elsewhere, use of map and select +  * ao bibliography / references, provide tools to assist in making (first pass) +    * change end sequence: auto generated endnote section; bibliography; +      book index if any +    either: +    * create a tagged bibliography list at end of document, also providing +      an id for use in footnotes, and the short title that is to appear in +      footnotes +    or: +    * tag footnote citations that should appear in the bibliography +  ** SiSU "UnFrozen" - prior to end of Debian Freeze    (upstream bugfix 6.3.2 (5.7.2) intended for Jessie (packaged for Debian as    5.7.1-2) was not accepted) diff --git a/lib/sisu/develop/ao.rb b/lib/sisu/develop/ao.rb index ed3aa98b..0ac6f502 100644 --- a/lib/sisu/develop/ao.rb +++ b/lib/sisu/develop/ao.rb @@ -64,6 +64,7 @@ module SiSU_AO    require_relative 'ao_syntax'                          # ao_syntax.rb      include SiSU_AO_Syntax    require_relative 'ao_doc_str'                         # ao_doc_str.rb +  require_relative 'ao_references'                      # ao_references.rb    require_relative 'ao_idx'                             # ao_idx.rb    require_relative 'ao_numbering'                       # ao_numbering.rb    require_relative 'ao_hash_digest'                     # ao_hash_digest.rb @@ -539,11 +540,12 @@ module SiSU_AO          SiSU_AO_MiscArrangeText::SI.new(@md,data_txt).               # ao_misc_arrange.rb            prepare_text        data_obj, -        metadata= +        metadata, +        bibliography=            SiSU_AO_DocumentStructureExtract::Build.new(@md,data_txt). # ao_doc_str.rb              identify_parts        data_obj= -        SiSU_AO_Syntax::Markup.new(@md,data_obj).songsheet           # ao_syntax.rb +        SiSU_AO_Syntax::Markup.new(@md,data_obj,bibliography).songsheet           # ao_syntax.rb        data_obj,          endnote_array=            SiSU_AO_CharacterCheck::Check.new(data_obj).               # ao_character_check.rb diff --git a/lib/sisu/develop/ao_doc_str.rb b/lib/sisu/develop/ao_doc_str.rb index c5f39ed4..353469ec 100644 --- a/lib/sisu/develop/ao_doc_str.rb +++ b/lib/sisu/develop/ao_doc_str.rb @@ -231,21 +231,8 @@ module SiSU_AO_DocumentStructureExtract          array: idx_array,        }      end -    def identify_parts -      tuned_file=[] -      @tuned_block,@tuned_code=[],[] -      @@counter,@verse_count=0,0 -      @num_id={ -        code_block: 0, -        poem:       0, -        box:        0, -        group:      0, -        alt:        0, -        quote:      0, -        table:      0, -      } -      @metadata={} -      @data.each do |t_o| +    def extract_structure_loop(data,tuned_file) +      data.each do |t_o|          if t_o =~/^--([+~-])[#]$/            h=case $1            when /[+]/ @@ -274,6 +261,29 @@ module SiSU_AO_DocumentStructureExtract            t_o=SiSU_AO_DocumentStructure::ObjectFlag.new.flag_ocn(h)            next          end +        if t_o =~/^:[~](#{SiSU_is.language_list_regex?}|-)$/  # work with for identifying language of objects +          lng=$1 +          h=case lng +          when /(?:#{SiSU_is.language_list_regex?})/ +            @per.lng=:on +            @per.lng_is=lng.to_sym +            { +              flag: :lng_on, +              act:  lng.to_sym, +            } +          else # ^:~- +            if @per.lng==:on +              @per.lng=:off +              @per.lng_is=:doc_default +              { +                flag: :lng_off, +                act:  :doc_default, +              } +            end +          end +          t_o=SiSU_AO_DocumentStructure::ObjectFlag.new.flag_lng(h) +          next +        end          t_o=t_o.gsub(/(?:\n\s*\n)+/m,"\n") if @per.code==:off          unless t_o =~/^(?:@\S+?:|%+)\s/                  # extract book index for paragraph if any            idx=if t_o=~/^=\{\s*(.+)\s*\}\s*$\Z/m @@ -1046,6 +1056,24 @@ module SiSU_AO_DocumentStructureExtract          else tuned_file << t_o          end        end +      tuned_file +    end +    def identify_parts +      tuned_file=[] +      @tuned_block,@tuned_code=[],[] +      @@counter,@verse_count=0,0 +      @num_id={ +        code_block: 0, +        poem:       0, +        box:        0, +        group:      0, +        alt:        0, +        quote:      0, +        table:      0, +      } +      @metadata={} +      @data,bibliography=SiSU_AO_References::Bibliography.new(@md,@data).biblio_extraction +      tuned_file=extract_structure_loop(@data,tuned_file)        if @md.flag_endnotes          tuned_file << @pb          h={ @@ -1065,7 +1093,98 @@ module SiSU_AO_DocumentStructureExtract          tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)          h={            obj: 'Endnotes' -          } +        } +      end +      if @md.flag_auto_biblio +        tuned_file << @pb +        h={ +          ln: 1, +          lc: 1, +          obj: 'References', +          autonum_: false, +        } +        tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h) +        h={ +          ln: 4, +          lc: 2, +          obj: 'Bibliography', +          name: 'biblio', +          autonum_: false, +        } +        tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h) +        h={ +          obj: 'Bibliography' +        } +        citenumber=0 +        bibliography.each do |c| +          citenumber +=1 if c.is_a?(Hash) +          if c[:is]==:book +            h={ +              obj: %{[#{citenumber}] *{#{c[:author]}}* /{"#{c[:fulltitle]}"}/ #{c[:publisher]} (#{c[:year]}) #{c[:url]}}, +              tags: [c[:id]], +              hang: 0, +              indent: 2, +              ocn_: false, +            } +            tuned_file << SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h) +          elsif c[:is]==:article +            h={ +              obj: %{[#{citenumber}] *{#{c[:author]}}* /{"#{c[:title]}"}/ #{c[:journal]} #{c[:volume]} (#{c[:year]}) #{c[:url]}}, +              tags: [c[:id]], +              hang: 0, +              indent: 2, +              ocn_: false, +            } +            tuned_file << SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h) +          end +        end +      elsif @md.flag_biblio +        tuned_file << @pb +        h={ +          ln: 1, +          lc: 1, +          obj: 'References', +          autonum_: false, +        } +        tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h) +        h={ +          ln: 4, +          lc: 2, +          obj: 'Bibliography', +          name: 'biblio', +          autonum_: false, +        } +        tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h) +        h={ +          obj: 'Bibliography' +        } +        if bibliography.length > 0 +          tuned_file=extract_structure_loop(bibliography,tuned_file) +        else +          tuned_file, citations = +            SiSU_AO_References::Citations.new(@md,tuned_file).songsheet  # ao_references.rb +          citenumber=0 +          citations.compact.each do |c| +            citenumber +=1 if c.is_a?(Hash) +            if c[:is]==:book +              h={ +                obj: %{[#{citenumber}] *{#{c[:author]}}* /{#{c[:publication]}}/ (#{c[:year]})}, +                hang: 0, +                indent: 2, +                ocn_: false, +              } +              tuned_file << SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h) +            elsif c[:is]==:article +              h={ +                obj: %{[#{citenumber}] *{#{c[:author]}}* /{"#{c[:title]}"}/ #{c[:publication]} editor #{c[:editor]} (#{c[:year]})}, +                hang: 0, +                indent: 2, +                ocn_: false, +              } +              tuned_file << SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h) +            end +          end +        end        end        if @md.book_idx          tuned_file << @pb @@ -1110,7 +1229,7 @@ module SiSU_AO_DocumentStructureExtract          obj: 'eof',        }        meta=SiSU_AO_DocumentStructure::ObjectMetadata.new.metadata(@metadata) -      [tuned_file,meta] +      [tuned_file,meta,bibliography]      end      def table_rows_and_columns_array(table_str)        table=[] diff --git a/lib/sisu/develop/ao_references.rb b/lib/sisu/develop/ao_references.rb new file mode 100644 index 00000000..5ef94c61 --- /dev/null +++ b/lib/sisu/develop/ao_references.rb @@ -0,0 +1,502 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** system environment, resource control and configuration details + +** Author: Ralph Amissah +  <ralph@amissah.com> +  <ralph.amissah@gmail.com> + +** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +  2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Ralph Amissah, +  All Rights Reserved. + +** License: GPL 3 or later: + +  SiSU, a framework for document structuring, publishing and search + +  Copyright (C) Ralph Amissah + +  This program is free software: you can redistribute it and/or modify it +  under the terms of the GNU General Public License as published by the Free +  Software Foundation, either version 3 of the License, or (at your option) +  any later version. + +  This program is distributed in the hope that it will be useful, but WITHOUT +  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +  more details. + +  You should have received a copy of the GNU General Public License along with +  this program. If not, see <http://www.gnu.org/licenses/>. + +  If you have Internet connection, the latest version of the GPL should be +  available at these locations: +  <http://www.fsf.org/licensing/licenses/gpl.html> +  <http://www.gnu.org/licenses/gpl.html> + +  <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html> + +** SiSU uses: +  * Standard SiSU markup syntax, +  * Standard SiSU meta-markup syntax, and the +  * Standard SiSU object citation numbering and system + +** Hompages: +  <http://www.jus.uio.no/sisu> +  <http://www.sisudoc.org> + +** Git +  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary> +  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/ao_references.rb;hb=HEAD> + +=end +module SiSU_AO_References +  class Bibliography +    def initialize(md,data) +      @md,@data=md,data +    end +    def sort_bibliography_array_by_author_year_title(bib) +      if bib +        bib.compact.sort_by do |c| +          [c[:author_arr][0],c[:year],c[:title]] +        end +      end +    end +    def citation_in_prepared_bibliography(cite) +      @cite=cite +      def article +        { +           is:         :article, +           author_raw: nil, +           author:     nil, +           author_arr: nil, +           title:      nil, +           language:   nil, +           journal:    nil, +           volume:     nil, +           editor:     nil, +           year:       nil, +           where:      nil, +           url:        nil, +           note:       nil, +           short_name: nil, +           id:         nil, +        } +      end +      def book +        { +           is:         :book, +           author_raw: nil, +           author:     nil, +           author_arr: nil, +           #editor:     nil, +           title:      nil, +           subtitle:   nil, +           fulltitle:  nil, +           language:   nil, +           publisher:  nil, +           edition:    nil, +           year:       nil, +           where:      nil, +           url:        nil, +           note:       nil, +           short_name: nil, +           id:         nil, +        } +      end +      def citation_metadata +        type=if @cite =~/^jo: \S+/m +          :article +        elsif @cite =~/^au: \S+/m +          :book +        end +        if type +          citeblock=@cite.split("\n") +          if type == :article +            citation=article +            citeblock.select do |meta| +              case meta +              when /^((?:au|author):\s+)\S+/ #req +                citation[:author_raw]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:ti|title):\s+)\S+/ #req +                citation[:title]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:lng|language):\s+)\S+/ +                citation[:language]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:jo|journal):\s+)\S+/ #req? +                citation[:journal]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:vo|volume):\s+)\S+/ +                citation[:volume]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:edr|editor):\s+)\S+/ +                citation[:editor]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:yr|year):\s+)\S+/ #req? +                citation[:year]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:pst|publisher_state):\s+)\S+/ +                citation[:where]=/^#{$1}(.+)/.match(meta)[1] +              when /^(url:\s+)\S+/ +                citation[:url]=/^#{$1}(.+)/.match(meta)[1] +              when /^(note:\s+)\S+/ +                citation[:note]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:sn|shortname):\s+)\S+/ +                citation[:short_name]=/^#{$1}(.+)/.match(meta)[1] +              when /^(id:\s+)\S+/ +                citation[:id]=/^#{$1}(.+)/.match(meta)[1] +              end +            end +          end +          if type == :book +            citation=book +            citeblock.select do |meta| +              case meta +              when /^((?:au|author):\s+)\S+/ #req +                citation[:author_raw]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:ti|title):\s+)\S+/ #req +                citation[:title]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:st|subtitle):\s+)\S+/ +                citation[:subtitle]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:lng|language):\s+)\S+/ +                citation[:language]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:pb|publisher):\s+)\S+/ +                citation[:publisher]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:edn|edition):\s+)\S+/ +                citation[:edition]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:yr|year):\s+)\S+/ #req? +                citation[:year]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:pst|publisher_state):\s+)\S+/ +                citation[:where]=/^#{$1}(.+)/.match(meta)[1] +              when /^(url:\s+)\S+/ +                citation[:url]=/^#{$1}(.+)/.match(meta)[1] +              when /^(note:\s+)\S+/ +                citation[:note]=/^#{$1}(.+)/.match(meta)[1] +              when /^((?:sn|shortname):\s+)\S+/ +                citation[:short_name]=/^#{$1}(.+)/.match(meta)[1] +              when /^(id:\s+)\S+/ +                citation[:id]=/^#{$1}(.+)/.match(meta)[1] +              end +            end +          end +          if citation[:is]==:book +            if citation[:subtitle] +              citation[:fulltitle] = citation[:title] \ +              + ' - ' \ +              + citation[:subtitle] +            else +              citation[:fulltitle] = citation[:title] +            end +          end +          citation[:author_arr]=citation[:author_raw].split(/;\s*/) +          citation[:author]=citation[:author_arr].map do |author| +            author.gsub(/(.+?),\s+(.+)/,'\2 \1').strip +          end.join(', ').strip +          unless citation[:short_name] +            citation[:short_name]=%{#{c[:author]}, "#{c[:short_name]}" (#{c[:date]})} +          end +        end +        citation +      end +      self +    end +    def biblio_extraction +      bibliography=[] +      biblioflag=false +      code_flag=false +      flag_code_curly=:not_code_curly +      flag_code_tics=:not_code_tics +      @data=@data.select do |t_o| +        if t_o =~/^code\{/ +          flag_code_curly=:code_curly +        elsif t_o =~/^\}code/ +          flag_code_curly=:not_code_curly +        elsif t_o =~/^``` code/ +          flag_code_tics=:code_tics +        elsif flag_code_tics ==:code_tics \ +        and t_o =~/^```/ +          flag_code_tics=:not_code_tics +        end +        code_flag=if flag_code_curly==:code_curly \ +        or flag_code_tics==:code_tics +          true +        else false +        end +        unless code_flag +          if @md.flag_auto_biblio +            if t_o =~/^1~biblio(?:graphy)?/ +              biblioflag = true +              t_o +            elsif t_o =~/^:?[B-D1]~/ +              biblioflag = false +              t_o +            elsif biblioflag +              if t_o !~/\A%+ / +                bibliography << citation_in_prepared_bibliography(t_o).citation_metadata +                next +              else +                t_o +              end +            else t_o +            end +          elsif @md.flag_biblio +            if t_o =~/^1~biblio(?:graphy)?/ +              biblioflag = true +              next +            elsif t_o =~/^:?[B-D]~/ +              next +            elsif t_o =~/^:?[B-D1]~/ +              biblioflag = false +              t_o +            elsif biblioflag +              if t_o !~/\A%+ / +                bibliography << t_o +                next +              else +                t_o +              end +            else t_o +            end +          else t_o +          end +        else t_o +        end +      end.compact +      if @md.flag_auto_biblio \ +      and bibliography.length > 0 +        data_new=[] +        bibliography=sort_bibliography_array_by_author_year_title(bibliography) +        @data.select do |t_o| +          if t_o =~/^1~biblio(?:graphy)?/ +            bibliography.each do  |c| +              if c[:is]==:book +                <<-WOK + +!_ #{c[:author]} +/{"#{c[:fulltitle]}"}/ #{c[:publisher]} (#{c[:year]}) +                WOK +              elsif c[:is]==:article +                <<-WOK + +!_ #{c[:author]} +/{"#{c[:title]}"}/ #{c[:journal]} (#{c[:year]}) +                WOK +              end +            end +          else data_new << t_o +          end +        end +        @data=data_new +      end +      [@data,bibliography] +    end +  end +  class Citations +    def initialize(md='',data='') +      @md,@data=md,data +      #@biblio=[] +    end +    def songsheet +      tuned_file,citations=citations_scan(@data) +      [tuned_file,citations] +    end +    def sort_bibliography_array_by_author_year(bib) +      bib.sort_by do |c| +        [c[:author_raw],c[:year]] +        #[c[:author_arr][0],c[:year],c[:title]] +      end +    end +    def citations_regex +      def pages_pattern +        %r{(?:[,.:]?\s+(?:p{1,2}\.?\s+)?(?:\d+--?\d+)[,.]?\s+)?} +      end +      def editor_pattern +        %r{(?<editor>(?:editor|edited by)\s+.+?)} +      end +      def year_pattern +        %r{[(\[]?(?<year>\d{4})[\])]?[.,]?} +      end +      def authors_year_title_publication_editor_pages +        /(?<authors>.+?)\s+#{year_pattern}\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})\s+#{editor_pattern}#{pages_pattern}/m # note ed. is usually edition rather than editor +      end +      def authors_title_publication_year_editor_pages +        /(?<authors>.+?)\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})\s+#{year_pattern}\s+#{editor_pattern}#{pages_pattern}/m # note ed. is usually edition rather than editor +      end +      def authors_title_publication_editor_year_pages ### +        /(?<authors>.+?)\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})\s+ed.\s+#{editor_pattern}#{year_pattern}#{pages_pattern}/m + # note ed. is usually edition rather than editor +      end +      def authors_title_publication_editor_pages_year ### +        /(?<authors>.+?)\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})\s+#{editor_pattern}#{pages_pattern}#{year_pattern}/m # note ed. is usually edition rather than editor +      end +      def authors_year_title_publication_pages +        /(?<authors>.+?)\s+#{year_pattern}\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})[,.;]?#{pages_pattern}/m +      end +      def authors_title_publication_year_pages +        /(?<authors>.+?)\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})\s+#{year_pattern}\s+#{pages_pattern}/m +      end +      def authors_title_publication_pages_year ### +        /(?<authors>.+?)\s+"(?<title>.+?)"\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})#{pages_pattern}#{year_pattern}/m +      end +      def authors_year_publication_pages +        /(?<authors>.+?)\s+#{year_pattern}\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})#{pages_pattern}/m +      end +      def authors_publication_year_pages +        /(?<authors>.+?)\s+(?:#{Mx[:fa_italics_o]}|#{Mx[:srcrgx_italics_o]})(?<publication>.+?)(?:#{Mx[:fa_italics_c]}|#{Mx[:srcrgx_italics_c]})[,.;]?\s+(?<publisher>.+?)?#{year_pattern}#{pages_pattern}[.;]?/m +      end +      self +    end +    def authors?(citations) +      citations.each.map do |b| +        if b =~ /^.+\s+::.+?:$/ +          c=/^(?<citation>.+?)\s+::(?<shortref>.+?):$/.match(b) +          { +            citation: c[:citation], +            shortref: c[:shortref], +            c[:shortref].to_s => c[:citation] +          } +        else { citation: b } +        end +      end +    end +    def long_and_short_ref?(citations) #could be useful, keep ... ectract shortref +      citations.each.map do |b| +        if b =~ /^.+\s+::.+?:$/ +          c=/^(?<citation>.+?)\s+::(?<shortref>.+?):$/.match(b) +          { +            citation: c[:citation], +            shortref: c[:shortref], +            c[:shortref].to_s => c[:citation] +          } +        else { citation: b } +        end +      end +    end +    def citation_detail(citations) #could be useful, keep ... extract shortref +      bibahash=[] +      number=0 +      missed=0 +      citations.select do |b| +        z=if b =~citations_regex.authors_year_title_publication_editor_pages +          c=citations_regex.authors_year_title_publication_editor_pages.match(b) +          { +            is: :article, +            author_raw: c[:authors], +            year: c[:year], +            title: c[:title], +            publication: c[:publication], +            editor: c[:editor], +          } +        elsif b =~citations_regex.authors_title_publication_year_editor_pages +          c=citations_regex.authors_title_publication_year_editor_pages.match(b) +          { +            is: :article, +            author_raw: c[:authors], +            year: c[:year], +            title: c[:title], +            publication: c[:publication], +            editor: c[:editor], +          } +        elsif b =~citations_regex.authors_title_publication_editor_year_pages +          c=citations_regex.authors_title_publication_editor_year_pages.match(b) +          { +            is: :article, +            author_raw: c[:authors], +            year: c[:year], +            title: c[:title], +            publication: c[:publication], +            editor: c[:editor], +          } +        elsif b =~citations_regex.authors_title_publication_editor_pages_year +          c=citations_regex.authors_title_publication_editor_pages_year.match(b) +          { +            is: :article, +            author_raw: c[:authors], +            year: c[:year], +            title: c[:title], +            publication: c[:publication], +            editor: c[:editor], +          } +        elsif b =~citations_regex.authors_year_title_publication_pages +          c=citations_regex.authors_year_title_publication_pages.match(b) +          { +            is: :article, +            author_raw: c[:authors], +            year: c[:year], +            title: c[:title], +            publication: c[:publication], +          } +        elsif b =~citations_regex.authors_title_publication_year_pages +          c=citations_regex.authors_title_publication_year_pages.match(b) +          { +            is: :article, +            author_raw: c[:authors], +            year: c[:year], +            title: c[:title], +            publication: c[:publication], +          } +        elsif b =~citations_regex.authors_year_publication_pages +          c=citations_regex.authors_year_publication_pages.match(b) +          { +            is: :book, +            author_raw: c[:authors], +            year: c[:year], +            publication: c[:publication], +          } +        elsif b =~citations_regex.authors_publication_year_pages +          c=citations_regex.authors_publication_year_pages.match(b) +          { +            is: :book, +            author_raw: c[:authors], +            year: c[:year], +            publication: c[:publication], +          } +        else b +        end +        if not z.is_a?(NilClass) \ +        and z.is_a?(Hash) \ +        and z[:author_raw].length > 0 +          z[:author_arr]=z[:author_raw].split(/;\s*/) +          z[:author]=z[:author_arr].map do |author| +            author.gsub(/(.+?),\s+(.+)/,'\2 \1').strip +          end.join(', ').strip +          if @md.opt.act[:verbose_plus][:set]==:on \ +          || @md.opt.act[:maintenance][:set]==:on +            number +=1 if z.is_a?(Hash) +            missed +=1 if z.is_a?(String) +            (z.is_a?(Hash)) \ +            ? (p '[' + number.to_s + '] ' + z.to_s) +            : (p '<' + missed.to_s + '> ' + z.to_s) +          end +        end +        bibahash << z if z.is_a?(Hash) +      end +      bibahash=sort_bibliography_array_by_author_year(bibahash.compact) +      bibahash +    end +    def citations_scan(data) +      citations=[] +      #short_ref=[] +      tuned_file = data.compact.select do |dob| +        if dob.is !=:meta \ +        && dob.is !=:comment \ +        && dob.is !=:code \ +        && dob.is !=:table +          if dob.obj =~/\.:.+?:\./ +            citations << dob.obj.scan(/\.:\s*(.+?)\s*:\./m) +            #short_ref << dob.obj.scan(/\.:\s+(.+?)\s+::([^:]+)::\./m) #look at later +            ##short_ref << dob.obj.scan(/\.:\s+(.+?)\s+::(.+?)::\./m) #look at later +            #short_ref << dob.obj.scan(/\.:\s*(.+?)\s*(::(.+?):)?:\./m) #look at later +            citations=citations.flatten.compact +            dob.obj=dob.obj.   #remove citations delimiter & helpers from text +              gsub(/\.:|:\./,'') +          end +        end +        dob if dob.is_a?(Object) +      end +      #bib=long_and_short_ref?(citations) #could be useful, keep ... extract shortref +      citations=citation_detail(citations) +      [tuned_file,citations] +    end +  end +end +__END__ diff --git a/lib/sisu/develop/ao_syntax.rb b/lib/sisu/develop/ao_syntax.rb index 5782f7d1..4632fb2d 100644 --- a/lib/sisu/develop/ao_syntax.rb +++ b/lib/sisu/develop/ao_syntax.rb @@ -61,8 +61,8 @@ module SiSU_AO_Syntax      end    end    class Markup -    def initialize(md='',data='') -      @md,@data=md,data +    def initialize(md='',data='',biblio=[]) +      @md,@data,@bibliography=md,data,biblio        @data_new=[]        url_and_stub=SiSU_Env::InfoEnv.new.url        @output_url="#{url_and_stub.remote}" @@ -221,6 +221,24 @@ module SiSU_AO_Syntax      end      def substitutions(dob)        dob=dob.dup +      dob=if @md.flag_auto_biblio \ +      and @bibliography.length > 0 +        dob=if dob.is !=:meta \ +        && dob.is !=:heading_insert \ +        && dob.is !=:code \ +        && dob.is !=:comment \ +        && dob.is !=:table +          @bibliography.each do |c| +            if c[:id] and not c[:id].nil? and not c[:id].empty? +              dob.obj=dob.obj.gsub(/#{c[:id]}/mi,c[:short_name]) +            end +          end +          dob +        else dob +        end +        dob +      else dob +      end        dob=if defined? @md.substitution_match_list[:match_and_replace] \        and @md.substitution_match_list[:match_and_replace].is_a?(Array)          dob=if dob.is !=:meta \ diff --git a/lib/sisu/develop/dp.rb b/lib/sisu/develop/dp.rb index 42a51363..f9cd27fa 100644 --- a/lib/sisu/develop/dp.rb +++ b/lib/sisu/develop/dp.rb @@ -897,9 +897,9 @@ module SiSU_Param        @doc={ lv: [] }        @doc[:fns],@doc[:fnb],@doc[:scr_suffix]='','',''        @@publisher='SiSU scribe' -      attr_accessor :make,:env,:path,:file,:fn,:fns,:fno,:fnb,:fnn,:fnt,:fnl,:flv,:fnz,:fnstex,:ocn,:sfx_src,:pdf,:file_type,:dir_out,:dir_tex,:dir_lout,:txt_path,:sisu,:project_details,:ruby_version,:title,:subtitle,:full_title,:html_title,:subtitle_tex,:creator,:classify,:author_home,:author,:author_title,:author_nationality,:authors,:authorship,:translator,:illustrator,:prepared_by,:digitized_by,:subject,:description,:publisher,:current_publisher,:contributor,:date,:date_created,:date_issued,:date_available,:date_valid,:date_modified,:date_translated,:date_added_to_site,:date_scheme,:date_created_scheme,:date_issued_scheme,:date_available_scheme,:date_valid_scheme,:date_modified_scheme,:type,:format,:identifier,:source,:language,:language_original,:relation,:coverage,:rights,:keywords,:comments,:abstract,:cls_loc,:cls_dewey,:cls_pg,:cls_isbn,:papersize,:papersize_array,:toc,:lv0,:lv1,:lv2,:lv3,:lv4,:lv5,:lv6,:lvs,:pagenew,:pagebreak,:pageline,:num_top,:bold_match_list,:italics_match_list,:substitution_match_list,:emphasis_set_to,:toc_lev_limit,:flag_endnotes,:flag_auto_endnotes,:flag_separate_endnotes,:flag_separate_endnotes_make,:markup,:markup_instruction,:flag_tables,:vocabulary,:doc_css,:yaml,:lnk,:links,:prefix_a,:prefix_b,:suffix,:information,:contact,:icon,:image,:ad_url,:ad_png,:ad_alt,:ad_began,:flag_promo,:promo,:ad_home,:stmp,:stmpd,:sc_filename,:sc_number,:sc_date,:sc_time,:sc_info,:yamladdr,:locale,:wc_lines,:wc_words,:wc_bytes,:file_encoding,:filesize,:user,:home,:hostname,:pwd,:firstseg,:programs,:author_copymark,:i18n,:lang,:lang_code_insert,:en,:notes,:dgst,:generated,:tags,:tag_array,:concord_make,:seg_names,:seg_autoname_safe,:set_header_title,:set_heading_top,:set_heading_seg,:heading_seg_first,:heading_seg_first_flag,:base_program,:ec,:opt,:sem_tag,:book_idx,:topic_register,:topic_register_array,:original,:writing_focus,:audio,:daisy,:home_button_image,:home_button_links,:footer_links,:cover_image,:man_section +      attr_accessor :make,:env,:path,:file,:fn,:fns,:fno,:fnb,:fnn,:fnt,:fnl,:flv,:fnz,:fnstex,:ocn,:sfx_src,:pdf,:file_type,:dir_out,:dir_tex,:dir_lout,:txt_path,:sisu,:project_details,:ruby_version,:title,:subtitle,:full_title,:html_title,:subtitle_tex,:creator,:classify,:author_home,:author,:author_title,:author_nationality,:authors,:authorship,:translator,:illustrator,:prepared_by,:digitized_by,:subject,:description,:publisher,:current_publisher,:contributor,:date,:date_created,:date_issued,:date_available,:date_valid,:date_modified,:date_translated,:date_added_to_site,:date_scheme,:date_created_scheme,:date_issued_scheme,:date_available_scheme,:date_valid_scheme,:date_modified_scheme,:type,:format,:identifier,:source,:language,:language_original,:relation,:coverage,:rights,:keywords,:comments,:abstract,:cls_loc,:cls_dewey,:cls_pg,:cls_isbn,:papersize,:papersize_array,:toc,:lv0,:lv1,:lv2,:lv3,:lv4,:lv5,:lv6,:lvs,:pagenew,:pagebreak,:pageline,:num_top,:bold_match_list,:italics_match_list,:substitution_match_list,:emphasis_set_to,:toc_lev_limit,:flag_biblio,:flag_auto_biblio,:flag_endnotes,:flag_auto_endnotes,:flag_separate_endnotes,:flag_separate_endnotes_make,:markup,:markup_instruction,:flag_tables,:vocabulary,:doc_css,:yaml,:lnk,:links,:prefix_a,:prefix_b,:suffix,:information,:contact,:icon,:image,:ad_url,:ad_png,:ad_alt,:ad_began,:flag_promo,:promo,:ad_home,:stmp,:stmpd,:sc_filename,:sc_number,:sc_date,:sc_time,:sc_info,:yamladdr,:locale,:wc_lines,:wc_words,:wc_bytes,:file_encoding,:filesize,:user,:home,:hostname,:pwd,:firstseg,:programs,:author_copymark,:i18n,:lang,:lang_code_insert,:en,:notes,:dgst,:generated,:tags,:tag_array,:concord_make,:seg_names,:seg_autoname_safe,:set_header_title,:set_heading_top,:set_heading_seg,:heading_seg_first,:heading_seg_first_flag,:base_program,:ec,:opt,:sem_tag,:book_idx,:topic_register,:topic_register_array,:original,:writing_focus,:audio,:daisy,:home_button_image,:home_button_links,:footer_links,:cover_image,:man_section        def initialize(fns_array,opt) -        @env=@path,@file=@fn=@fns=@fno=@fnb=@fnn=@fnt=@fnl=@flv=@fnz=@fnstex=@ocn=@sfx_src=@pdf=@file_type=@dir_out=@dir_tex=@dir_lout=@txt_path=@make=@flag_endnotes=@flag_auto_endnotes=@flag_separate_endnotes=@flag_separate_endnotes_make=@sisu=@project_details=@ruby_version=@title=@subtitle=@full_title=@html_title=@subtitle_tex=@creator=@classify=@author_home=@author=@author_title=@author_nationality=@translator=@illustrator=@prepared_by=@digitized_by=@subject=@description=@publisher=@current_publisher=@contributor=@date=@date_created=@date_issued=@date_available=@date_valid=@date_modified=@date_translated=@date_added_to_site=@date_scheme=@date_created_scheme=@date_issued_scheme=@date_available_scheme=@date_valid_scheme=@date_modified_scheme=@type=@format=@identifier=@source=@language=@language_original=@relation=@coverage=@rights=@keywords=@comments=@abstract=@cls_loc=@cls_dewey=@cls_pg=@cls_isbn=@papersize=@toc=@lv0=@lv1=@lv2=@lv3=@lv4=@lv5=@lv6=@pagenew=@pagebreak=@pageline=@num_top=@bold_match_list=@italics_match_list=@substitution_match_list=@emphasis_set_to=@toc_lev_limit=@flag_tables=@vocabulary=@doc_css=@yaml=@lnk=@links=@prefix_a=@prefix_b=@suffix=@information=@contact=@icon=@ad_url=@ad_png=@ad_alt=@ad_began=@promo=@ad_home=@stmp=@stmpd=@sc_filename=@sc_number=@sc_date=@sc_time=@sc_info=@yamladdr=@locale=@wc_lines=@wc_words=@wc_bytes=@file_encoding=@filesize=@firstseg=@programs=@author_copymark=@i18n=@lang=@lang_code_insert=@en=@notes=@dgst=@generated=@heading_seg_first=@base_program=@topic_register=@original=@writing_focus=@audio=@home_button_image=@home_button_links=@cover_image=@man_section=nil +        @env=@path,@file=@fn=@fns=@fno=@fnb=@fnn=@fnt=@fnl=@flv=@fnz=@fnstex=@ocn=@sfx_src=@pdf=@file_type=@dir_out=@dir_tex=@dir_lout=@txt_path=@make=@flag_biblio=@flag_auto_biblio=@flag_endnotes=@flag_auto_endnotes=@flag_separate_endnotes=@flag_separate_endnotes_make=@sisu=@project_details=@ruby_version=@title=@subtitle=@full_title=@html_title=@subtitle_tex=@creator=@classify=@author_home=@author=@author_title=@author_nationality=@translator=@illustrator=@prepared_by=@digitized_by=@subject=@description=@publisher=@current_publisher=@contributor=@date=@date_created=@date_issued=@date_available=@date_valid=@date_modified=@date_translated=@date_added_to_site=@date_scheme=@date_created_scheme=@date_issued_scheme=@date_available_scheme=@date_valid_scheme=@date_modified_scheme=@type=@format=@identifier=@source=@language=@language_original=@relation=@coverage=@rights=@keywords=@comments=@abstract=@cls_loc=@cls_dewey=@cls_pg=@cls_isbn=@papersize=@toc=@lv0=@lv1=@lv2=@lv3=@lv4=@lv5=@lv6=@pagenew=@pagebreak=@pageline=@num_top=@bold_match_list=@italics_match_list=@substitution_match_list=@emphasis_set_to=@toc_lev_limit=@flag_tables=@vocabulary=@doc_css=@yaml=@lnk=@links=@prefix_a=@prefix_b=@suffix=@information=@contact=@icon=@ad_url=@ad_png=@ad_alt=@ad_began=@promo=@ad_home=@stmp=@stmpd=@sc_filename=@sc_number=@sc_date=@sc_time=@sc_info=@yamladdr=@locale=@wc_lines=@wc_words=@wc_bytes=@file_encoding=@filesize=@firstseg=@programs=@author_copymark=@i18n=@lang=@lang_code_insert=@en=@notes=@dgst=@generated=@heading_seg_first=@base_program=@topic_register=@original=@writing_focus=@audio=@home_button_image=@home_button_links=@cover_image=@man_section=nil          @data,      @path,  @fns,   @fno,   @opt=            fns_array,opt.pth,opt.fns,opt.fno,opt #@data used as data          @flag_tables,@set_header_title,@set_heading_top,@set_heading_seg,@heading_seg_first_flag,@flag_promo,@book_idx= @@ -1014,6 +1014,7 @@ module SiSU_Param            @fnstex=@fns.gsub(/_/,'\_\-').gsub(/\./,'.\-')            @flag_endnotes,@flag_auto_endnotes,@flag_separate_endnotes=false,false,false            @flag_separate_endnotes_make=true +          @flag_biblio,@flag_auto_biblio=false,false            ver=SiSU_Env::InfoVersion.instance            @project_details=ver.get_version            @ruby_version=ver.rbversion @@ -1021,15 +1022,27 @@ module SiSU_Param            fns_array=@data.dup            skip unless fns_array                                                    # consider            @code_flag=false +          flag_code_curly=:not_code_curly +          flag_code_tics=:not_code_tics            fns_array.each do |para|                                               #% scan document              if para !~/^%+\s/ \              and para =~/<![abcdeghijklmnopqrstuvwxyz]/i # <!f not included                raise "Old markup style in file #{@fns}, current version #{@project_details.project} #{@project_details.version} #{@project_details.date_stamp} #{@project_details.date}:\n\t\t#{para}\n\n"              end -            @code_flag=case para -            when /^code\{\s*$/ then true -            when /^\}code\s*$/ then false -            else                    @code_flag +            if para =~/^code\{/ +              flag_code_curly=:code_curly +            elsif para =~/^\}code/ +              flag_code_curly=:not_code_curly +            elsif para =~/^``` code/ +              flag_code_tics=:code_tics +            elsif flag_code_tics ==:code_tics \ +            and para =~/^```/ +              flag_code_tics=:not_code_tics +            end +            @code_flag=if flag_code_curly==:code_curly \ +            or flag_code_tics==:code_tics +              true +            else false              end              regx_header=/^@\S+?:[+-]?\s/              if para =~regx_header \ @@ -1202,6 +1215,16 @@ module SiSU_Param                    %{#{title}#{creator}}                  ).txt_grey if @opt.act[:verbose][:set]==:on                end +              unless @code_flag +                if para =~/^1~biblio(?:graphy)?/ +                  @flag_auto_biblio,@flag_biblio=false,true +                  #@flag_biblio=true +                elsif @flag_biblio ==true \ +                and @flag_auto_biblio ==false \ +                and para =~/^(?:au|author):/m +                  @flag_auto_biblio =true +                end +              end                if not @book_idx \                and para =~/^=\{(.+?)\}[\s`]*\Z/m                  @book_idx=true | 
