d: bibliography marked up section of citations & metadata
authorRalph Amissah <ralph@amissah.com>
Fri, 20 Mar 2015 03:47:17 +0000 (23:47 -0400)
committerRalph Amissah <ralph@amissah.com>
Tue, 24 Mar 2015 01:46:12 +0000 (21:46 -0400)
* 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)

data/doc/sisu/CHANGELOG_v6
lib/sisu/develop/ao.rb
lib/sisu/develop/ao_doc_str.rb
lib/sisu/develop/ao_references.rb [new file with mode: 0644]
lib/sisu/develop/ao_syntax.rb
lib/sisu/develop/dp.rb

index e51e0883aeaef51421579b59ab84c47f90c2180b..06eb36187ef8c53605a43b217a9514877cde0ee5 100644 (file)
@@ -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)
index ed3aa98bfc87091e196acc257cbf3f42f1c5ce7e..0ac6f5025ca74796be8c6b54919a8af6039e5a0f 100644 (file)
@@ -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
index c5f39ed407c81da9a28a4fa26e1a2615624b1211..353469ec37ba0bb82f993aa0ac6a805ef8a5d677 100644 (file)
@@ -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 (file)
index 0000000..5ef94c6
--- /dev/null
@@ -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__
index 5782f7d13adcab536b86dc3fdf3d9d86d06eab71..4632fb2d1c445462bd6eb22469d6b33808598230 100644 (file)
@@ -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 \
index 42a51363057ec699aec0bd3bc3964b9265fdf765..f9cd27fa83b34b2bf27ffb152480bfcc00f797a7 100644 (file)
@@ -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