-*- mode: org -*- #+TITLE: sisu json #+DESCRIPTION: documents - structuring, various output representations & search #+FILETAGS: :sisu:json: #+AUTHOR: Ralph Amissah #+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] #+COPYRIGHT: Copyright (C) 2015 - 2021 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty #+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no #+PROPERTY: header-args+ :results no #+PROPERTY: header-args+ :cache no #+PROPERTY: header-args+ :padline no #+PROPERTY: header-args+ :mkdirp yes * json.rb #+HEADER: :tangle "../lib/sisu/json.rb" #+BEGIN_SRC ruby #<> 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]}/, '\1\2 '). gsub(/#{Mx[:en_b_o]}([*+]\d+)\s+(.+?)#{Mx[:en_b_c]}/, '\1\2 '). gsub(/#{Mx[:en_a_o]}([*+]+)\s+(.+?)#{Mx[:en_a_c]}/, '\1\2 ') 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, < ##{Ax[:tab]*2}\\1. \\2 ##{Ax[:tab]*1}

#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 << %{} 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]}/,'\1'). #footnote/endnote clean gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'\1') 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": "} + wrapped + %{} + ((@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]}/,'\1'). #footnote/endnote clean gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'\1') #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]}/,'\1'). #footnote/endnote clean gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'\1') #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}\n#{Ax[:tab]*y}" if @level[x]==true end 3.downto(1) do |x| y=x - 1 @per.body << "#{Ax[:tab]*y}" 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__ #+END_SRC * json_parts.rb #+HEADER: :tangle "../lib/sisu/json_parts.rb" #+BEGIN_SRC ruby #<> module SiSU_Parts_JSON require_relative 'generic_parts' # generic_parts.rb include SiSU_Parts_Generic def the_line_break '
' end def the_table_close ' ' 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__ #+END_SRC * json_shared.rb #+HEADER: :tangle "../lib/sisu/json_shared.rb" #+BEGIN_SRC ruby #<> 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(/
/,' \\ '). 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,' '). # 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,'
'). gsub(/#{Mx[:br_paragraph]}/u,'
'). gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'
') 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]}/,'\1'). #reinstate gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/m,'\1'). gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/m,'\1'). gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1'). gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1'). gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1'). gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1'). gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1'). gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1'). gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'\1'). 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]}/,'\1'). gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1'). gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1'). gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1') dob.obj=dob.obj.gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'
') 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]}/, '\1'). 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]}/, '\1'). gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:rel_o]}(\S+?)#{Mx[:rel_c]}/, '\1'). gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))[ ]+(\d+)x(\d+)(\s+[^}]+)?#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, %{[\\1] \\4}). gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))([ ]+[^}]+)?#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, %{\\1}). gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))[ ]+(\d+)x(\d+)(\s+[^}]+)?#{Mx[:lnk_c]}image/, %{[\\1] \\4}). gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}[ ]*(\S+?\.(?:jpg|png|gif))([ ]+[^}]+)?#{Mx[:lnk_c]}image/, %{\\1}). gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, '\1'). #watch, compare html_tune gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, %{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}). gsub(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/, '\1') #escaped urls not linked, deal with later else dob.obj=dob.obj.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(/\/\{(.+?)\}\//,'\1'). gsub(/[*!]\{(.+?)\}[*!]/,'\1'). gsub(/_\{(.+?)\}_/,'\1'). gsub(/-\{(.+?)\}-/,'\1'). gsub(//,'
'). 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)/, "#{@md.file.output_path.xml.rel_image}\/\\1"). 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,'[\1]'). 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]}/,'
') unless is==:table str=str.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'\1'). gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1'). gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1'). gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1'). gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1'). gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1'). gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1'). gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1'). gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'\1'). # 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,''). gsub(/#{Mx[:url_o]}(.+?)#{Mx[:url_c]}/,"#{Dx[:url_o]}\\1#{Dx[:url_c]}"). gsub(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,''). 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,'\2'). gsub(/\\\\/,''). 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]}/,'
') unless dob.is==:table dob.obj=dob.obj.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'\1'). gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1'). gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1'). gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1'). gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1'). gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1'). gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1'). gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1'). gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'\1'). # 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:
\n:spaces1:\n:spaces1:\n:spaces0:
#{Xx[:split]}}). # common image location, else use ./images gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(.+?)#{Mx[:url_c]}/, '\1'). gsub(/#{Mx[:url_o]}(.+?)#{Mx[:url_c]}/, '\1'). gsub(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,''). 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(//,'>') else # p dob.is ?? end dob end def markup_group(dob='') dob.obj=dob.obj.gsub(//,'>'). gsub(/<:?br(?:\s+\/)?>/,'
'). gsub(/<(link xmlns:xl=".+?")>/,'<\1>'). gsub(/<(\/link)>/,'<\1>'). gsub(/<(\/?en)>/,'<\1>') dob end def markup_block(dob='') dob.obj=dob.obj.gsub(//,'>'). gsub(/<:?br(?:\s+\/)?>/,'
'). 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, %{\\2}). gsub(/\b(vol):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(pub):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(ref):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(desc):\{(.+?)\}:\1\b/m,%{\\2}). gsub(/\b(conv):\{(.+?)\}:\1\b/m,%{\\2}). gsub(/\b(ct):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(cty):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(org):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(dt):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/\b(n):\{(.+?)\}:\1\b/m, %{\\2}). gsub(/([a-z]+(?:[_:.][a-z]+)*)(?::\{(.+?)\}:\1)/m,'\2') 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, %{\\1}). gsub(/:\{(.+?)\}:n\b/m, %{\\1}). gsub(/:\{(.+?)\}:ti\b/m, %{\\1}). gsub(/:\{(.+?)\}:ref\b/m, %{\\1}). gsub(/:\{(.+?)\}:desc\b/m, %{\\1}). gsub(/:\{(.+?)\}:cty\b/m, %{\\1}). gsub(/:\{(.+?)\}:org\b/m, %{\\1}). gsub(/:\{(.+?)\}:([a-z]+(?:[_:.][a-z]+)*)/m,'\1'). gsub(/;\{([^}]+(?![;]))\};ti\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};qt\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};ref\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};ed\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};v\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};desc\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};def\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};trans\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};y\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};ab\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};pg\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};fn?\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};mn?\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};ln?\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};in\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};uni\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};fac\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};inst\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};dept\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};org\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};com?\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};cty\b/m, %{\\1}). gsub(/;\{([^}]+(?![;]))\};([a-z]+(?:[_:.][a-z]+)*)/m,'\1') 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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \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=%{ \n} end if defined? @md.original.language \ and @md.original.language=~/\S+/ @rdf_language_original=%{ dc.language="#{@md.original.language}"\n} @language_original=%{ \n} end content=meta_content_clean(@md.keywords) @keywords=%{ \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 else < 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 <> 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+)/, '' + '  \1') else '' end p_num_display end def name p_num_name=@paranum.gsub(/(\d+)/,'') p_num_name end def goto p_num_goto=@paranum.gsub(/(\d+)/,'') 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=%{\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=%{\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=%{\n} end if defined? @md.notes.description \ and @md.notes.description=~/\S+/ # DublinCore 4 - description @rdf_description=%{ dc.description="#{@md.notes.description}"\n} @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=%{\n} end if defined? @md.creator.contributor \ and @md.creator.contributor=~/\S+/ # DublinCore 6 - contributor @rdf_contributor=%{ dc.contributor="#{@md.creator.contributor}"\n} @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=%{\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=%{\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=%{\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=%{\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=%{\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=%{\n} end if defined? @md.notes.coverage \ and @md.notes.coverage=~/\S+/ # DublinCore 14 - coverage @rdf_coverage=%{ dc.coverage="#{@md.notes.coverage}"\n} @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=%{\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=%{\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=%{\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=%{\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=%{\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=%{\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=%{\n} end @copyright=%{\n} \ if @md.rights.copyright.all # possibly redundant see dc.rights @owner=%{\n} if @md.owner @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 ' ' end def toc_head < #{@md.html_title} #{@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 #{@color.body} #{@font.css_table_file} #{@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+|)$/, %{}) else @ocn.gsub(/^(\d+|)$/, %{}) end else ocn_class='ocn_off' @ocn.gsub(/^(\d+|)$/, %{}) end end def name %{} end def id #w3c? "tidy" complains about numbers as identifiers ! annoying %{id="o#{@ocn}"} end def goto %{} 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]/; %{} #consider: h_#{headname} else %{} 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) %{
#{@p_num.ocn_display} <#{tag} class="#{attrib}" #{@p_num.id}>#{@p_num.name} #{@headname}#{@txt}
} 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) %{
<#{tag} class="#{attrib}"> #{@txt}
} 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 "
#{@txt} #{@trailer}
" end def table_css_end # '

