From c606ff1aa086b87b27375e6056affb641bb88c77 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Mon, 11 May 2015 18:59:14 -0400
Subject: ao_references, fix

---
 lib/sisu/ao_references.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'lib')

diff --git a/lib/sisu/ao_references.rb b/lib/sisu/ao_references.rb
index cd410f77..18b726f8 100644
--- a/lib/sisu/ao_references.rb
+++ b/lib/sisu/ao_references.rb
@@ -192,7 +192,7 @@ module SiSU_AO_References
             author.gsub(/(.+?),\s+(.+)/,'\2 \1').strip
           end.join(', ').strip
           unless citation[:short_name]
-            citation[:short_name]=%{#{c[:author]}, "#{c[:short_name]}" (#{c[:date]})}
+            citation[:short_name]=%{#{citation[:author]}, "#{citation[:short_name]}" (#{citation[:date]})}
           end
         end
         citation
-- 
cgit v1.2.3


From 40b83047b2a77998354188dabca8ad352b17d45f Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Mon, 11 May 2015 18:56:20 -0400
Subject: appendices: bibliography & glossary, worked on

* bibliography & glossary make activated by markup headers
  1~!biblio & 1~!glossary
* bibliography tags altered
  (introduced in 5.8.0 v6 project dir branch)
* version bump for change in behavior
---
 lib/sisu/ao.rb            |  20 +-
 lib/sisu/ao_appendices.rb | 624 ++++++++++++++++++++++++++++++++++++++++++++++
 lib/sisu/ao_doc_str.rb    |  77 ++++--
 lib/sisu/ao_references.rb | 502 -------------------------------------
 lib/sisu/dp.rb            |  10 +-
 lib/sisu/html_format.rb   |   2 +-
 6 files changed, 692 insertions(+), 543 deletions(-)
 create mode 100644 lib/sisu/ao_appendices.rb
 delete mode 100644 lib/sisu/ao_references.rb

(limited to 'lib')

diff --git a/lib/sisu/ao.rb b/lib/sisu/ao.rb
index 3e5f506e..c4266b06 100644
--- a/lib/sisu/ao.rb
+++ b/lib/sisu/ao.rb
@@ -64,7 +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_appendices'                      # ao_appendices.rb
   require_relative 'ao_idx'                             # ao_idx.rb
   require_relative 'ao_numbering'                       # ao_numbering.rb
   require_relative 'ao_hash_digest'                     # ao_hash_digest.rb
@@ -534,38 +534,38 @@ module SiSU_AO
       reset
       data_txt=@data
       data_txt=
-        SiSU_AO_Insertions::Insertions.new(@md,data_txt).            # ao_expand_insertions.rb
+        SiSU_AO_Insertions::Insertions.new(@md,data_txt).                  # ao_expand_insertions.rb
           expand_insertions?
       data_txt=
-        SiSU_AO_MiscArrangeText::SI.new(@md,data_txt).               # ao_misc_arrange.rb
+        SiSU_AO_MiscArrangeText::SI.new(@md,data_txt).                     # ao_misc_arrange.rb
           prepare_text
       data_obj,
         metadata,
         bibliography=
-          SiSU_AO_DocumentStructureExtract::Build.new(@md,data_txt). # ao_doc_str.rb
+          SiSU_AO_DocumentStructureExtract::Build.new(@md,data_txt).       # ao_doc_str.rb
             identify_parts
       data_obj=
-        SiSU_AO_Syntax::Markup.new(@md,data_obj,bibliography).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
+          SiSU_AO_CharacterCheck::Check.new(data_obj).                     # ao_character_check.rb
             character_check_and_oldstyle_endnote_array
       data_obj=
-         SiSU_AO_Images::Images.new(@md,data_obj).images             # ao_images.rb
+         SiSU_AO_Images::Images.new(@md,data_obj).images                   # ao_images.rb
       data_obj,
         tags_map,
         ocn_html_seg_map=
-          SiSU_AO_Numbering::Numbering.new(@md,data_obj,@fnx,@process). # ao_numbering.rb
+          SiSU_AO_Numbering::Numbering.new(@md,data_obj,@fnx,@process).    # ao_numbering.rb
             numbering_song
       data_obj,
         book_index_rel,
         book_index_rel_html_seg,
         html_idx,
         xhtml_idx=
-          SiSU_AO_BookIndex::BookIndex.new(@md,data_obj,@env).       # ao_idx.rb
+          SiSU_AO_BookIndex::BookIndex.new(@md,data_obj,@env).             # ao_idx.rb
             indexing_song if @md.book_idx
       data_obj=
-        SiSU_AO_Endnotes::Endnotes.new(@md,data_obj,endnote_array).  # ao_endnotes.rb
+        SiSU_AO_Endnotes::Endnotes.new(@md,data_obj,endnote_array).        # ao_endnotes.rb
           endnotes
       outputdata=data_obj
       if (@md.opt.act[:ao][:set]==:on \
diff --git a/lib/sisu/ao_appendices.rb b/lib/sisu/ao_appendices.rb
new file mode 100644
index 00000000..809f53f8
--- /dev/null
+++ b/lib/sisu/ao_appendices.rb
@@ -0,0 +1,624 @@
+# 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/ao_appendices.rb;hb=HEAD>
+
+=end
+module SiSU_AO_Appendices
+  class Glossary
+    def initialize(md,data)
+      @md,@data=md,data
+    end
+    def glossary_extraction
+      glossary=[]
+      glossaryflag=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_glossary
+            if t_o =~/^1~!glossary/
+              glossaryflag = true
+              next
+            elsif t_o =~/^:?[B-D]~/
+              next
+            elsif t_o =~/^:?[B-D1]~/
+              glossaryflag = false
+              t_o
+            elsif glossaryflag
+              if t_o !~/\A%+ /
+                glossary << t_o
+                next
+              else
+                t_o
+              end
+            else t_o
+            end
+          else t_o
+          end
+        else t_o
+        end
+      end.compact
+      [@data,glossary]
+    end
+  end
+  class Bibliography
+    def initialize(md,data)
+      @md,@data=md,data
+    end
+    def sort_bibliography_array_by_deemed_author_year_title(bib)
+      if bib
+        bib.compact.sort_by do |c|
+          [c[:deemed_author],c[:ymd],c[:title]]
+        end
+      end
+    end
+    def citation_in_prepared_bibliography(cite)
+      @cite=cite
+      def generic
+        {
+           is:         nil, # :book, :article, :magazine, :newspaper, :blog, :other
+           author_raw: nil,
+           author:     nil,
+           author_arr: nil,
+           editor_raw: nil,
+           editor:     nil,
+           editor_arr: nil,
+           title:      nil,
+           subtitle:   nil,
+           fulltitle:  nil,
+           language:   nil,
+           trans:      nil,
+           src:        nil,
+           journal:    nil,
+           in:         nil,
+           volume:     nil,
+           edition:    nil,
+           year:       nil,
+           place:      nil,
+           publisher:  nil,
+           url:        nil,
+           pages:      nil,
+           note:       nil,
+          #format:     nil, #consider list of fields arranged with markup
+           short_name: nil,
+           id:         nil,
+        }
+      end
+      def citation_metadata
+        type=:generic
+        if type
+          citation=generic
+          citeblock=@cite.split("\n")
+          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 /^((?:edr?|editor):\s+)\S+/
+              citation[:editor_raw]=/^#{$1}(.+)/.match(meta)[1]
+            when /^((?:tr|trans(:?lator)?):\s+)\S+/
+              citation[:editor_raw]=/^#{$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 /^((?:pl|publisher_state):\s+)\S+/
+              citation[:place]=/^#{$1}(.+)/.match(meta)[1]
+            when /^((?:jo|journal):\s+)\S+/ #req?
+              citation[:journal]=/^#{$1}(.+)/.match(meta)[1]
+            when /^((?:vol?|volume):\s+)\S+/
+              citation[:volume]=/^#{$1}(.+)/.match(meta)[1]
+            when /^((?:in):\s+)\S+/
+              citation[:in]=/^#{$1}(.+)/.match(meta)[1]
+            when /^((?:src):\s+)\S+/
+              citation[:src]=/^#{$1}(.+)/.match(meta)[1]
+            when /^((?:pg|pages?):\s+)\S+/
+              citation[:pages]=/^#{$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+/ # substitution: (/#{id}/,"#{sn}")
+              citation[:short_name]=/^#{$1}(.+)/.match(meta)[1]
+            when /^(id:\s+)\S+/               # substitution: (/#{id}/,"#{sn}")
+              citation[:id]=/^#{$1}(.+)/.match(meta)[1]
+            end
+          end
+          if citation[:subtitle]
+            citation[:fulltitle] = citation[:title] \
+            + ' - ' \
+            + citation[:subtitle]
+          else
+            citation[:fulltitle] = citation[:title]
+          end
+          if citation[:author_raw]
+            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
+          end
+          if citation[:editor_raw]
+            citation[:editor_arr]=citation[:editor_raw].split(/;\s*/)
+            citation[:editor]=citation[:editor_arr].map do |editor|
+              editor.gsub(/(.+?),\s+(.+)/,'\2 \1').strip
+            end.join(', ').strip
+          end
+          citation[:ymd]=if not citation[:year] =~/^[0-9]{4}/
+            '9999'
+          else citation[:year]
+          end
+          citation[:deemed_author]=if not citation[:author_raw] \
+          and citation[:editor_raw]
+            citation[:editor_arr][0]
+          elsif citation[:author_raw]
+            citation[:author_arr][0]
+          else
+            SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).
+              warn('Citation needs an author or editor, title: "' \
+              + citation[:title] + '"')
+            '000'
+          end
+          unless citation[:short_name]
+            citation[:short_name]=%{#{citation[:author]}, "#{citation[:title]}" (#{citation[:date]})}
+          end
+        end
+        citation
+      end
+      self
+    end
+    def biblio_format
+      def generic(c)
+        cite=%{#{c[:author]}. /{"#{c[:fulltitle]}".}/}
+        cite=(c[:journal]) \
+        ? cite + %{ #{c[:journal]},}
+        : cite
+        cite=(c[:source]) \
+        ? cite + %{ #{c[:source]},}
+        : cite
+        cite=(c[:in]) \
+        ? cite + %{ in #{c[:in]},}
+        : cite
+        cite=(c[:volume]) \
+        ? cite + %{ #{c[:volume]},}
+        : cite
+        cite=(c[:trans]) \
+        ? cite + %{ trans. #{c[:trans]},}
+        : cite
+        cite=(c[:editor]) \
+        ? cite + %{ ed. #{c[:editor]},}
+        : cite
+        cite=(c[:place]) \
+        ? cite + %{ #{c[:place]},}
+        : cite
+        cite=(c[:publisher]) \
+        ? cite + %{ #{c[:publisher]},}
+        : cite
+        cite=(c[:year]) \
+        ? cite + %{ (#{c[:year]})}
+        : cite
+        cite=(c[:pages]) \
+        ? cite + %{ #{c[:pages]}}
+        : cite
+        cite=(c[:url]) \
+        ? cite + %{ #{c[:url]}}
+        : cite
+        cite=(c[:note]) \
+        ? cite + %{ #{c[:note]}}
+        : cite
+        cite
+      end
+      def generic_editor(c)
+        cite=%{#{c[:editor]} ed. /{"#{c[:fulltitle]}".}/}
+        cite=(c[:journal]) \
+        ? cite + %{ #{c[:journal]}, }
+        : cite
+        cite=(c[:source]) \
+        ? cite + %{ #{c[:source]}, }
+        : cite
+        cite=(c[:in]) \
+        ? cite + %{ in #{c[:in]},}
+        : cite
+        cite=(c[:volume]) \
+        ? cite + %{ #{c[:volume]},}
+        : cite
+        cite=(c[:trans]) \
+        ? cite + %{ trans. #{c[:trans]},}
+        : cite
+        cite=(c[:place]) \
+        ? cite + %{ #{c[:place]},}
+        : cite
+        cite=(c[:publisher]) \
+        ? cite + %{ #{c[:publisher]}}
+        : cite
+        cite=(c[:year]) \
+        ? cite + %{ (#{c[:year]})}
+        : cite
+        cite=(c[:pages]) \
+        ? cite + %{ #{c[:pages]}}
+        : cite
+        cite=(c[:url]) \
+        ? cite + %{ #{c[:url]}}
+        : cite
+        cite=(c[:note]) \
+        ? cite + %{ #{c[:note]}}
+        : cite
+        cite
+      end
+      self
+    end
+    def biblio_make(cite)
+      if cite[:author]
+        biblio_format.generic(cite)
+      elsif cite[:editor]
+        biblio_format.generic_editor(cite)
+      else
+        biblio_format.generic(cite)
+      end
+    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=[]
+        bib=sort_bibliography_array_by_deemed_author_year_title(bibliography)
+        biblio_done=[]
+        @data.select do |t_o|
+          if t_o =~/^1~!biblio(?:graphy)?/
+            bib.each do |c|
+              d=c
+              d.store(:obj, biblio_make(c))
+              biblio_done << d
+              #biblio_done << { obj: biblio_make(c), id: c[:id] }
+            end
+          else data_new << t_o
+          end
+        end
+        @data=data_new
+      end
+      [@data,biblio_done]
+    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/ao_doc_str.rb b/lib/sisu/ao_doc_str.rb
index 9da488b6..e0034ed5 100644
--- a/lib/sisu/ao_doc_str.rb
+++ b/lib/sisu/ao_doc_str.rb
@@ -1072,7 +1072,13 @@ module SiSU_AO_DocumentStructureExtract
         table:      0,
       }
       @metadata={}
-      @data,bibliography=SiSU_AO_References::Bibliography.new(@md,@data).biblio_extraction
+      if @md.flag_auto_biblio \
+      or @md.flag_biblio
+        @data,bibliography=SiSU_AO_Appendices::Bibliography.new(@md,@data).biblio_extraction
+      end
+      if @md.flag_glossary
+        @data,glossary=SiSU_AO_Appendices::Glossary.new(@md,@data).glossary_extraction
+      end
       tuned_file=extract_structure_loop(@data,tuned_file)
       if @md.flag_endnotes
         tuned_file << @pb
@@ -1095,6 +1101,30 @@ module SiSU_AO_DocumentStructureExtract
           obj: 'Endnotes'
         }
       end
+      if @md.flag_glossary
+        tuned_file << @pb
+        h={
+          ln: 1,
+          lc: 1,
+          obj: 'Glossary',
+          autonum_: false,
+        }
+        tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+        h={
+          ln: 4,
+          lc: 2,
+          obj: 'Glossary',
+          name: 'glossary',
+          autonum_: false,
+        }
+        tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+        h={
+          obj: 'Glossary'
+        }
+        if glossary.length > 0
+          tuned_file=extract_structure_loop(glossary,tuned_file)
+        end
+      end
       if @md.flag_auto_biblio
         tuned_file << @pb
         h={
@@ -1116,27 +1146,17 @@ module SiSU_AO_DocumentStructureExtract
           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
+        bibliography.each do |cite|
+          citenumber +=1 if cite.is_a?(Hash)
+          h={
+            obj: cite[:obj],
+            #obj: %{[#{citenumber}] } + cite[:obj],
+            tags: [cite[:id]],
+            hang: 0,
+            indent: 2,
+            ocn_: false,
+          }
+          tuned_file << SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h)
         end
       elsif @md.flag_biblio
         tuned_file << @pb
@@ -1158,17 +1178,19 @@ module SiSU_AO_DocumentStructureExtract
         h={
           obj: 'Bibliography'
         }
-        if bibliography.length > 0
+        if not bibliography.nil? \
+        and 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
+            SiSU_AO_Appendices::Citations.new(@md,tuned_file).songsheet  # ao_appendices.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]})},
+                obj: %{#{c[:author]}. /{#{c[:publication]}}/ (#{c[:year]})},
+                #obj: %{[#{citenumber}] *{#{c[:author]}}* /{#{c[:publication]}}/ (#{c[:year]})},
                 hang: 0,
                 indent: 2,
                 ocn_: false,
@@ -1176,7 +1198,8 @@ module SiSU_AO_DocumentStructureExtract
               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]})},
+                obj: %{#{c[:author]}. /{"#{c[:title]}"}/ #{c[:publication]} editor #{c[:editor]} (#{c[:year]})},
+                #obj: %{[#{citenumber}] *{#{c[:author]}}* /{"#{c[:title]}"}/ #{c[:publication]} editor #{c[:editor]} (#{c[:year]})},
                 hang: 0,
                 indent: 2,
                 ocn_: false,
@@ -1229,7 +1252,7 @@ module SiSU_AO_DocumentStructureExtract
         obj: 'eof',
       }
       meta=SiSU_AO_DocumentStructure::ObjectMetadata.new.metadata(@metadata)
-      [tuned_file,meta,bibliography]
+      [tuned_file,meta,bibliography,glossary]
     end
     def table_rows_and_columns_array(table_str)
       table=[]
diff --git a/lib/sisu/ao_references.rb b/lib/sisu/ao_references.rb
deleted file mode 100644
index 18b726f8..00000000
--- a/lib/sisu/ao_references.rb
+++ /dev/null
@@ -1,502 +0,0 @@
-# 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/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]=%{#{citation[:author]}, "#{citation[:short_name]}" (#{citation[: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/dp.rb b/lib/sisu/dp.rb
index f3b15e9e..300edc8d 100644
--- a/lib/sisu/dp.rb
+++ b/lib/sisu/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_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
+      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_glossary,: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_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
+        @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_glossary=@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_glossary=false
           @flag_biblio,@flag_auto_biblio=false,false
           ver=SiSU_Env::InfoVersion.instance
           @project_details=ver.get_version
@@ -1216,7 +1217,7 @@ module SiSU_Param
                 ).txt_grey if @opt.act[:verbose][:set]==:on
               end
               unless @code_flag
-                if para =~/^1~biblio(?:graphy)?/
+                if para =~/^1~!biblio(?:graphy)?/
                   @flag_auto_biblio,@flag_biblio=false,true
                   #@flag_biblio=true
                 elsif @flag_biblio ==true \
@@ -1224,6 +1225,9 @@ module SiSU_Param
                 and para =~/^(?:au|author):/m
                   @flag_auto_biblio =true
                 end
+                if para =~/^1~!glossary/
+                  @flag_glossary=true
+                end
               end
               if not @book_idx \
               and para =~/^=\{(.+?)\}[\s`]*\Z/m
diff --git a/lib/sisu/html_format.rb b/lib/sisu/html_format.rb
index b5726626..54edac82 100644
--- a/lib/sisu/html_format.rb
+++ b/lib/sisu/html_format.rb
@@ -883,7 +883,7 @@ WOK
       tags=''
       if defined? dob.tags \
       and dob.tags.length > 0 # insert tags "hypertargets"
-        dob.tags.each do |t|
+        dob.tags.compact.each do |t| # .compact hides a problem, nil should not occur fix (upstream)
           t=t.gsub(/[^a-z0-9._-]/,'') #use for all html tags? consider limiting to strict? or implementing earlier
           tags=(t =~/^[0-9.]+$/) \
           ? tags             #check what can be sorted in ao
-- 
cgit v1.2.3