# encoding: utf-8 =begin * Name: SiSU ** Description: documents, structuring, processing, publishing, search *** system environment, resource control and configuration details ** Author: Ralph Amissah [ralph@amissah.com] [ralph.amissah@gmail.com] ** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 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/shared_metadata.rb;hb=HEAD] =end module SiSU_Metadata require_relative 'xml_parts' # xml_parts.rb require_relative 'xml_shared' # xml_shared.rb class Summary include SiSU_Parts_XML attr_accessor :tag,:inf,:class,:attrib def initialize(md,display_heading=false) @md,@display_heading=md,display_heading @tag,@inf,@class,@attrib=nil end def metadata_base meta=[] l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language language=l[:n] tr=SiSU_Translate::Source.new(@md,language) @attrib='md' def meta_content_clean(content='') content=if not content.nil? content=content.tr('"',"'"). gsub(/&/,'&') else content end end if @display_heading @tag,@inf=%{Document Metadata},'' meta << self.meta_para end if defined? @md.title.full \ and @md.title.full=~/\S+/ @tag,@inf,@class=tr.full_title,@md.title.full,'dc' #1 meta << self.meta_para end if defined? @md.creator.author \ and @md.creator.author=~/\S+/ @tag,@inf,@class=tr.author,@md.creator.author,'dc' #2 meta << self.meta_para end if defined? @md.creator.translator \ and @md.creator.translator=~/\S+/ @tag,@inf,@class=tr.translator,@md.creator.translator,'ext' meta << self.meta_para end if defined? @md.creator.illustrator \ and @md.creator.illustrator=~/\S+/ @tag,@inf,@class=tr.illustrator,@md.creator.illustrator,'ext' meta << self.meta_para end if defined? @md.creator.prepared_by \ and @md.creator.prepared_by=~/\S+/ @tag,@inf,@class=tr.prepared_by,@md.creator.prepared_by,'ext' meta << self.meta_para end if defined? @md.creator.digitized_by \ and @md.creator.digitized_by=~/\S+/ @tag,@inf,@class=tr.digitized_by,@md.creator.digitized_by,'ext' meta << self.meta_para end if defined? @md.creator.contributor \ and @md.creator.contributor=~/\S+/ @tag,@inf,@class=tr.contributor,@md.creator.contributor,'dc' #6 meta << self.meta_para end if defined? @md.rights.all \ and @md.rights.all=~/\S+/ @tag,@inf,@class=tr.rights,meta_content_clean(@md.rights.all),'dc' #15 meta << self.meta_para end if defined? @md.classify.subject \ and @md.classify.subject=~/\S+/ @tag,@inf,@class=tr.subject,@md.classify.subject,'dc' #3 meta << self.meta_para end if defined? @md.classify.keywords \ and @md.classify.keywords=~/\S+/ @tag,@inf,@class=tr.keywords,@md.classify.keywords,'ext' meta << self.meta_para end if defined? @md.classify.loc \ and @md.classify.loc=~/\S+/ @tag,@inf,@class=tr.cls_loc,@md.classify.loc,'id' meta << self.meta_para end if defined? @md.classify.dewey \ and @md.classify.dewey=~/\S+/ @tag,@inf,@class=tr.cls_dewey,@md.classify.dewey,'id' meta << self.meta_para end if defined? @md.publisher \ and @md.publisher=~/\S+/ @tag,@inf,@class=tr.publisher,@md.publisher,'dc' #5 meta << self.meta_para end if defined? @md.date.created \ and @md.date.created=~/\S+/ @tag,@inf,@class=tr.date_created,@md.date.created,'dc' #7 meta << self.meta_para end if defined? @md.date.issued \ and @md.date.issued=~/\S+/ @tag,@inf,@class=tr.date_issued,@md.date.issued,'dc' #7 meta << self.meta_para end if defined? @md.date.available \ and @md.date.available=~/\S+/ @tag,@inf,@class=tr.date_available,@md.date.available,'dc' #7 meta << self.meta_para end if defined? @md.date.modified \ and @md.date.modified=~/\S+/ @tag,@inf,@class=tr.date_modified,@md.date.modified,'dc' #7 meta << self.meta_para end if defined? @md.date.valid \ and @md.date.valid=~/\S+/ @tag,@inf,@class=tr.date_valid,@md.date.valid,'dc' #7 meta << self.meta_para end if defined? @md.date.published \ and @md.date.published=~/\S+/ @tag,@inf,@class=tr.date,@md.date.published,'dc' #7 meta << self.meta_para end if defined? @md.identifier.isbn \ and @md.identifier.isbn=~/\S+/ @tag,@inf,@class=tr.cls_isbn,@md.identifier.isbn,'id' meta << self.meta_para end if defined? @md.identifier.oclc \ and @md.identifier.oclc=~/\S+/ @tag,@inf,@class=tr.cls_oclc,@md.identifier.oclc,'id' meta << self.meta_para end if defined? @md.notes.description \ and @md.notes.description=~/\S+/ @tag,@inf,@class=tr.description,@md.notes.description,'dc' #4 meta << self.meta_para end if defined? @md.notes.abstract \ and @md.notes.abstract=~/\S+/ @tag,@inf,@class=tr.abstract,@md.notes.abstract,'ext' meta << self.meta_para end if defined? @md.notes.comment \ and @md.notes.comment=~/\S+/ @tag,@inf,@class=tr.comments,@md.notes.comment,'ext' meta << self.meta_para end if defined? @md.notes.coverage \ and @md.notes.coverage=~/\S+/ @tag,@inf,@class=tr.coverage,@md.notes.coverage,'dc' #14 meta << self.meta_para end if defined? @md.notes.relation \ and @md.notes.relation=~/\S+/ @tag,@inf,@class=tr.relation,@md.notes.relation,'dc' #13 meta << self.meta_para end #if defined? @md.notes.source \ #and @md.notes.source=~/\S+/ # @tag,@inf,@class=tr.source,@md.notes.source,'dc' #11 # meta << self.meta_para #end if defined? @md.notes.history \ and @md.notes.history=~/\S+/ @tag,@inf,@class=tr.type,@md.notes.history,'dc' #8 meta << self.meta_para end if defined? @md.notes.type \ and @md.notes.type=~/\S+/ @tag,@inf,@class=tr.type,@md.notes.type,'dc' #8 meta << self.meta_para end if defined? @md.notes.format \ and @md.notes.format=~/\S+/ @tag,@inf,@class=tr.format,@md.notes.format,'dc' #9 meta << self.meta_para end if defined? @md.notes.prefix_a \ and @md.notes.prefix_a=~/\S+/ @tag,@inf,@class=tr.prefix_a,@md.notes.prefix_a,'inf' meta << self.meta_para end if defined? @md.notes.prefix_b \ and @md.notes.prefix_b=~/\S+/ @tag,@inf,@class=tr.prefix_b,@md.notes.prefix_b,'inf' meta << self.meta_para end if defined? @md.original.source \ and @md.original.source=~/\S+/ @tag,@inf,@class=tr.source,@md.original.source,'dc' #11 meta << self.meta_para end if defined? @md.title.language \ and @md.title.language=~/\S+/ @tag,@inf,@class=tr.language,@md.title.language,'dc' #12 meta << self.meta_para end if defined? @md.original.language \ and @md.original.language=~/\S+/ @tag,@inf,@class=tr.language_original,@md.original.language,'ext' meta << self.meta_para end if @display_heading @tag,@inf=%{Version Information},'' meta << self.meta_para end if defined? @md.fns \ and @md.fns=~/\S+/ @tag,@inf,@class=tr.sourcefile,@md.fns,'src' meta << self.meta_para end if defined? @md.file_encoding \ and @md.file_encoding=~/\S+/ @tag,@inf,@class='Filetype',@md.file_encoding,'src' meta << self.meta_para end if defined? @md.dgst \ and @md.dgst.is_a?(Array) @tag,@inf,@class='Source Digest',"#{@md.dgst[0]} #{@md.dgst[1]}",'src' meta << self.meta_para end if @display_heading @tag,@inf=%{Generated},'' meta << self.meta_para end if defined? @md.project_details \ and @md.project_details.version=~/\S+/ v="#{tr.sisu_version}: " + "#{@md.project_details.project} " + "#{@md.project_details.version} " + "of #{@md.project_details.date_stamp} " + "(#{@md.project_details.date})" @tag,@inf,@class='Generated by',v,'ver' meta << self.meta_para end if defined? @md.ruby_version \ and @md.ruby_version=~/\S+/ @tag,@inf,@class=tr.ruby_version,@md.ruby_version,'ver' meta << self.meta_para end if defined? @md.generated \ and @md.generated.is_a?(Time) @tag,@inf,@class=tr.last_generated,@md.generated,'date' meta << self.meta_para end meta end def metadata_alt meta=[] if @display_heading @tag,@inf=%{Document Metadata},'' meta << self.meta_para end if defined? @md.title.main \ and @md.title.main=~/\S+/ @tag='title' @inf=@md.title.main meta << self.meta_para end if defined? @md.title.sub \ and @md.title.sub=~/\S+/ @tag='subtitle' @inf=@md.title.sub meta << self.meta_para end if defined? @md.creator.author \ and @md.creator.author=~/\S+/ @tag='author' @inf=@md.creator.author meta << self.meta_para end if defined? @md.creator.translator \ and @md.creator.translator=~/\S+/ @tag='translator' @inf=@md.creator.translator meta << self.meta_para end if defined? @md.creator.illustrator \ and @md.creator.illustrator=~/\S+/ @tag='illustrator' @inf=@md.creator.illustrator meta << self.meta_para end if defined? @md.rights.copyright.text \ and @md.rights.copyright.text=~/\S+/ @tag='copyright' @inf=@md.rights.copyright.text # year & holder @inf=@inf.gsub(/(?:Copyright|\(C\))+\s*/,'') meta << self.meta_para end if defined? @md.rights.license \ and @md.rights.license=~/\S+/ @tag='license' @inf=@md.rights.license meta << self.meta_para end meta end def processing_tags def make def language if defined? @md.make.language \ and @md.make.language ' :language: ' + @md.make.language.join(', ') else nil end end def headings if defined? @md.make.headings \ and @md.make.headings ' :headings: ' + @md.make.headings[0].join('; ') else nil end end def num_top if defined? @md.make.num_top \ and @md.make.num_top ' :num_top: ' + @md.make.num_top else nil end end def breaks x=if defined? @md.make.breaks \ and @md.make.breaks x=' :breaks:' if @md.make.breaks[:page_break] x +=' break=' + @md.make.breaks[:page_break] + ';' end if @md.make.breaks[:page_new] x +=' new=' + @md.make.breaks[:page_new] + ';' end else nil end end def emphasis if defined? @md.make.emphasis \ and @md.make.emphasis ' :emphasis: ' + @md.make.emphasis[:regx].inspect else nil end end def bold if defined? @md.make.bold \ and @md.make.bold ' :bold: ' + @md.make.bold[:regx].inspect else nil end end def italics if defined? @md.make.italics \ and @md.make.italics ' :italics: ' + @md.make.italics[:regx].inspect else nil end end def texpdf_font if defined? @md.make.texpdf_font \ and @md.make.texpdf_font ' :texpdf_font: ' + @md.make.texpdf_font.main else nil end end self end self end def metadata_tags def title def main if defined? @md.title.main \ and @md.title.main '@title: ' + @md.title.main else '@title:' end end def sub if defined? @md.title.sub \ and @md.title.sub ' :subtitle: ' + @md.title.sub else nil end end def edition if defined? @md.title.edition \ and @md.title.edition ' :edition: ' + @md.title.edition else nil end end def note if defined? @md.title.note \ and @md.title.note ' :note: ' + @md.title.note else nil end end def short if defined? @md.title.short \ and @md.title.short ' :short: ' + @md.title.short else nil end end def language if defined? @md.title.language \ and @md.title.language ' :language: ' + @md.title.language else nil end end def language_char if defined? @md.title.language_char \ and @md.title.language_char ' :language_char: ' + @md.title.language_char else nil end end self end def creator def head '@creator:' end def author x=if defined? @md.creator.author_detail \ and @md.creator.author_detail x='' @md.creator.author_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :author: ' + x else nil end end def contributor x=if defined? @md.creator.contributor_detail \ and @md.creator.contributor_detail x='' @md.creator.contributor_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :contributor: ' + x else nil end end def illustrator x=if defined? @md.creator.illustrator_detail \ and @md.creator.illustrator_detail x='' @md.creator.illustrator_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :illustrator: ' + x else nil end end def photographer x=if defined? @md.creator.photographer_detail \ and @md.creator.photographer_detail x='' @md.creator.photographer_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :photographer: ' + x else nil end end def translator x=if defined? @md.creator.translator_detail \ and @md.creator.translator_detail x='' @md.creator.translator_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :translator: ' + x else nil end end def audio x=if defined? @md.creator.audio_detail \ and @md.creator.audio_detail x='' @md.creator.audio_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :audio: ' + x else nil end end def digitized_by x=if defined? @md.creator.digitized_by_detail \ and @md.creator.digitized_by_detail x='' @md.creator.digitized_by_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :digitized_by: ' + x else nil end end def prepared_by x=if defined? @md.creator.prepared_by_detail \ and @md.creator.prepared_by_detail x='' @md.creator.prepared_by_detail.each do |n| x += "#{n[:the]}, #{n[:others]}; " end x=x.gsub(/;\s*$/,'') ' :prepared_by: ' + x else nil end end self end def rights def head '@rights:' end def copyright def text if defined? @md.rights.copyright.text \ and @md.rights.copyright.text ' :copyright: ' + @md.rights.copyright.text else nil end end def translation if defined? @md.rights.copyright.translation \ and @md.rights.copyright.translation ' :translation: ' + @md.rights.copyright.translation else nil end end def illustrations if defined? @md.rights.copyright.illustrations \ and @md.rights.copyright.illustrations ' :illustrations: ' + @md.rights.copyright.illustrations else nil end end def photographs if defined? @md.rights.copyright.photographs \ and @md.rights.copyright.photographs ' :photographs: ' + @md.rights.copyright.photographs else nil end end def digitization if defined? @md.rights.copyright.digitization \ and @md.rights.copyright.digitization ' :digitization: ' + @md.rights.copyright.digitization else nil end end def audio if defined? @md.rights.copyright.audio \ and @md.rights.copyright.audio ' :audio: ' + @md.rights.copyright.audio else nil end end self end def license if defined? @md.rights.license \ and @md.rights.license ' :license: ' + @md.rights.license else nil end end self end def classify def head '@classify:' end def coverage if defined? @md.classify.coverage \ and @md.classify.coverage ' :coverage: ' + @md.classify.coverage else nil end end def relation if defined? @md.classify.relation \ and @md.classify.relation ' :relation: ' + @md.classify.relation else nil end end def subject if defined? @md.classify.subject \ and @md.classify.subject ' :subject: ' + @md.classify.subject else nil end end def topic_register if defined? @md.classify.topic_register \ and @md.classify.topic_register ' :topic_register: ' + @md.classify.topic_register else nil end end def type # if defined? @md.classify.type \ # and @md.classify.type # ' :type: ' + @md.classify.type # else nil # end nil end #def identifier # if defined? @md.classify.identifier \ # and @md.classify.identifier # ' :identifier: ' + @md.classify.identifier # else nil # end #end def loc if defined? @md.classify.loc \ and @md.classify.loc ' :loc: ' + @md.classify.loc else nil end end def dewey if defined? @md.classify.dewey \ and @md.classify.dewey ' :dewey: ' + @md.classify.dewey else nil end end def oclc if defined? @md.classify.oclc \ and @md.classify.oclc ' :oclc: ' + @md.classify.oclc else nil end end def pg if defined? @md.classify.pg \ and @md.classify.pg ' :pg: ' + @md.classify.pg else nil end end def isbn if defined? @md.classify.isbn \ and @md.classify.isbn ' :isbn: ' + @md.classify.isbn else nil end end self end def date def head '@date:' end def added_to_site if defined? @md.date.added_to_site \ and @md.date.added_to_site ' :added_to_site: ' + @md.date.added_to_site else nil end end def available if defined? @md.date.available \ and @md.date.available ' :available: ' + @md.date.available else nil end end def created if defined? @md.date.created \ and @md.date.created ' :created: ' + @md.date.created else nil end end def issued if defined? @md.date.issued \ and @md.date.issued ' :issued: ' + @md.date.issued else nil end end def modified if defined? @md.date.modified \ and @md.date.modified ' :modified: ' + @md.date.modified else nil end end def published if defined? @md.date.published \ and @md.date.published ' :published: ' + @md.date.published else nil end end def valid if defined? @md.date.valid \ and @md.date.valid ' :valid: ' + @md.date.valid else nil end end self end #def make # def headings # @md.make.headings \ # ? (' :headings: ' + @md.make.headings) \ # : nil # end #end self end def char_enc(str) @s=str def amp if @s \ and @s.is_a?(String) @s=@s.gsub(/&/u,'&') end @s end def br if @s \ and @s.is_a?(String) @s=@s.gsub(/(?:#{Mx[:br_line]}|\\\\)+/,'
') end @s end def utf8 if @s \ and @s.is_a?(String) @s=@s.gsub(//u,Mx[:br_paragraph]). gsub(//um,'>'). #gsub(//um,'>'). gsub(/ /um,' '). # space identify gsub(/ /um,' '). # space identify gsub(/#{Mx[:br_paragraph]}/u,'
') end @s end self end def xml_docbook def meta_para inf_xml=char_enc(@inf).amp inf_xml=char_enc(inf_xml).br < #{Ax[:tab]*2}#{inf_xml} #{Ax[:tab]} WOK end def metadata SiSU_Metadata::Summary.new(@md).metadata_alt end self end def html_display def meta_para inf_xml=char_enc(@inf).amp inf_xml=char_enc(inf_xml).br %{