' 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+)\)/,'(\1)'). gsub(/^(#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]})\s*\((i+|iv|v|vi+|ix|x|xi+)\)/,'\1(\2)') when /^\s*\(?(\d|[a-z])+\)/ @txt.gsub(/^\((\d+|[a-z])+\)/,'(\1)'). gsub(/^(#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]})\s*\((\d+|[a-z])+\)/,'\1(\2)') when /^\s*\d{1,3}\.\s/ @txt.gsub(/^\s*(\d+\.)/,'\1') when /^\s*[A-Z]\.\s/ @txt.gsub(/^\s*([A-Z]\.)/,'\1') else @txt end end def bold_para %{#{the_margin.txt_0}

#{@txt}

#{the_margin.num_css}     #{the_table_close}} end def bold_header @txt=@txt.gsub(/[1-9]~(\S+)/,''). gsub(/[1-9]~/,'') %{

#{@txt}

#{the_margin.num_css}     #{the_table_close}} end def toc_head_copy_at %{

#{@txt}

\n} end def center %{

#{@txt}

\n} end def bold %{

#{@txt}

\n} end def center_bold %{

#{@txt}

\n} end end end __END__ #+END_SRC * json_persist.rb #+HEADER: :tangle "../lib/sisu/json_persist.rb" #+BEGIN_SRC ruby #<> 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__ #+END_SRC * document header #+NAME: sisu_document_header #+BEGIN_SRC text encoding: utf-8 - Name: SiSU - Description: documents, structuring, processing, publishing, search json - Author: Ralph Amissah - Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019, 2020, 2021, 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 . If you have Internet connection, the latest version of the GPL should be available at these locations: - SiSU uses: - Standard SiSU markup syntax, - Standard SiSU meta-markup syntax, and the - Standard SiSU object citation numbering and system - Homepages: - Git #+END_SRC