diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sisu/constants.rb | 1 | ||||
| -rw-r--r-- | lib/sisu/hub.rb | 3 | ||||
| -rw-r--r-- | lib/sisu/hub_actions.rb | 16 | ||||
| -rw-r--r-- | lib/sisu/hub_options.rb | 9 | ||||
| -rw-r--r-- | lib/sisu/json.rb | 415 | ||||
| -rw-r--r-- | lib/sisu/json_format.rb | 478 | ||||
| -rw-r--r-- | lib/sisu/json_parts.rb | 88 | ||||
| -rw-r--r-- | lib/sisu/json_persist.rb | 124 | ||||
| -rw-r--r-- | lib/sisu/json_shared.rb | 681 | ||||
| -rw-r--r-- | lib/sisu/se_file_op.rb | 59 | ||||
| -rw-r--r-- | lib/sisu/shared_metadata.rb | 12 | ||||
| -rw-r--r-- | lib/sisu/urls.rb | 13 | 
12 files changed, 1898 insertions, 1 deletions
| diff --git a/lib/sisu/constants.rb b/lib/sisu/constants.rb index 363bab77..1c126201 100644 --- a/lib/sisu/constants.rb +++ b/lib/sisu/constants.rb @@ -76,6 +76,7 @@ Sfx={    epub:                      '.epub',    epub_xhtml:                '.xhtml',    odt:                       '.odt', +  json:                      '.json',    pdf:                       '.pdf',    manpage:                   '.1',    info:                      '.info', diff --git a/lib/sisu/hub.rb b/lib/sisu/hub.rb index c5bd0ced..49d569a5 100644 --- a/lib/sisu/hub.rb +++ b/lib/sisu/hub.rb @@ -129,6 +129,7 @@ module SiSU        actions.outputs.each_file.html?        actions.outputs.each_file.xhtml?        actions.outputs.each_file.xml? +      actions.outputs.each_file.json?        actions.outputs.each_file.pdf?        actions.outputs.each_file.man_or_info?        actions.outputs.each_file.po4a_make? @@ -260,7 +261,7 @@ module SiSU        ensure          if FileTest.directory?(env.processing_path.processing) \          and FileTest.directory?(env.processing_path.processing_base_tmp) \ -        and env.processing_path.processing_base_tmp =~/#{env.processing_path.processing}/ \ +        and env.processing_path.processing_base_tmp =~ /#{env.processing_path.processing}/ \          and env.processing_path.processing_base_tmp =~/^\/tmp\/\S+/ \          and not argv.inspect =~/"--maintenance"|"-M"/            FileUtils::cd(env.processing_path.processing_base_tmp) do diff --git a/lib/sisu/hub_actions.rb b/lib/sisu/hub_actions.rb index 52ad9da6..a946591d 100644 --- a/lib/sisu/hub_actions.rb +++ b/lib/sisu/hub_actions.rb @@ -382,6 +382,22 @@ module SiSU_Hub_Actions              end            end          end +        def json? +          if @opt.act[:json][:set]==:on                 #% --js, -J +            if @opt.f_pths.length > 0 +              require_relative 'json'                   # json.rb +              SiSU_JSON::Source.new(@opt).read +            else +              msg='json request requires sisu markup files' +              if (@opt.act[:verbose_plus][:set]==:on \ +              || @opt.act[:maintenance][:set]==:on) +                SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:yellow). +                  mark(msg) +              else puts msg +              end +            end +          end +        end          def xhtml?            if @opt.act[:xhtml][:set]==:on                 #% --xhtml, -b              if @opt.f_pths.length > 0 diff --git a/lib/sisu/hub_options.rb b/lib/sisu/hub_options.rb index 0794dffb..e0832553 100644 --- a/lib/sisu/hub_options.rb +++ b/lib/sisu/hub_options.rb @@ -636,6 +636,9 @@ module SiSU_Commandline            if ch =~/j/ then select_arr << '--images'              ch=ch.gsub(/[j]/,'')            end +          if ch =~/J/ then select_arr << '--json' +            ch=ch.gsub(/[J]/,'') +          end            if ch =~/N/ then select_arr << '--digests'              ch=ch.gsub(/[N]/,'')            end @@ -1022,6 +1025,10 @@ module SiSU_Commandline          =~/"--images"/) \          ? { bool: true, set: :on }          : { bool: false, set: :na } +        act[:json]=(select_arr.inspect \ +        =~/"--json"/) \ +        ? { bool: true, set: :on } +        : { bool: false, set: :na }          if select_arr.inspect \          =~/"--pdf"/            if select_arr.inspect \ @@ -1488,6 +1495,7 @@ module SiSU_Commandline          || act[:html][:set]==:on \          || act[:html_seg][:set]==:on \          || act[:html_scroll][:set]==:on \ +        || act[:json][:set]==:on \          || act[:texinfo][:set]==:on \          || act[:manpage][:set]==:on \          || act[:hash_digests][:set]==:on \ @@ -1538,6 +1546,7 @@ module SiSU_Commandline          || act[:html][:set]==:on \          || act[:html_seg][:set]==:on \          || act[:html_scroll][:set]==:on \ +        || act[:json][:set]==:on \          || act[:texinfo][:set]==:on \          || act[:manpage][:set]==:on \          || act[:hash_digests][:set]==:on \ diff --git a/lib/sisu/json.rb b/lib/sisu/json.rb new file mode 100644 index 00000000..d491a9e4 --- /dev/null +++ b/lib/sisu/json.rb @@ -0,0 +1,415 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** Description: json output logic, flow + +** 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, 2016 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] + +** 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/json.rb;hb=HEAD] + +=end +module SiSU_JSON +  require_relative 'se_hub_particulars'                 # se_hub_particulars.rb +    include SiSU_Particulars +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  require_relative 'json_shared'                        # json_shared.rb +    include SiSU_JSON_Munge +  require_relative 'json_format'                        # json_format.rb +    include SiSU_JSON_Format +  require_relative 'json_persist'                       # json_persist.rb +  require_relative 'shared_metadata'                    # shared_metadata.rb +  @@alt_id_count=0 +  @@tablefoot='' +  class Source +    def initialize(opt) +      @opt=opt +      @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt) +    end +    def read +      begin +        @env,@md,@ao_array=@particulars.env,@particulars.md,@particulars.ao_array +        unless @opt.act[:quiet][:set]==:on +          tool=if (@opt.act[:verbose_plus][:set]==:on \ +          || @opt.act[:maintenance][:set]==:on) +            @env.program.web_browser + +            ' file://' + +            @md.file.output_path.json.dir + '/' + +            @md.file.base_filename.json +          elsif @opt.act[:verbose][:set]==:on +            @env.program.web_browser + +            ' file://' + +            @md.file.output_path.json.dir + '/' + +            @md.file.base_filename.json +          else "[#{@opt.f_pth[:lng_is]}] #{@opt.fno}" +          end +          (@opt.act[:verbose][:set]==:on \ +          || @opt.act[:verbose_plus][:set]==:on \ +          || @opt.act[:maintenance][:set]==:on) \ +          ? SiSU_Screen::Ansi.new( +              @opt.act[:color_state][:set], +              'JSON', +              tool +            ).green_hi_blue +          : SiSU_Screen::Ansi.new( +              @opt.act[:color_state][:set], +              'JSON', +              tool +            ).green_title_hi +          if (@opt.act[:verbose_plus][:set]==:on \ +          || @opt.act[:maintenance][:set]==:on) +            SiSU_Screen::Ansi.new( +              @opt.act[:color_state][:set], +              @opt.fns, +                '/' + @md.file.output_path.json.dir + +                '/' + @md.file.base_filename.json +            ).flow +          end +        end +        SiSU_JSON::Source::Songsheet.new(@particulars).song +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +        SiSU_Env::CreateSite.new(@opt).cp_css +        Dir.chdir(@opt.f_pth[:pth]) +      end +    end +    private +    class Songsheet +      def initialize(particulars) +        @env,@md,@ao_array,@particulars= +          particulars.env,particulars.md,particulars.ao_array,particulars +        @file=SiSU_Env::FileOp.new(@md) +      end +      def song +        begin +          SiSU_JSON::Source::Scroll.new(@particulars).songsheet +        rescue +          SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do +            __LINE__.to_s + ':' + __FILE__ +          end +        ensure +        end +      end +    end +    class Scroll +      require_relative 'json_shared'                   # json_shared.rb #check already called +      require_relative 'txt_shared'                     # txt_shared.rb +        include SiSU_TextUtils +      require_relative 'css'                            # css.rb +      def initialize(particulars) +        @env,@md,@ao_array=particulars.env,particulars.md,particulars.ao_array +        @tab="\t" +        @trans=SiSU_JSON_Munge::Trans.new(@md) +        @sys=SiSU_Env::SystemCall.new +        @per=SiSU_JSON_Persist::Persist.new +      end +      def songsheet +        begin +          pre +          @data=markup(@ao_array) +          post +          publish +        ensure +          SiSU_JSON_Persist::Persist.new.persist_init +        end +      end +    protected +      def embedded_endnotes(dob='') +        dob.obj=dob.obj.gsub(/#{Mx[:en_a_o]}(\d+)\s+(.+?)#{Mx[:en_a_c]}/, +            '<endnote><number>\1</number><note>\2</note></endnote> '). +          gsub(/#{Mx[:en_b_o]}([*+]\d+)\s+(.+?)#{Mx[:en_b_c]}/, +            '<endnote><symbol>\1</symbol><note>\2</note></endnote> '). +          gsub(/#{Mx[:en_a_o]}([*+]+)\s+(.+?)#{Mx[:en_a_c]}/, +            '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') +      end +      def extract_endnotes(dob='') +        notes=dob.obj.scan(/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})([\d*+]+\s+.+?)(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/) +        notes.flatten.each do |e| +          s=e.to_s +          util=SiSU_JSONutils::Clean.new(s) +          wrap=util.line_json_clean +          wrap=wrap.gsub(/^(\d+)\s+(.+?)\s*\Z/m, <<-WOK +\\n[\\1.] \\2 +              WOK +            ). +            gsub(/^([*+]\d+)\s+(.+?)\s*\Z/m, <<-WOK +\\n[\\1.] \\2 +              WOK +            ). +            gsub(/^([*+]+)\s+(.+?)\s*\Z/m, <<-WOK +\\n[\\1.] \\2 +              WOK +            ).strip +#KEEP alternative presentation of endnotes +#        wrap=wrap.gsub(/^(\d+)\s+(.+?)\s*\Z/m, <<WOK +##{Ax[:tab]*1}<p class="endnote" notenumber="\\1"> +##{Ax[:tab]*2}\\1. \\2 +##{Ax[:tab]*1}</p> +#WOK +#) +          @endnotes << wrap +        end +      end +      def json_head +        #metadata=SiSU_Metadata::Summary.new(@md).json.metadata +        #@per.head << metadata +      end +      def name_tags(dob) +        tags='' +        if defined? dob.tags \ +        and dob.tags.length > 0 # insert tags "hypertargets" +          dob.tags.each do |t| +            tags=tags << %{<named id="#{t}" />} +          end +        end +        tags +      end +      def json_structure(dob,attrib=nil) +        if dob.is ==:para \ +        || dob.is ==:heading +          if dob.is==:heading +            lv=dob.ln +            dob.ln + 2 +          else lv=nil +          end +          extract_endnotes(dob) +          dob.obj=dob.obj. +            gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'<en>\1</en>'). #footnote/endnote clean +            gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'<en>\1</en>') +          util=SiSU_JSONutils::Clean.new(dob.obj) +          wrapped=util.line_json_clean +          @per.body << Ax[:tab]*1 + '{' +          if defined? dob.ocn and dob.ocn +            @per.body << Ax[:tab]*2 + '"ocn": ' + dob.ocn.to_s + '",' +          end +          if lv                                                                 # main text, contents, body KEEP +            @per.body << +              Ax[:tab]*2 + %{"object": "<h#{lv}>} + wrapped + %{</h#{lv}>} + +              ((@endnotes.length > 0) ? '",' : '"') +          else +            @per.body << +              Ax[:tab]*2 + '"object": "' + wrapped + +              ((@endnotes.length > 0) ? '",' : '"') +          end +          if @endnotes.length > 0                                               # main text, endnotes KEEP +            @per.body << +              Ax[:tab]*2 + '"endnotes": "' + +              @endnotes.compact.join.strip + '"' +          end +          @per.body << Ax[:tab]*1 + '},' # unless is last object then '}' +          @endnotes=[] +        end +      end +      def block_structure(dob) +        dob=@trans.markup_block(dob) +        dob.obj=dob.obj.strip. +          gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'<en>\1</en>'). #footnote/endnote clean +          gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'<en>\1</en>') #footnote/endnote clean +        @per.body << Ax[:tab]*1 + '{' +        if defined? dob.ocn and dob.ocn +          @per.body << Ax[:tab]*2 + '"ocn": ' + dob.ocn.to_s + '",' +        end +        @per.body << +          Ax[:tab]*2 + '"object": "' + dob.obj + '"' +          #((@endnotes.length > 0) ? '",' : '"') +        @per.body << Ax[:tab]*1 + '},' # unless is last object then '}' +      end +      def group_structure(dob) +        dob=@trans.markup_group(dob) +        dob.obj=dob.obj.strip. +          gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'<en>\1</en>'). #footnote/endnote clean +          gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'<en>\1</en>') #footnote/endnote clean +        @per.body << Ax[:tab]*1 + '{' +        if defined? dob.ocn and dob.ocn +          @per.body << Ax[:tab]*2 + '"ocn": ' + dob.ocn.to_s + '",' +        end +        @per.body << +          Ax[:tab]*2 + '"object": "' + dob.obj + '"' +          #((@endnotes.length > 0) ? '",' : '"') +        @per.body << Ax[:tab]*1 + '},' # unless is last object then '}' +      end +      def poem_structure(dob) +        dob=@trans.markup_group(dob) +        dob.obj=dob.obj.strip +        @per.body << Ax[:tab]*1 + '{' +        if defined? dob.ocn and dob.ocn +          @per.body << Ax[:tab]*2 + '"ocn": ' + dob.ocn.to_s + '",' +        end +        @per.body << +          Ax[:tab]*2 + '"object": "' + dob.obj + '"' +          #((@endnotes.length > 0) ? '",' : '"') +        @per.body << Ax[:tab]*1 + '},' # unless is last object then '}' +      end +      def code_structure(dob) +        dob=@trans.markup_group(dob) +        dob.obj=dob.obj.gsub(/\s\s/,'  ').strip +        @per.body << Ax[:tab]*1 + '{' +        if defined? dob.ocn and dob.ocn +          @per.body << Ax[:tab]*2 + '"ocn": ' + dob.ocn.to_s + '",' +        end +        @per.body << +          Ax[:tab]*2 + '"object": "' + dob.obj + '"' +          #((@endnotes.length > 0) ? '",' : '"') +        @per.body << Ax[:tab]*1 + '},' # unless is last object then '}' +      end +      def table_structure(dob) +        table=SiSU_JSON_Shared::TableJSON.new(dob) +        @per.body << Ax[:tab]*1 + '{' +        if defined? dob.ocn and dob.ocn +          @per.body << Ax[:tab]*2 + '"ocn": ' + dob.ocn.to_s + '",' +        end +        @per.body << +          Ax[:tab]*2 + '"object": "' + table.table.obj + '"' +        #((@endnotes.length > 0) ? '",' : '"') +        @per.body << Ax[:tab]*1 + '},' # unless is last object then '}' +      end +      def markup(data) +        @endnotes=[] +        @rcdc=false +        @level,@cont,@copen,@json_contents_close=[],[],[],[] +        json_head +        (0..7).each { |x| @cont[x]=@level[x]=false } +        (4..7).each { |x| @json_contents_close[x]='' } +        data.each_with_index do |dob,i| +          dob=@trans.char_enc.utf8(dob) if @sys.locale =~/utf-?8/i #% utf8 +          dob=@trans.markup(dob) +          if @rcdc==false \ +          and (dob.obj =~/~meta/ \ +          and dob.obj =~/Document Information/) +            @rcdc=true +          end +          if dob.obj !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/ +            if not @rcdc +              x=SiSU_JSON_Format::FormatTextObject.new(@md,dob) +              if dob.is==:heading +                json_structure(dob) +                dob.obj=case dob.ln +                when 0 then x.heading_body0 +                when 1 then x.heading_body1 +                when 2 then x.heading_body2 +                when 3 then x.heading_body3 +                when 4 then x.heading_body4 +                when 5 then x.heading_body5 +                when 6 then x.heading_body6 +                when 7 then x.heading_body7 +                end +              else +                if dob.is ==:verse +                  poem_structure(dob) +                elsif dob.is ==:group +                  group_structure(dob) +                elsif dob.is ==:block +                  block_structure(dob) +                elsif dob.is ==:code +                  code_structure(dob) +                elsif dob.is ==:table +                  table_structure(dob) +                elsif dob.is ==:para \ +                and dob.indent.to_s =~/[1-9]/ \ +                and dob.bullet_==true +                  json_structure(dob,"indent_bullet#{dob.indent}") +                elsif dob.is ==:para \ +                and dob.indent.to_s =~/[1-9]/ \ +                and dob.indent == dob.hang +                  json_structure(dob,"indent#{dob.indent}") +                elsif dob.is==:para \ +                and dob.hang.to_s =~/[0-9]/ \ +                and dob.indent != dob.hang +                  json_structure(dob,"hang#{dob.hang.to_s}_indent#{dob.indent.to_s}") +                else json_structure(dob) +                end +              end +            end +            dob.obj=dob.obj.gsub(/#{Mx[:pa_o]}:\S+#{Mx[:pa_c]}/,'') if dob.obj +          end +        end +        6.downto(4) do |x| +          y=x - 1; v=x - 3 +          @per.body << "#{Ax[:tab]*5}</content>\n#{Ax[:tab]*y}</contents#{v}>" if @level[x]==true +        end +        3.downto(1) do |x| +          y=x - 1 +          @per.body << "#{Ax[:tab]*y}</heading#{x}>" if @level[x]==true +        end +      end +      def pre +        @per.head,@per.body=[],[] +        @per.open = '{' +      end +      def post +        @per.close = '}' +      end +      def publish +        content=[] +        @per.body[-1] = @per.body[-1].gsub(/,$/, '') #= Ax[:tab]*1 + '}' +        content << @per.open << @per.head << @per.body << @per.metadata +        content << @per.tail << @per.close +        content=content.flatten.compact +        Output.new(content,@md).json +      end +    end +    class Output +      def initialize(data,md) +        @data,@md=data,md +        @file=SiSU_Env::FileOp.new(@md) +      end +      def json +        SiSU_Env::FileOp.new(@md).mkdir +        filename_json=@file.write_file.json +        @data.each do |str| +          str=str.gsub(/\A\s+\Z/m,'') #str.gsub(/^\s+$/,'') +          filename_json.puts str unless str.empty? +        end +        filename_json.close +      end +    end +  end +end +__END__ diff --git a/lib/sisu/json_format.rb b/lib/sisu/json_format.rb new file mode 100644 index 00000000..fd1d47fa --- /dev/null +++ b/lib/sisu/json_format.rb @@ -0,0 +1,478 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** Description: json output logic, flow + +** 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, 2016 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] + +** 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/json_format.rb;hb=HEAD] + +=end +module SiSU_JSON_Format +  require_relative 'dp'                                 # dp.rb +  require_relative 'json_parts'                         # json_parts.rb +  include SiSU_Param +  class ParagraphNumber +    def initialize(md,paranum) +      @md=md +      @paranum=(paranum \ +      ? (/(\d+)/m.match(paranum)[1]) +      : nil) +    end +    def display +      p_num_display=if @paranum +        @paranum.gsub(/(\d+)/, +        '<font size="1" color="#777777">' + +        '  \1</font>') +      else '' +      end +      p_num_display +    end +    def name +      p_num_name=@paranum.gsub(/(\d+)/,'<a name="\1"></a>') +      p_num_name +    end +    def goto +      p_num_goto=@paranum.gsub(/(\d+)/,'<a href="#\1">') +      p_num_goto +    end +  end +  class HeadInformation +    include SiSU_Parts_JSON +    def initialize #dc rdf +      @full_title=@subtitle=@author=@subject=@description=@publisher=@contributor=@date=@type=@format=@identifier=@source=@language=@relation=@coverage=@rights=@copyright=@owner=@keywords='' +      @md=@@md +      # DublinCore 1 - title +      @rdfurl=%{  rdf:about="http://www.jus.uio.no/lm/toc"\n} +      if defined? @md.title.full \ +      and @md.title.full                                                      # DublinCore 1 - title +        @rdf_title=%{    dc.title="#{seg_name}#{@md.title.full}"\n} +        @full_title=%{<meta name="dc.title" content="#{seg_name}#{@md.title.full}" />\n} +      end +      if defined? @md.creator.author \ +      and @md.creator.author                                                  # DublinCore 2 - creator/author (author) +        @rdf_author=%{    dc.author="#{@md.creator.author}"\n} +        @author=%{<meta name="dc.author" content="#{@md.creator.author}" />\n} +      end +      if defined? @md.classify.subject \ +      and @md.classify.subject=~/\S+/                                          # DublinCore 3 - subject (us library of congress, eric or udc, or schema???) +        @rdf_subject=%{    dc.subject="#{@md.classify.subject}"\n} +        @subject=%{<meta name="dc.subject" content="#{@md.classify.subject}" />\n} +      end +      if defined? @md.notes.description \ +      and @md.notes.description=~/\S+/                                        # DublinCore 4 - description +        @rdf_description=%{    dc.description="#{@md.notes.description}"\n} +        @description=%{<meta name="dc.description" content="#{@md.notes.description}" />\n} +      end +      if defined? @md.publisher \ +      and @md.publisher=~/\S+/                                                # DublinCore 5 - publisher (current copy published by) +        @rdf_publisher=%{    dc.publisher="#{@md.publisher}"\n} +        @publisher=%{<meta name="dc.publisher" content="#{@md.publisher}" />\n} +      end +      if defined? @md.creator.contributor \ +      and @md.creator.contributor=~/\S+/                                      # DublinCore 6 - contributor +        @rdf_contributor=%{    dc.contributor="#{@md.creator.contributor}"\n} +        @contributor=%{<meta name="dc.contributor" content="#{@md.creator.contributor}" />\n} +      end +      if defined? @md.date.published \ +      and @md.date.published                                                  # DublinCore 7 - date year-mm-dd +        @rdf_date=%{    dc.date="#{@md.date.published}"\n} +        @date=%{<meta name="dc.date" content="#{@md.date.published}" #{@md.date_scheme} />\n} +      end +      if defined? @md.date.created \ +      and @md.date.created                                                    # DublinCore 7 - date.created year-mm-dd +        @rdf_date_created=%{    dc.date.created="#{@md.date.created}"\n} +        @date_created=%{<meta name="dc.date.created" content="#{@md.date.created}" #{@md.date_created_scheme} />\n} +      end +      if defined? @md.date.issued \ +      and @md.date.issued                                                      # DublinCore 7 - date.issued year-mm-dd +        @rdf_date_issued=%{    dc.date.issued="#{@md.date.issued}"\n} +        @date_issued=%{<meta name="dc.date.issued" content="#{@md.date.issued}" #{@md.date_issued_scheme} />\n} +      end +      if defined? @md.date.available \ +      and @md.date.available                                                  # DublinCore 7 - date.available year-mm-dd +        @rdf_date_available=%{    dc.date.available="#{@md.date.available}"\n} +        @date_available=%{<meta name="dc.date.available" content="#{@md.date.available}" #{@md.date_available_scheme} />\n} +      end +      if defined? @md.date.valid \ +      and @md.date.valid                                                      # DublinCore 7 - date.valid year-mm-dd +        @rdf_date_valid=%{    dc.date.valid="#{@md.date.valid}"\n} +        @date_valid=%{<meta name="dc.date.valid" content="#{@md.date.valid}" #{@md.date_valid_scheme} />\n} +      end +      if defined? @md.date.modified \ +      and @md.date.modified                                                   # DublinCore 7 - date.modified year-mm-dd +        @rdf_date_modified=%{    dc.date.modified="#{@md.date.modified}"\n} +        @date_modified=%{<meta name="dc.date.modified" content="#{@md.date.modified}" #{@md.date_modified_scheme} />\n} +      end +      if defined? @md.notes.coverage \ +      and @md.notes.coverage=~/\S+/                                        # DublinCore 14 - coverage +        @rdf_coverage=%{    dc.coverage="#{@md.notes.coverage}"\n} +        @coverage=%{<meta name="dc.coverage" content="#{@md.notes.coverage}" />\n} +      end +      if defined? @md.notes.relation \ +      and @md.notes.relation=~/\S+/                                         # DublinCore 13 - relation +        @rdf_relation=%{    dc.relation="#{@md.notes.relation}"\n} +        @relation=%{<meta name="dc.relation" content="#{@md.notes.relation}" />\n} +      end +      if defined? @md.notes.type \ +      and @md.notes.type                                                            # DublinCore 8 - type (genre eg. report, convention etc) +        @rdf_type=%{    dc.type="#{@md.notes.type}"\n} +        @type=%{<meta name="dc.type" content="#{@md.notes.type}" />\n} +      end +      if defined? @md.notes.format \ +      and @md.notes.format=~/\S+/                                              # DublinCore 9 - format (use your mime type) +        @rdf_format=%{    dc.format="#{@md.notes.format}"\n} +        @format=%{<meta name="dc.format" content="#{@md.notes.format}" />\n} +      end +      #if defined? @md.identifier.sisupod \ +      #and @md.identifier.sisupod=~/\S+/                                       # DublinCore 10 - identifier (your identifier, could use urn which is free) +      #  @rdf_identifier=%{    dc.identifier="#{@md.identifier.sisupod}"\n} +      #  @identifier=%{<meta name="dc.identifier" content="#{@md.identifier.sisupod}" />\n} +      #end +      if defined? @md.original.source \ +      and @md.original.source=~/\S+/                                           # DublinCore 11 - source (document source) +        @rdf_source=%{    dc.source="#{@md.original.source}"\n} +        @source=%{<meta name="dc.source" content="#{@md.source}" />\n} +      end +      if defined? @md.original.language \ +      and @md.original.language=~/\S+/                                         # DublinCore 12 - language (English) +        @rdf_language=%{    dc.language="#{@md.original.title}"\n} +        @language=%{<meta name="dc.language" content="#{@md.language[:name]}" />\n} +      end +      if defined? @md.rights.all \ +      and @md.rights.all=~/\S+/                                               # DublinCore 15 - rights +        rights=meta_content_clean(@md.rights.all) +        copyright=meta_content_clean(@md.rights.copyright.all) +        @rdf_rights=%{    dc.rights="#{rights}"\n} +        @rights=%{<meta name="dc.rights" content="#{rights}" />\n} +      end +      @copyright=%{<meta name="copyright" content="#{copyright}" />\n} \ +        if @md.rights.copyright.all # possibly redundant see dc.rights +      @owner=%{<meta name="owner" content="#{@md.owner}" />\n} if @md.owner +      @keywords=%{<meta name="keywords" content="#{@md.keywords}" />\n} if @md.keywords +      @index='index' +    end +    def meta_content_clean(content='') +      content=if not content.nil? +        content=content.tr('"',"'"). +           gsub(/&/,'&') +        content=SiSU_XML_Munge::Trans.new(@md).char_enc.utf8(content) +      else content +      end +    end +    def table_close +      '</font> </td></tr></table>' +    end +    def toc_head +      <<WOK +<html> +<head> +<title>#{@md.html_title}</title> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +         xmlns:dc="http://purl.org/dc/elements/1.1/"> + <rdf:Description +#{@rdfurl} +#{@rdf_title} +#{@rdf_subtitle} +#{@rdf_author} +#{@rdf_subject} +#{@rdf_description} +#{@rdf_publisher} +#{@rdf_contributor} +#{@rdf_date} +#{@rdf_date_created} +#{@rdf_date_issued} +#{@rdf_date_available} +#{@rdf_date_valid} +#{@rdf_date_modified} +#{@rdf_type} +#{@rdf_format} +#{@rdf_identifier} +#{@rdf_source} +#{@rdf_language} +#{@rdf_relation} +#{@rdf_coverage} +#{@rdf_rights} +  /> +</rdf:RDF> +#{@full_title} +#{@author} +#{@subject} +#{@description} +#{@publisher} +#{@contributor} +#{@date} +#{@date_created} +#{@date_issued} +#{@date_available} +#{@date_valid} +#{@date_modified} +#{@type} +#{@format} +#{@identifier} +#{@source} +#{@language} +#{@relation} +#{@coverage} +#{@rights} +#{@copyright} +#{@owner} +#{@png.ico} +#{@txt.generator} +#{@js.head} +\n</head> +#{@color.body} +#{@font.css_table_file} +<a name="top"></a> +<a name="up"></a> +<a name="start"></a> +#{@js.top} +WOK +    end +  end +  class ParagraphNumber +    def initialize(md,ocn) +      @md,@ocn=md,ocn.to_s +      @ocn ||='' +    end +    def ocn_display +      @make=SiSU_Env::ProcessingSettings.new(@md) +      if @make.build.ocn? +        ocn_class='ocn' +        if @ocn.to_i==0 +          @ocn.gsub(/^(\d+|)$/, +            %{<label class="#{ocn_class}"><a name="#{@ocn}"> </a></label>}) +        else +          @ocn.gsub(/^(\d+|)$/, +            %{<label class="#{ocn_class}"><a name="#{@ocn}">\\1</a></label>}) +        end +      else +        ocn_class='ocn_off' +        @ocn.gsub(/^(\d+|)$/, +          %{<label class="#{ocn_class}"> </label>}) +      end +    end +    def name +      %{<a name="#{@ocn}"></a>} +    end +    def id #w3c? "tidy" complains about numbers as identifiers ! annoying +      %{id="o#{@ocn}"} +    end +    def goto +      %{<a href="##{@ocn}">} +    end +  end +  class FormatTextObject +    include SiSU_Parts_JSON +    attr_accessor :md,:dob,:txt,:ocn,:format,:table,:link,:linkname,:paranum,:p_num,:headname,:banner,:url +    def initialize(md,t_o) +      @md,@t_o=md,t_o +      if t_o.class.inspect =~/Object/ +        @txt=if defined? t_o.obj; t_o.obj +        else nil +        end +        @ocn=if defined? t_o.ocn; t_o.ocn.to_s +        else nil +        end +        @headname=if t_o.is==:heading and defined? t_o.name; t_o.name +        else nil +        end +      else +        if @md.opt.act[:maintenance][:set]==:on +          p __FILE__ << ':' << __LINE__.to_s +          p t_o.class +          p caller +        end +      end +      if defined? @t_o.ocn +        ocn=((@t_o.ocn.to_s =~/\d+/) ? @t_o.ocn : nil) +        @p_num=ParagraphNumber.new(@md,ocn) +      end +      if @format and not @format.empty? +        if @format=~/^\d:(\S+)/ #need more reliable marker #if @format =~ /#{Rx[:lv]}/ +          headname=$1 #format[/\d~(\S+)/m,1] +          @headname=if headname =~/^[a-zA-Z]/; %{<a name="#{headname}" id="#{headname}"></a>} #consider: h_#{headname} +          else %{<a name="h#{headname}" id="h#{headname}"></a>} +          end +        end +      end +      @dob=t_o if defined? t_o.is +    end +    def para +      para_form_css('p','norm') +    end +    def code +      para_form_css('p','code') +    end +    def center +      para_form_css('p','center') +    end +    def bold +      para_form_css('p','bold') +    end +    def bullet +      para_form_css('li','bullet') +    end +    def format(tag,attrib) +      para_form_css(tag,attrib) +    end +    def heading_normal(tag,attrib) +      %{ +<div class="substance"> +  #{@p_num.ocn_display} +  <#{tag} class="#{attrib}" #{@p_num.id}>#{@p_num.name} +    #{@headname}#{@txt} +  </#{tag}> +</div> +} +    end +    def heading_body +      heading_normal('p','norm') +    end +    def heading_body0 +      heading_normal('h1','norm') +    end +    def heading_body1 +      heading_normal('h1','norm') +    end +    def heading_body2 +      heading_normal('h2','norm') +    end +    def heading_body3 +      heading_normal('h3','norm') +    end +    def heading_body4 +      heading_normal('h4','norm') +    end +    def heading_body5 +      heading_normal('h5','norm') +    end +    def heading_body6 +      heading_normal('h6','norm') +    end +    def heading_body7 +      heading_normal('h7','norm') +    end +    def title_header(tag,attrib) +      %{ +<div class="content"> +<#{tag} class="#{attrib}"> +    #{@txt} +  </#{tag}> +</div> +} +    end +    def title_header1 +      title_header('h1','tiny') +    end +    def title_header2 +      title_header('h2','tiny') +    end +    def title_header3 +      title_header('h3','tiny') +    end +    def title_header4 +      '' +    end +    def dl #check :trailer +      "<dl><b>#{@txt}</b> #{@trailer}</dl>" +    end +    def table_css_end      #<!TZ!> +      '</table> +    </p> +  </div>' +    end +    def gsub_body +#fix +      @txt=case @txt +      when /^\s*\((i+|iv|v|vi+|ix|x|xi+)\)/ +        @txt.gsub(/^\((i+|iv|v|vi+|ix|x|xi+)\)/,'<b>(\1)</b>'). +          gsub(/^(#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]})\s*\((i+|iv|v|vi+|ix|x|xi+)\)/,'\1<b>(\2)</b>') +      when /^\s*\(?(\d|[a-z])+\)/ +        @txt.gsub(/^\((\d+|[a-z])+\)/,'<b>(\1)</b>'). +          gsub(/^(#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]})\s*\((\d+|[a-z])+\)/,'\1<b>(\2)</b>') +      when /^\s*\d{1,3}\.\s/ +        @txt.gsub(/^\s*(\d+\.)/,'<b>\1</b>') +      when /^\s*[A-Z]\.\s/ +        @txt.gsub(/^\s*([A-Z]\.)/,'<b>\1</b>') +      else @txt +      end +    end +    def bold_para +      %{#{the_margin.txt_0} +  <p class="bold"> +    #{@txt} +  </p> +#{the_margin.num_css} +      +#{the_table_close}} +    end +    def bold_header +      @txt=@txt.gsub(/[1-9]~(\S+)/,'<a name="\1"></a>'). +        gsub(/[1-9]~/,'') +      %{<p class="bold"> +    #{@txt} +  </p> +#{the_margin.num_css} +      +#{the_table_close}} +    end +    def toc_head_copy_at +      %{<p class="center">#{@txt}</p>\n} +    end +    def center +      %{<p class="center">#{@txt}</p>\n} +    end +    def bold +      %{<p class="bold">#{@txt}</p>\n} +    end +    def center_bold +      %{<p class="centerbold">#{@txt}</p>\n} +    end +  end +end +__END__ diff --git a/lib/sisu/json_parts.rb b/lib/sisu/json_parts.rb new file mode 100644 index 00000000..e53c9935 --- /dev/null +++ b/lib/sisu/json_parts.rb @@ -0,0 +1,88 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** shared xml parts + +** 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, 2016 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] + +** 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/json_parts.rb;hb=HEAD] + +=end +module SiSU_Parts_JSON +  require_relative 'generic_parts'                       # generic_parts.rb +  include SiSU_Parts_Generic +  def the_line_break +    '<br>' +  end +  def the_table_close +    '</td></tr> +</table>' +  end +  def the_url_decoration +    def xml_open                     #'<' +      Dx[:url_o] +    end +    def xml_close                    #'>' +      Dx[:url_c] +    end +    def txt_open +      '[' +    end +    def txt_close +      ']' +    end +    self +  end +end +module SiSU_Proj_XML +  require_relative 'html_parts'                         # html_parts.rb +  require_relative 'se'                                 # se.rb +  include SiSU_Env +  class Bits < SiSU_Proj_HTML::Bits +  end +end +__END__ diff --git a/lib/sisu/json_persist.rb b/lib/sisu/json_persist.rb new file mode 100644 index 00000000..47c3f66c --- /dev/null +++ b/lib/sisu/json_persist.rb @@ -0,0 +1,124 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** html segment generation, processing + +** 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, 2016 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] + +** 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/json_persist.rb;hb=HEAD] + +=end +module SiSU_JSON_Persist +  class Persist +    @@persist=nil +    attr_accessor :head,:toc,:body,:tail,:open,:close,:sc,:endnotes,:book_idx,:metadata +    #attr_accessor :head,:body,:tail,:open,:close,:sc +#@@odf={ body: [], head: [], toc: [],  metadata: [], tail: [], book_idx: [], endnotes: [] } +    def initialize(args=nil) +      @@persist=args=(args ? args : (@@persist || persist_init_hash_values)) +      @head=args[:head] +      @toc=args[:toc] +      @body=args[:body] +      @tail=args[:tail] +      @open=args[:open] +      @close=args[:close] +      @sc=args[:sc] +      @endnotes=args[:endnotes] +      @book_idx=args[:book_idx] +      @metadata=args[:metadata] +    end +    def head +      @head +    end +    def toc +      @toc +    end +    def body +      @body +    end +    def tail +      @tail +    end +    def open +      @open +    end +    def close +      @close +    end +    def sc +      @sc +    end +    def endnotes +      @endnotes +    end +    def book_idx +      @book_idx +    end +    def metadata +      @metadata +    end +    def persist_init_hash_values +      { +        head: [], +        toc: [], +        body: [], +        tail: [], +        open: [], +        close: [], +        sc: [], +        endnotes: [], +        book_idx: [], +        metadata: [], +      } +    end +    def persist_init +      @@persist=nil +      Persist.new(persist_init_hash_values) +    end +  end +end +__END__ diff --git a/lib/sisu/json_shared.rb b/lib/sisu/json_shared.rb new file mode 100644 index 00000000..28bb0ad3 --- /dev/null +++ b/lib/sisu/json_shared.rb @@ -0,0 +1,681 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** Description: json output logic, flow + +** 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, 2016 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] + +** 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/json_shared.rb;hb=HEAD] + +=end +module SiSU_JSONutils +  require_relative 'generic_parts'                      # generic_parts.rb +  class Clean +    def initialize(para='') +      @para=para +      #@para,@n_char_max,@n_indent,@post,=para,n_char_max,n_indent,post +      #@n_char_max_extend = n_char_max +      #@n_hang=n_hang ? n_hang : @n_indent +    end +    def line_json_clean +      @para=@para.gsub(/<br>/,' \\ '). +        gsub(/#{Mx[:br_nl]}/,"\n\n"). +        gsub(/"/,'\"'). +        gsub(/'/,"\\\\'") +      @para +    end +  end +end +module SiSU_JSON_Munge +  require_relative 'json_parts'                         # json_parts.rb +  class Trans +    include SiSU_Parts_JSON +    def initialize(md) +      @md=md +      @sys=SiSU_Env::SystemCall.new +      @dir=SiSU_Env::InfoEnv.new(@md.fns) +      if @md.sem_tag +        @ab ||=semantic_tags.default +      end +    end +    def semantic_tags +      def default +        { +          pub:   'publication', +          conv:  'convention', +          vol:   'volume', +          pg:    'page', +          cty:   'city', +          org:   'organization', +          uni:   'university', +          dept:  'department', +          fac:   'faculty', +          inst:  'institute', +          co:    'company', +          com:   'company', +          conv:  'convention', +          dt:    'date', +          y:     'year', +          m:     'month', +          d:     'day', +          ti:    'title', +          au:    'author', +          ed:    'editor', #editor? +          v:     'version', #edition +          n:     'name', +          fn:    'firstname', +          mn:    'middlename', +          ln:    'lastname', +          in:    'initials', +          qt:    'quote', +          ct:    'cite', +          ref:   'reference', +          ab:    'abreviation', +          def:   'define', +          desc:  'description', +          trans: 'translate', +        } +      end +      self +    end +    def char_enc #character encode +      def utf8(dob='') +        if @sys.locale =~/utf-?8/i # instead ucs for utf8 # String#encode Iñtërnâtiônàlizætiøn +          str=if defined? dob.obj then dob.obj +          elsif dob.is_a?(String) then dob +          end +          if str +            #¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûü +            #¢£¥§©ª«®°±²³µ¶¹º»¼½¾×÷ +            str=str.gsub(/</um,'<').    # '<'     # < +              gsub(/>/um,'>').    # '>'     # > +              gsub(/¢/um,'¢').   # '¢'   # ¢ +              gsub(/£/um,'£').   # '£'  # £ +              gsub(/¥/um,'¥').   # '¥'    # ¥ +              gsub(/§/um,'§').   # '§'   # § +              gsub(/©/um,'©').   # '©'   # © +              gsub(/ª/um,'ª').   # 'ª'   # ª +              gsub(/«/um,'«').   # '«'  # « +              gsub(/®/um,'®').   # '®'    # ® +              gsub(/°/um,'°').   # '°'    # ° +              gsub(/±/um,'±').   # '±' # ± +              gsub(/²/um,'²').   # '²'   # ² +              gsub(/³/um,'³').   # '³'   # ³ +              gsub(/µ/um,'µ').   # 'µ'  # µ +              gsub(/¶/um,'¶').   # '¶'   # ¶ +              gsub(/¹/um,'¹').   # '¹'   # ¹ +              gsub(/º/um,'º').   # 'º'   # º +              gsub(/»/um,'»').   # '»'  # » +              gsub(/¼/um,'¼').   # '¼' # ¼ +              gsub(/½/um,'½').   # '½' # ½ +              gsub(/¾/um,'¾').   # '¾' # ¾ +              gsub(/×/um,'×').   # '×'  # × +              gsub(/÷/um,'÷').   # '÷' # ÷ +              gsub(/¿/um,'¿').   # '¿' # ¿ +              gsub(/À/um,'À').   # 'À' # À +              gsub(/Á/um,'Á').   # 'Á' # Á +              gsub(/Â/um,'Â').   # 'Â'  #  +              gsub(/Ã/um,'Ã').   # 'Ã' # à +              gsub(/Ä/um,'Ä').   # 'Ä'   # Ä +              gsub(/Å/um,'Å').   # 'Å'  # Å +              gsub(/Æ/um,'Æ').   # 'Æ'  # Æ +              gsub(/Ç/um,'Ç').   # 'Ç' # Ç +              gsub(/È/um,'È').   # 'È' # È +              gsub(/É/um,'É').   # 'É' # É +              gsub(/Ê/um,'Ê').   # 'Ê'  # Ê +              gsub(/Ë/um,'Ë').   # 'Ë'   # Ë +              gsub(/Ì/um,'Ì').   # 'Ì' # Ì +              gsub(/Í/um,'Í').   # 'Í' # Í +              gsub(/Î/um,'Î').   # 'Î'  # Î +              gsub(/Ï/um,'Ï').   # 'Ï'   # Ï +              gsub(/Ð/um,'Ð').   # 'Ð'    # Ð +              gsub(/Ñ/um,'Ñ').   # 'Ñ' # Ñ +              gsub(/Ò/um,'Ò').   # 'Ò' # Ò +              gsub(/Ó/um,'Ó').   # 'Ó' # Ó +              gsub(/Ô/um,'Ô').   # 'Ô'  # Ô +              gsub(/Õ/um,'Õ').   # 'Õ' # Õ +              gsub(/Ö/um,'Ö').   # 'Ö'   # Ö +              gsub(/Ø/um,'Ø').   # 'Ø' # Ø +              gsub(/Ù/um,'Ù').   # 'Ù' # Ù +              gsub(/Ú/um,'Ú').   # 'Ú' # Ú +              gsub(/Û/um,'Û').   # 'Û'  # Û +              gsub(/Ü/um,'Ü').   # 'Ü'   # Ü +              gsub(/Ý/um,'Ý').   # 'Ý' # Ý +              gsub(/Þ/um,'Þ').   # 'Þ'  # Þ +              gsub(/ß/um,'ß').   # 'ß'  # ß +              gsub(/à/um,'à').   # 'à' # à +              gsub(/á/um,'á').   # 'á' # á +              gsub(/â/um,'â').   # 'â'  # â +              gsub(/ã/um,'ã').   # 'ã' # ã +              gsub(/ä/um,'ä').   # 'ä'   # ä +              gsub(/å/um,'å').   # 'å'  # å +              gsub(/æ/um,'æ').   # 'æ'  # æ +              gsub(/ç/um,'ç').   # 'ç' # ç +              gsub(/è/um,'è').   # 'è' # è +              gsub(/é/um,'é').   # '´'  # é +              gsub(/ê/um,'ê').   # 'ˆ'   # ê +              gsub(/ë/um,'ë').   # 'ë'   # ë +              gsub(/ì/um,'ì').   # 'ì' # ì +              gsub(/í/um,'í').   # '´'  # í +              gsub(/î/um,'î').   # 'î'  # î +              gsub(/ï/um,'ï').   # 'ï'   # ï +              gsub(/ð/um,'ð').   # 'ð'    # ð +              gsub(/ñ/um,'ñ').   # 'ñ' # ñ +              gsub(/ò/um,'ò').   # 'ò' # ò +              gsub(/ó/um,'ó').   # 'ó' # ó +              gsub(/ô/um,'ô').   # 'ô'  # ô +              gsub(/õ/um,'õ').   # 'õ' # õ +              gsub(/ö/um,'ö').   # 'ö'   # ö +              gsub(/ø/um,'ø').   # 'ø' # ø +              gsub(/ù/um,'ú').   # 'ù' # ú +              gsub(/ú/um,'û').   # 'ú' # û +              gsub(/û/um,'ü').   # 'û'  # ü +              gsub(/ü/um,'ý').   # 'ü'   # ý +              gsub(/þ/um,'þ').   # 'þ'  # þ +              gsub(/ÿ/um,'ÿ').   # 'ÿ'   # ÿ +              gsub(/‘/um,'‘').  # '‘'  # ‘ +              gsub(/’/um,'’').  # '’'  # ’ +              gsub(/“/um,'“').  # “    # “ +              gsub(/”/um,'”').  # ”    # ” +              gsub(/–/um,'–').  # –    # – +              gsub(/—/um,'—').  # —    # — +              gsub(/∝/um,'∝').  # ∝     # ∝ +              gsub(/∞/um,'∞').  # ∞    # ∞ +              gsub(/™/um,'™').  # ™    # ™ +              gsub(/✠/um,'✠'). # ✗    # ✠ +              gsub(/ /um,' ').       # space identify +              gsub(/ /um,' ')       # space identify +          end +          dob=if defined? dob.obj +            dob.obj=str +            dob +          elsif dob.is_a?(String) +            str +          end +          dob +        end +      end +      def html(dob='') +        if @sys.locale =~/utf-?8/i # instead ucs for utf8 # String#encode Iñtërnâtiônàlizætiøn +          dob.obj=dob.obj.gsub(/ /u,' ').           # space identify +            gsub(/ /u,' ')           # space identify +        end +      end +      self +    end +    def tidywords(wordlist) +      wordlist_new=[] +      wordlist.each do |x| +        #imperfect solution will not catch all possible cases +        x=x.gsub(/&/,'&') unless x =~/&\S+;/ +        x=x.gsub(/&([A-Z])/,'&\1') +        wordlist_new << x +      end +      wordlist_new +    end +    def markup(dob='') +      wordlist=dob.obj.scan(/&[#0-9a-z]+;|\S+|\n/) #\n needed for tables, check though added 2005w17 +      dob.obj=tidywords(wordlist).join(' ').strip +      unless dob.is==:table +        dob.obj=dob.obj.gsub(/#{Mx[:br_line]}/u,'<br>'). +          gsub(/#{Mx[:br_paragraph]}/u,'<br>'). +          gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'<br>') +      end +      dob.obj=dob.obj.gsub(/#{Mx[:mk_o]}:name#\S+?#{Mx[:mk_c]}/,''). +        gsub(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;'). +        gsub(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;'). +        gsub(/(^|#{Mx[:gl_c]}|\s+)<\s+/,'\1< ').gsub(/\s+>(\s+|$)/,' >\1'). +        #gsub(/#{Mx[:fa_emphasis_o]}(.+?)#{Mx[:fa_emphasis_c]}/,'<em>\1</em>'). #reinstate +        gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/m,'<b>\1</b>'). +        gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/m,'<i>\1</i>'). +        gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'<u>\1</u>'). +        gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'<sup>\1</sup>'). +        gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'<sub>\1</sub>'). +        gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'<ins>\1</ins>'). +        gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'<cite>\1</cite>'). +        gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'<del>\1</del>'). +        gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'<tt>\1</tt>'). +        gsub(/<:pb>\s*/,''). #Fix +        gsub(/<+[-~]#>+/,'') +      if dob.is !=:code +        #embeds a red-bullet image --> +        dob.obj=dob.obj.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'<b>\1</b>'). +          gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'<i>\1</i>'). +          gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'<u>\1</u>'). +          gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'<del>\1</del>') +        dob.obj=dob.obj.gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'<br>') unless dob.is==:table +        dob.obj=dob.obj.gsub(/#{Mx[:br_page]}\s*/,''). +          gsub(/#{Mx[:br_page_new]}\s*/,''). +          gsub(/#{Mx[:br_page_line]}\s*/,''). +          gsub(/#{Mx[:pa_non_object_no_heading]}|#{Mx[:pa_non_object_dummy_heading]}/,''). +          gsub(/<[-~]#>/,''). +          gsub(/href="#{Xx[:segment]}/m,'href="'). +          gsub(/#{Mx[:lnk_o]}([^#{Mx[:lnk_o]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{Mx[:rel_c]}]+?)#{Mx[:lnk_c]}#{Mx[:rel_o]}(\.\.\/\S+?)#{Mx[:rel_c]}/, +            '<link xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:href="\2">\1</link>'). +          gsub(/#{Mx[:lnk_o]}([^#{Mx[:lnk_o]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{Mx[:rel_c]}]+?)#{Mx[:lnk_c]}#{Mx[:rel_o]}:(\S+?)#{Mx[:rel_c]}/, +            '<link xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:href="../\2">\1</link>'). +          gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:rel_o]}(\S+?)#{Mx[:rel_c]}/, +            '<link xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:href="#\2">\1</link>'). +          gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))[ ]+(\d+)x(\d+)(\s+[^}]+)?#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, +            %{<image xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:actuate="onLoad" xl:show="embed" xl:href="#{@md.file.output_path.xml.rel_image}/\\1" width="\\2" height="\\3" />[\\1] \\4}). +          gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))([ ]+[^}]+)?#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, +            %{<image xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:actuate="onLoad" xl:show="embed" xl:href="#{@md.file.output_path.xml.rel_image}/\\1"/>\\1}). +          gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))[ ]+(\d+)x(\d+)(\s+[^}]+)?#{Mx[:lnk_c]}image/, +            %{<image xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:actuate="onLoad" xl:show="embed" xl:href="#{@md.file.output_path.xml.rel_image}/\\1" width="\\2" height="\\3" />[\\1] \\4}). +          gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))([ ]+[^}]+)?#{Mx[:lnk_c]}image/, +            %{<image xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:actuate="onLoad" xl:show="embed" xl:href="#{@md.file.output_path.xml.rel_image}/\\1"/>\\1}). +          gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, +            '<link xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:href="\2">\1</link>'). #watch, compare html_tune +          gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, +            %{#{the_url_decoration.xml_open}<link xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:href="\\1">\\1</link>#{the_url_decoration.xml_close}}). +          gsub(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/, +            '<link xmlns:xl="http://www.w3.org/1999/xlink" xl:type="simple" xl:href="\1">\1</link>') #escaped urls not linked, deal with later +      else +        dob.obj=dob.obj.gsub(/</m,'<').gsub(/>/m,'>') +      end +      if dob.of==:block +        dob.obj=dob.obj.gsub(/#{Mx[:gl_bullet]}/,'● ') +      end +      dob.obj=dob.obj.gsub(/#{Mx[:url_o]}([a-zA-Z0-9._-]+\@\S+?\.[a-zA-Z0-9._-]+)#{Mx[:url_c]}/, +          %{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}). +        gsub(/#{Dx[:url_o]}/,"#{Dx[:url_o_xml]}"). +        gsub(/#{Dx[:url_c]}/,"#{Dx[:url_c_xml]}"). +        gsub(/ |#{Mx[:nbsp]}/m,' '). +        gsub(/;&([^#]|(?:[^gl][^t]|[^a][^m][^p]|[^n][^b][^s][^p])[^;])/,';&\1') # pattern not to match +      dob +    end +    def markup_light(dob='') +      dob.obj=dob.obj.gsub(/\/\{(.+?)\}\//,'<i>\1</i>'). +        gsub(/[*!]\{(.+?)\}[*!]/,'<b>\1</b>'). +        gsub(/_\{(.+?)\}_/,'<u>\1</u>'). +        gsub(/-\{(.+?)\}-/,'<del>\1</del>'). +        gsub(/<br(\s*\/)?>/,'<br>'). +        gsub(/<:pb>\s*/,''). +        gsub(/<[-~]#>/,''). +        gsub(/(^|#{Mx[:gl_c]}|\s)&\s+/,'\1& '). #sort +        gsub(/&([^;]{1,5})/,'&\1'). #sort, rough estimate, revisit #WATCH found in node not sax +        gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}(\S+?\.(?:png|jpg|gif))[ ]+.+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/, +          "<image.path>#{@md.file.output_path.xml.rel_image}\/\\1</image.path>"). +        gsub(/ |#{Mx[:nbsp]}/,' '). +        gsub(/;&([^#]|(?:[^gl][^t]|[^a][^m][^p]|[^n][^b][^s][^p])[^;])/,';&\1') # pattern not to match +      wordlist=dob.obj.scan(/&[#0-9a-z]+;|\S+|\n/) #\n needed for tables, check though added 2005w17 +      dob.obj=tidywords(wordlist).join(' ').strip +      dob +    end +    def clean(str) +      str=str.gsub(/#{Mx[:gl_o]}(#[0-9]{3})#{Mx[:gl_c]}/u,'&\1;'). +        gsub(/#{Mx[:gl_o]}#([a-z]{2,4})#{Mx[:gl_c]}/u,'&\1;') +    end +    def markup_fictionbook(str='',is='') +      str=str.gsub(/#{Mx[:en_a_o]}([\d+*]+).+?#{Mx[:en_a_c]}/m,'<a xl:href="#footnote\1" type="note">[\1]</a>'). +        gsub(/&/,'&'). #sort +        gsub(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;'). +        gsub(/(^|#{Mx[:gl_c]}|\s)&\s+/,'\1& '). #sort +        gsub(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;') +      str=str.gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'<br>') unless is==:table +      str=str.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'<b>\1</b>'). +        gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'<i>\1</i>'). +        gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'<u>\1</u>'). +        gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'<sup>\1</sup>'). +        gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'<sub>\1</sub>'). +        gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'<ins>\1</ins>'). +        gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'<cite>\1</cite>'). +        gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'<del>\1</del>'). +        gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'<tt>\1</tt>'). # tt, kbd +        gsub(/#{Mx[:lnk_o]}\s*(\S+?\.(?:png|jpg|gif)).+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}|image)/m,'<image xl:href="#\1" />'). +        gsub(/#{Mx[:url_o]}(.+?)#{Mx[:url_c]}/,"#{Dx[:url_o]}\\1#{Dx[:url_c]}"). +        gsub(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,'<a name="\1"></a>'). +        gsub(/#{Mx[:gl_bullet]}/m,'● '). #  not available +        gsub(/#{Mx[:nbsp]}/,' '). #  not available +        gsub(/<(p|br)>/,'<\1 />') +      clean(str) +    end +    def markup_docbook(dob='')                                  # work on, initially a copy of fictionbook! +      if dob.is !=:code +        dob.obj=dob.obj.gsub(/#{Mx[:en_a_o]}(\d+)\s*(.+?)#{Mx[:en_a_c]}/m,'<footnote><para><!-- fn\1 -->\2</para></footnote>'). +          gsub(/\\\\/,'</para><para>'). +          gsub(/&/,'&'). #sort +          gsub(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;'). +          gsub(/(^|#{Mx[:gl_c]}|\s)&\s+/,'\1& '). #sort +          gsub(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;') +        dob.obj=dob.obj.gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'<br>') unless dob.is==:table +        dob.obj=dob.obj.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'<b>\1</b>'). +          gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'<i>\1</i>'). +          gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'<u>\1</u>'). +          gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'<sup>\1</sup>'). +          gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'<sub>\1</sub>'). +          gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'<ins>\1</ins>'). +          gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'<cite>\1</cite>'). +          gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'<del>\1</del>'). +          gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'<tt>\1</tt>'). # tt, kbd +          gsub(/#{Mx[:lnk_o]}\s*(\S+?)\.(png|jpg|gif).+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}|image)/m, +            %{#{Xx[:split]}:spaces0:<figure id="fig-\\1">\n:spaces1:<title></title>\n:spaces1:<graphic fileref="../../_sisu/image/\\1.\\2" align="center" width="50%"></graphic>\n:spaces0:</figure>#{Xx[:split]}}). # common image location, else use ./images +          gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(.+?)#{Mx[:url_c]}/, +            '<ulink url="\2">\1</ulink>'). +          gsub(/#{Mx[:url_o]}(.+?)#{Mx[:url_c]}/, +            '<ulink url="\1">\1</ulink>'). +          gsub(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,'<a name="\1"></a>'). +          gsub(/#{Mx[:gl_bullet]}/m,'● '). #  not available +          gsub(/#{Mx[:nbsp]}/,' '). #  not available +          gsub(/<(p|br)>/,'<\1 />') +        dob.obj=clean(dob.obj) +      elsif dob.is == :code +        dob.obj=dob.obj.gsub(/&/m,'&'). #sort +          gsub(/</,'<').gsub(/>/,'>') +      else # p dob.is ?? +      end +      dob +    end +    def markup_group(dob='') +      dob.obj=dob.obj.gsub(/</,'<').gsub(/>/,'>'). +        gsub(/<:?br(?:\s+\/)?>/,'<br>'). +        gsub(/<(link xmlns:xl=".+?")>/,'<\1>'). +        gsub(/<(\/link)>/,'<\1>'). +        gsub(/<(\/?en)>/,'<\1>') +      dob +    end +    def markup_block(dob='') +      dob.obj=dob.obj.gsub(/</,'<').gsub(/>/,'>'). +        gsub(/<:?br(?:\s+\/)?>/,'<br>'). +        gsub(/<(link xmlns:xl=".+?")>/,'<\1>'). +        gsub(/<(\/link)>/,'<\1>'). +        gsub(/<(\/?en)>/,'<\1>') +      dob +    end +    def xml_sem_block_paired(matched) # colon depth: many, recurs +      matched=matched.gsub(/\b(au):\{(.+?)\}:\1\b/m,  %{<sem:#{@ab[:au]} depth="many">\\2</sem:#{@ab[:au]}>}). +        gsub(/\b(vol):\{(.+?)\}:\1\b/m, %{<sem:#{@ab[:vol]} depth="many">\\2</sem:#{@ab[:vol]}>}). +        gsub(/\b(pub):\{(.+?)\}:\1\b/m, %{<sem:#{@ab[:pub]} depth="many">\\2</sem:#{@ab[:pub]}>}). +        gsub(/\b(ref):\{(.+?)\}:\1\b/m, %{<sem:#{@ab[:ref]} depth="many">\\2</sem:#{@ab[:ref]}>}). +        gsub(/\b(desc):\{(.+?)\}:\1\b/m,%{<sem:#{@ab[:desc]} depth="many">\\2</sem:#{@ab[:desc]}>}). +        gsub(/\b(conv):\{(.+?)\}:\1\b/m,%{<sem:#{@ab[:conv]} depth="many">\\2</sem:#{@ab[:conv]}>}). +        gsub(/\b(ct):\{(.+?)\}:\1\b/m,  %{<sem:#{@ab[:ct]} depth="many">\\2</sem:#{@ab[:ct]}>}). +        gsub(/\b(cty):\{(.+?)\}:\1\b/m, %{<sem:#{@ab[:cty]} depth="many">\\2</sem:#{@ab[:cty]}>}). +        gsub(/\b(org):\{(.+?)\}:\1\b/m, %{<sem:#{@ab[:org]} depth="many">\\2</sem:#{@ab[:org]}>}). +        gsub(/\b(dt):\{(.+?)\}:\1\b/m,  %{<sem:#{@ab[:dt]} depth="many">\\2</sem:#{@ab[:dt]}>}). +        gsub(/\b(n):\{(.+?)\}:\1\b/m,   %{<sem:#{@ab[:n]} depth="many">\\2</sem:#{@ab[:n]}>}). +        gsub(/([a-z]+(?:[_:.][a-z]+)*)(?::\{(.+?)\}:\1)/m,'<sem:\1 depth="many">\2</sem:\1>') +    end +    def xml_semantic_tags(dob) +      if @md.sem_tag +        dob.obj.gsub!(/([a-z]+(?:[_:.][a-z]+)*)(?::\{(.+?)\}:\1)/m) {|c| xml_sem_block_paired(c) } +        dob.obj.gsub!(/([a-z]+(?:[_:.][a-z]+)*)(?::\{(.+?)\}:\1)/m) {|c| xml_sem_block_paired(c) } +        dob.obj.gsub!(/([a-z]+(?:[_:.][a-z]+)*)(?::\{(.+?)\}:\1)/m) {|c| xml_sem_block_paired(c) } +        dob.obj=dob.obj.gsub(/:\{(.+?)\}:au\b/m,             %{<sem:#{@ab[:au]} depth="one">\\1</sem:#{@ab[:au]}>}). +          gsub(/:\{(.+?)\}:n\b/m,              %{<sem:#{@ab[:n]} depth="one">\\1</sem:#{@ab[:n]}>}). +          gsub(/:\{(.+?)\}:ti\b/m,             %{<sem:#{@ab[:ti]} depth="one">\\1</sem:#{@ab[:ti]}>}). +          gsub(/:\{(.+?)\}:ref\b/m,            %{<sem:#{@ab[:ref]} depth="one">\\1</sem:#{@ab[:ref]}>}). +          gsub(/:\{(.+?)\}:desc\b/m,           %{<sem:#{@ab[:desc]} depth="one">\\1</sem:#{@ab[:desc]}>}). +          gsub(/:\{(.+?)\}:cty\b/m,            %{<sem:#{@ab[:cty]} depth="one">\\1</sem:#{@ab[:cty]}>}). +          gsub(/:\{(.+?)\}:org\b/m,            %{<sem:#{@ab[:org]} depth="one">\\1</sem:#{@ab[:org]}>}). +          gsub(/:\{(.+?)\}:([a-z]+(?:[_:.][a-z]+)*)/m,'<sem:\2 depth="one">\1</sem:\2>'). +          gsub(/;\{([^}]+(?![;]))\};ti\b/m,    %{<sem:#{@ab[:ti]} depth="zero">\\1</sem:#{@ab[:ti]}>}). +          gsub(/;\{([^}]+(?![;]))\};qt\b/m,    %{<sem:#{@ab[:qt]} depth="zero">\\1</sem:#{@ab[:qt]}>}). +          gsub(/;\{([^}]+(?![;]))\};ref\b/m,   %{<sem:#{@ab[:ref]} depth="zero">\\1</sem:#{@ab[:ref]}>}). +          gsub(/;\{([^}]+(?![;]))\};ed\b/m,    %{<sem:#{@ab[:ed]} depth="zero">\\1</sem:#{@ab[:ed]}>}). +          gsub(/;\{([^}]+(?![;]))\};v\b/m,     %{<sem:#{@ab[:v]} depth="zero">\\1</sem:#{@ab[:v]}>}). +          gsub(/;\{([^}]+(?![;]))\};desc\b/m,  %{<sem:#{@ab[:desc]} depth="zero">\\1</sem:#{@ab[:desc]}>}). +          gsub(/;\{([^}]+(?![;]))\};def\b/m,   %{<sem:#{@ab[:def]} depth="zero">\\1</sem:#{@ab[:def]}>}). +          gsub(/;\{([^}]+(?![;]))\};trans\b/m, %{<sem:#{@ab[:trans]} depth="zero">\\1</sem:#{@ab[:trans]}>}). +          gsub(/;\{([^}]+(?![;]))\};y\b/m,     %{<sem:#{@ab[:y]} depth="zero">\\1</sem:#{@ab[:y]}>}). +          gsub(/;\{([^}]+(?![;]))\};ab\b/m,    %{<sem:#{@ab[:ab]} depth="zero">\\1</sem:#{@ab[:ab]}>}). +          gsub(/;\{([^}]+(?![;]))\};pg\b/m,    %{<sem:#{@ab[:pg]} depth="zero">\\1</sem:#{@ab[:pg]}>}). +          gsub(/;\{([^}]+(?![;]))\};fn?\b/m,   %{<sem:#{@ab[:fn]} depth="zero">\\1</sem:#{@ab[:fn]}>}). +          gsub(/;\{([^}]+(?![;]))\};mn?\b/m,   %{<sem:#{@ab[:mn]} depth="zero">\\1</sem:#{@ab[:mn]}>}). +          gsub(/;\{([^}]+(?![;]))\};ln?\b/m,   %{<sem:#{@ab[:ln]} depth="zero">\\1</sem:#{@ab[:ln]}>}). +          gsub(/;\{([^}]+(?![;]))\};in\b/m,    %{<sem:#{@ab[:in]} depth="zero">\\1</sem:#{@ab[:in]}>}). +          gsub(/;\{([^}]+(?![;]))\};uni\b/m,   %{<sem:#{@ab[:uni]} depth="zero">\\1</sem:#{@ab[:uni]}>}). +          gsub(/;\{([^}]+(?![;]))\};fac\b/m,   %{<sem:#{@ab[:fac]} depth="zero">\\1</sem:#{@ab[:fac]}>}). +          gsub(/;\{([^}]+(?![;]))\};inst\b/m,  %{<sem:#{@ab[:inst]} depth="zero">\\1</sem:#{@ab[:inst]}>}). +          gsub(/;\{([^}]+(?![;]))\};dept\b/m,  %{<sem:#{@ab[:dpt]} depth="zero">\\1</sem:#{@ab[:dept]}>}). +          gsub(/;\{([^}]+(?![;]))\};org\b/m,   %{<sem:#{@ab[:org]} depth="zero">\\1</sem:#{@ab[:org]}>}). +          gsub(/;\{([^}]+(?![;]))\};com?\b/m,  %{<sem:#{@ab[:com]} depth="zero">\\1</sem:#{@ab[:com]}>}). +          gsub(/;\{([^}]+(?![;]))\};cty\b/m,   %{<sem:#{@ab[:cty]} depth="zero">\\1</sem:#{@ab[:cty]}>}). +          gsub(/;\{([^}]+(?![;]))\};([a-z]+(?:[_:.][a-z]+)*)/m,'<sem:\2 depth="zero">\1</sem:\2>') +      end +      dob +    end +  end +end +module SiSU_XML_Tags #Format +  require_relative 'dp'                                 # dp.rb +    include SiSU_Param +  class RDF +    include SiSU_Parts_JSON +    def initialize(md='',seg_name=[],tracker=0) +      @full_title=@subtitle=@author=@subject=@description=@publisher=@contributor=@date=@date_created=@date_issued=@date_available=@date_valid=@date_modified=@type=@format=@identifier=@source=@language=@relation=@coverage=@rights=@copyright=@owner=@keywords='' +      @md=md +      @rdfurl=%{  rdf:about="http://www.jus.uio.no/lm/toc"\n} +      if defined? @md.title.full \ +      and @md.title.full                          # DublinCore 1 - title +        @rdf_title=%{    dc.title="#{seg_name}#{@md.title.full}"\n} +        @full_title=%{  <meta name="dc.title" content="#{@md.title.full}" />\n} +      end +      if defined? @md.creator.author \ +      and @md.creator.author=~/\S+/                                            # DublinCore 2 - creator/author (author) +        @rdf_author=%{    dc.author="#{@md.creator.author}"\n} +        content=meta_content_clean(@md.creator.author) +        @author=%{  <meta name="dc.author" content="#{content}" />\n} +      end +      if defined? @md.publisher \ +      and @md.publisher                                                        # DublinCore 5 - publisher (current copy published by) +        @rdf_publisher=%{    dc.publisher="#{@md.publisher}"\n} +        content=meta_content_clean(@md.publisher) +        @publisher=%{  <meta name="dc.publisher" content="#{content}" />\n} +      end +      if defined? @md.creator.contributor \ +      and @md.creator.contributor=~/\S+/                                      # DublinCore 6 - contributor +        @rdf_contributor=%{    dc.contributor="#{@md.creator.contributor}"\n} +        content=meta_content_clean(@md.creator.contributor) +        @contributor=%{  <meta name="dc.contributor" content="#{content}" />\n} +      end +      if defined? @md.date.published \ +      and @md.date.published=~/\S+/                                           # DublinCore 7 - date year-mm-dd +        @rdf_date=%{    dc.date="#{@md.date.published}"\n} +        @date=%{  <meta name="dc.date" content="#{@md.date.published}" #{@md.date_scheme} />\n} # fix @md.date_scheme +      end +      if defined? @md.date.created \ +      and @md.date.created=~/\S+/                                             # DublinCore 7 - date.created year-mm-dd +        @rdf_date_created=%{    dc.date.created="#{@md.date.created}"\n} +        @date_created=%{  <meta name="dc.date.created" content="#{@md.date.created}" #{@md.date_scheme} />\n} +      end +      if defined? @md.date.issued \ +      and @md.date.issued=~/\S+/                                              # DublinCore 7 - date.issued year-mm-dd +        @rdf_date_issued=%{    dc.date.issued="#{@md.date.issued}"\n} +        @date_issued=%{  <meta name="dc.date.issued" content="#{@md.date.issued}" #{@md.date_scheme} />\n} +      end +      if defined? @md.date.available \ +      and @md.date.available=~/\S+/                                           # DublinCore 7 - date.available year-mm-dd +        @rdf_date_available=%{    dc.date.available="#{@md.date.available}"\n} +        @date_available=%{  <meta name="dc.date.available" content="#{@md.date.available}" #{@md.date_scheme} />\n} +      end +      if defined? @md.date.valid \ +      and @md.date.valid=~/\S+/                                               # DublinCore 7 - date.valid year-mm-dd +        @rdf_date_valid=%{    dc.date.valid="#{@md.date.valid}"\n} +        @date_valid=%{  <meta name="dc.date.valid" content="#{@md.date.valid}" #{@md.date_scheme} />\n} +      end +      if defined? @md.date.modified \ +      and @md.date.modified=~/\S+/                                            # DublinCore 7 - date.modified year-mm-dd +        @rdf_date_modified=%{    dc.date.modified="#{@md.date.modified}"\n} +        @date_modified=%{  <meta name="dc.date.modified" content="#{@md.date.modified}" #{@md.date_scheme} />\n} +      end +      if defined? @md.rights.all \ +      and @md.rights.all                                                      # DublinCore 15 - rights +        @rdf_rights=%{    dc.rights="#{@md.rights.all}"\n} +        content=meta_content_clean(@md.rights.all) +        @rights=%{  <meta name="dc.rights" content="#{content}" />\n} +      end +      if defined? @md.classify.subject \ +      and @md.classify.subject=~/\S+/                                          # DublinCore 3 - subject (us library of congress, eric or udc, or schema???) +        @rdf_subject=%{    dc.subject="#{@md.classify.subject}"\n} +        content=meta_content_clean(@md.classify.subject) +        @subject=%{  <meta name="dc.subject" content="#{content}" />\n} +      end +      if defined? @md.notes.description \ +      and @md.notes.description=~/\S+/                                         # DublinCore 4 - description +        @rdf_description=%{    dc.description="#{@md.notes.description}"\n} +        content=meta_content_clean(@md.notes.description) +        @description=%{  <meta name="dc.description" content="#{content}" />\n} +      end +      if defined? @md.notes.coverage \ +      and @md.notes.coverage=~/\S+/                                            # DublinCore 14 - coverage +        @rdf_coverage=%{    dc.coverage="#{@md.notes.coverage}"\n} +        content=meta_content_clean(@md.notes.coverage) +        @coverage=%{  <meta name="dc.coverage" content="#{content}" />\n} +      end +      if defined? @md.notes.relation \ +      and @md.notes.relation=~/\S+/                                            # DublinCore 13 - relation +        @rdf_relation=%{    dc.relation="#{@md.notes.relation}"\n} +        content=meta_content_clean(@md.notes.relation) +        @relation=%{  <meta name="dc.relation" content="#{content}" />\n} +      end +      if defined? @md.notes.type \ +      and @md.notes.type                                                       # DublinCore 8 - type (genre eg. report, convention etc) +        @rdf_type=%{    dc.type="#{@md.notes.type}"\n} +        content=meta_content_clean(@md.notes.type) +        @type=%{  <meta name="dc.type" content="#{content}" />\n} +      end +      if defined? @md.notes.format \ +      and @md.notes.format=~/\S+/                                              # DublinCore 9 - format (use your mime type) +        @rdf_format=%{    dc.format="#{@md.notes.format}"\n} +        content=meta_content_clean(@md.notes.format) +        @format=%{  <meta name="dc.format" content="#{content}" />\n} +      end +      #if defined? @md.identifier.sisupod \ +      #and @md.identifier.sisupod=~/\S+/                                       # DublinCore 10 - identifier (your identifier, could use urn which is free) +      #  @rdf_identifier=%{    dc.identifier="#{@md.identifier.sisupod}"\n} +      #  content=meta_content_clean(@md.identifier.sisupod) +      #  @identifier=%{  <meta name="dc.identifier" content="#{content}" />\n} +      #end +      if defined? @md.original.source \ +      and @md.original.source=~/\S+/                                           # DublinCore 11 - source (document source) +        @rdf_source=%{    dc.source="#{@md.original.source}"\n} +        content=meta_content_clean(@md.original.source) +        @source=%{  <meta name="dc.source" content="#{content}" />\n} +      end +      if defined? @md.title.language \ +      and @md.title.language=~/\S+/                                            # DublinCore 12 - language (English) +        @rdf_language=%{    dc.language="#{@md.title.language}"\n} +        @language=%{  <meta name="dc.language" content="#{@md.title.language}" />\n} +      end +      if defined? @md.original.language \ +      and @md.original.language=~/\S+/ +        @rdf_language_original=%{    dc.language="#{@md.original.language}"\n} +        @language_original=%{  <meta name="dc.language" content="#{@md.original.language}" />\n} +      end +      content=meta_content_clean(@md.keywords) +      @keywords=%{  <meta name="keywords" content="#{content}" />\n} if @md.keywords +    end +    def meta_content_clean(content='') +      content=if not content.nil? +        content=content.tr('"',"'"). +           gsub(/&/,'&') +        content=SiSU_XML_Munge::Trans.new(@md).char_enc.utf8(content) +      else content +      end +    end +    def rdfseg #segHead +      rdftoc +    end +    def comment_xml(extra='') +      generator="Generated by: #{@md.project_details.project} #{@md.project_details.version} of #{@md.project_details.date_stamp} (#{@md.project_details.date})"  if @md.project_details.version +      lastdone="Last Generated on: #{Time.now}" +      rubyv="Ruby version: #{@md.ruby_version}" +      sc=if @md.sc_info +        "Source file: #{@md.sc_filename} version: #{@md.sc_number} of: #{@md.sc_date}" +      else '' +      end +      if extra.empty? +<<WOK +<!-- Document processing information: +     * #{generator} +     * #{rubyv} +     * #{sc} +     * #{lastdone} +     * SiSU http://www.jus.uio.no/sisu +--> +WOK +     else +<<WOK +<!-- Document processing information: +     * #{extra} +     * #{generator} +     * #{rubyv} +     * #{sc} +     * #{lastdone} +     * SiSU http://www.jus.uio.no/sisu +--> +WOK +      end +    end +    def comment_xml_sax +      desc='SiSU XML, SAX type representation' +      comment_xml(desc) +    end +    def comment_xml_node +      desc='SiSU XML, Node type representation' +      comment_xml(desc) +    end +    def comment_xml_dom +      desc='SiSU XML, DOM type representation' +      comment_xml(desc) +    end +    def metatag_html #values strung together, because some empty, and resulting output (line breaks) is much better +<<WOK +#{@full_title}#{@subtitle}#{@author}#{@subject}#{@description}#{@publisher}#{@contributor}#{@date}#{@date_created}#{@date_issued}#{@date_available}#{@date_valid}#{@date_modified}#{@type}#{@format}#{@identifier}#{@source}#{@language}#{@relation}#{@coverage}#{@rights}#{@copyright}#{@owner} +#{SiSU_Proj_XML::Bits.new.txt_generator} +#{the_png.ico} +WOK +    end +  end +end +module SiSU_JSON_Shared +  require_relative 'xhtml_table'                        # xhtml_table.rb +  class TableJSON < SiSU_XHTML_Table::TableXHTML +  end +end +__END__ diff --git a/lib/sisu/se_file_op.rb b/lib/sisu/se_file_op.rb index 8a47b1cd..9a95baa5 100644 --- a/lib/sisu/se_file_op.rb +++ b/lib/sisu/se_file_op.rb @@ -418,6 +418,12 @@ module SiSU_File_Op          fn=base_filename.xml_scaffold_structure_collapse          make_file(path,fn)        end +      def json +        path=output_path.json.dir +        make_path(path) +        fn=base_filename.json +        make_file(path,fn) +      end        def manpage          path=output_path.manpage.dir          make_path(path) @@ -713,6 +719,17 @@ module SiSU_File_Op          end          self        end +      def json +        def dir +          output_path.json.dir + '/' \ +          + base_filename.json +        end +        def rel +          output_path.json.rel + '/' \ +          + base_filename.json +        end +        self +      end        def sqlite_discrete          def dir            output_path.sqlite_discrete.dir + '/' \ @@ -1241,6 +1258,24 @@ module SiSU_File_Op          end          i18n(fnh)        end +      def json(fh=nil) +        fh=default_hash_build(fh,Sfx[:json]) +        fh[:lng]=lang_code?(fh[:lng]) +        fnh=if output_dir_structure.by_filename? +          { +            fn: 'scroll', +            ft: fh[:ft], +            lng: fh[:lng], +          } +        else +          { +            fn: fh[:fn], +            ft: fh[:ft], +            lng: fh[:lng], +          } +        end +        i18n(fnh) +      end        def pdf_p(fh=nil)          fh=default_hash_build(fh,Sfx[:pdf])          fh[:lng]=lang_code?(fh[:lng]) @@ -2330,6 +2365,30 @@ module SiSU_File_Op          end          self        end +      def json +        def ft +          'json' +        end +        def dir +          set_path(ft).dir.abc +        end +        def url +          set_path(ft).url.abc +        end +        def rel +          set_path(ft).rel.abc +        end +        def rcp +          set_path(ft).rcp.abc +        end +        def rel_sm +          set_path(ft).rel_sm.ab +        end +        def rel_image +          '../../_sisu/image' +        end +        self +      end        def pdf          def ft            'pdf' diff --git a/lib/sisu/shared_metadata.rb b/lib/sisu/shared_metadata.rb index fe4813a6..c69aa759 100644 --- a/lib/sisu/shared_metadata.rb +++ b/lib/sisu/shared_metadata.rb @@ -951,6 +951,18 @@ WOK        end        self      end +    def json +      def meta_para +        <<WOK + +#{@tag.capitalize}: #{@inf} +WOK +      end +      def metadata +        SiSU_Metadata::Summary.new(@md).metadata_base +      end +      self +    end      def plaintext        def meta_para          <<WOK diff --git a/lib/sisu/urls.rb b/lib/sisu/urls.rb index 86eb2e33..b2674fc4 100644 --- a/lib/sisu/urls.rb +++ b/lib/sisu/urls.rb @@ -335,6 +335,15 @@ module SiSU_Urls          end          self        end +      def json +        { +          cmd: '--js (json)', +          viewer: @prog.web_browser, +          f_pth: @md.file.output_path.json.dir + '/' \ +          + @md.file.base_filename.json, +          fn: @fn[:json], +        } +      end        def pdf          def landscape            { @@ -620,6 +629,10 @@ module SiSU_Urls                show.report(report_info.xml.scaffold_collapse)                #show.maintenance(report_info.xml.scaffold_collapse)              end +            if @opt.act[:json][:set]==:on +              show.report(report_info.json) +              #show.maintenance(report_info.json) +            end              if (@opt.act[:pdf][:set]==:on \              or @opt.act[:pdf_p][:set]==:on \              or @opt.act[:pdf_l][:set]==:on) | 