#{@tag}: #{inf_xml}

} end def metadata SiSU_Metadata::Summary.new(@md,true).metadata_base end self end def xml_sax def meta_para inf_xml=char_enc(inf_xml).br < #{Ax[:tab]}#{@tag.capitalize}: #{Ax[:tab]} #{Ax[:tab]*2}#{inf_xml} #{Ax[:tab]} WOK end def metadata SiSU_Metadata::Summary.new(@md).metadata_base end self end def xml_dom def meta_para inf_xml=char_enc(inf_xml).amp inf_xml=char_enc(inf_xml).br < #{Ax[:tab]*2}#{@tag.capitalize}: #{Ax[:tab]*2}<#{@attrib}> #{Ax[:tab]*3}#{inf_xml} #{Ax[:tab]*2} #{Ax[:tab]} WOK end def metadata SiSU_Metadata::Summary.new(@md).metadata_base end self end def xhtml_scroll def meta_para inf_xml=char_enc(inf_xml).amp inf_xml=char_enc(inf_xml).br < #{Ax[:tab]}#{@tag.capitalize}: #{Ax[:tab]}<#{@attrib} class="#{@class}"> #{Ax[:tab]*2}#{inf_xml} #{Ax[:tab]} #{Ax[:tab]}
WOK end def metadata SiSU_Metadata::Summary.new(@md).metadata_base end self end def xhtml_display def meta_para inf_xml=char_enc(@inf).amp inf_xml=char_enc(inf_xml).br %{

#{@tag}: #{inf_xml}

} end def metadata SiSU_Metadata::Summary.new(@md,true).metadata_base end self end def odf def meta_para if @inf.is_a?(String) @inf=@inf.gsub(//,'>'). gsub(/<br(?: \/)?>/,'
') if @inf =~/&/ inf_array=[] word=@inf.scan(/\S+|\n/) word.each do |w| # _ - / # | : ! ^ ~ w=w.gsub(/ /,' ') if w !~/&\S{2,7}?;/ w=w.gsub(/&/,'&') end inf_array << w end @inf=inf_array.join(' ') end @inf=@inf.gsub(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/, '\1'). #http ftp matches escaped, no decoration gsub(/(#{Mx[:lnk_c]})#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, '\1\2') #special case \{ e.g. \}http://url @inf=if @inf =~/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/ @inf.gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, %{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}) #http ftp matches with decoration else @inf.gsub(/(https?:\/\/[^<>()'"\s]+)/, %{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}) #http ftp matches with decoration end @inf=@inf.gsub(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)/, %{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}) if @inf !~/http:\/\// # improve upon, document crash where url contains '@' symbol end <#{@tag.capitalize}: #{@inf} WOK end def metadata SiSU_Metadata::Summary.new(@md).metadata_base end self end def json def meta_para <