From 306aed5b8a559aad2fb944a946ffdda9713f07ec Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Sat, 6 Mar 2010 09:47:55 -0500 Subject: introducing version 2, major patch, (version 1 libraries retained) --- lib/sisu/v2/param.rb | 1144 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1144 insertions(+) create mode 100644 lib/sisu/v2/param.rb (limited to 'lib/sisu/v2/param.rb') diff --git a/lib/sisu/v2/param.rb b/lib/sisu/v2/param.rb new file mode 100644 index 00000000..947c018e --- /dev/null +++ b/lib/sisu/v2/param.rb @@ -0,0 +1,1144 @@ +# coding: utf-8 +=begin + + * Name: SiSU + + * Description: a framework for document structuring, publishing and search + + * Author: Ralph Amissah + + * Copyright: (C) 1997 - 2010, 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 + + * Hompages: + + + + * Download: + + + * Ralph Amissah + + + + ** Description: parameters extracted from input file(s) for program use + +=end +module SiSU_Param + require 'uri' + require 'pstore' + require "#{SiSU_lib}/sysenv" # sysenv.rb + include SiSU_Env + require "#{SiSU_lib}/param_identify_markup" # param_identify_markup.rb + require "#{SiSU_lib}/help" # help.rb + include SiSU_Help + @@date=SiSU_Env::Info_date.new + @@symlnk=Create_system_link.new + @@proc=@@filename_txt=@@filename_texinfo=@@filename_lout_portrait=@@filename_lout_landscape=@@filename_html_scroll=@@filename_html_index=@@filename_html_segtoc=@@filename_semantic=@@filename_rss=@@newfile=@@drr=nil + @doc={ :initialise=>nil,:markup=>'',:lnks=>'',:stmp=>'',:req=>{} } + @@yaml=@@yamladdr=nil + @@trigger=nil + @@lv,@@flag={},{} + @@tex_backslash="\\\\" + class Parameters + @@publisher='SiSU scribe' + @@md=@@fns=nil + def initialize(opt) + @opt=opt + @cX||=SiSU_Screen::Ansi.new(opt.cmd) + @cmd,@mod=opt.cmd,opt.mod + @fns=opt.fns.gsub(/\.ssm$/,'.ssm.sst') #revisit CHECK + Instantiate.new.param_instantiate + @env=SiSU_Env::Info_env.new(@fns) + @pstorefile="#{@env.path.dal}/#{@fns}.pstore" + end + def get + unless @@fns==@fns + @@fns=@fns + @@md=nil + end + if @@md.nil? \ + or @cmd =~/M/ #not particularly helpful, as current cycle is through output types, with files changing, only helpful if deal with a file all output types before going to next file + if File.exist?(@pstorefile) + param_msg='Parameters from pstore' + store=PStore.new(@pstorefile) + store.transaction do + @md=store['md'] + end + @md + else + param_msg='Parameters extracted' + fns_array=@env.read_source_file(@opt.fns) + md=Instructions.new(fns_array,@opt) + @md=Instructions.new(fns_array,@opt).extract + @md + end + if defined? @md.title.main # on removal check problems with -U + tell=SiSU_Screen::Ansi.new(@cmd,param_msg,@md.title.main) + tell.txt_grey if @cmd =~/[MVv]/ + end + @@md=@md + else @@md + end + @@md.cmd=@cmd + @@md + end + class Md_default + def rights(author,date) + @author,@date=author,date + def all + s=nil + if @author + s ||=((@date =~/([12][890]\d{2})/ ) \ + ? ("Copyright (C) #{$1} #{@author}") \ + : ('Copyright (C)' + @author)) #matches years 1800 through 20\d\d 2004w19 + end + s + end + def text + all + end + def copyright + def all + s=nil + if @author + s ||=((@date =~/([12][890]\d{2})/ ) \ + ? ("Copyright (C) #{$1} #{@author}") \ + : ('Copyright (C)' + @author)) #matches years 1800 through 20\d\d 2004w19 + end + s + end + def text + all + end + self + end + self + end + end + class Md + def initialize(str) + @s=str + end + def name_format(name) + if name + name.strip! + @name_a_h=[] + authors=name.scan(/[^;]+/) + authors.each_with_index do |a,i| + b=((a =~/\s*\|\s*/) ? (a.split(/\|/)) : [a]) + if b[0] =~/"(.+?)"/ + @name_a_h << { :the => $1 } + else + x=b[0].scan(/[^,]+/) + if x.length==1 + @name_a_h << { :the => x[0].strip } + elsif x.length==2 + @name_a_h << { :the => x[0].strip, :others => x[1].strip } + else #p x.length + end + end + b.delete_at(0) + b.each do |d| + k,c=nil + k,c=/^(\S+)\s+(.*)/.match(d)[1,2] if d + @name_a_h[i][:hon]=c.strip if k=='hon' + @name_a_h[i][:affiliation]=c.strip if k=='affiliation' + @name_a_h[i][:nationality]=c.strip if k=='nationality' + end + end + l=@name_a_h.length + name_str='' + @name_a_h.each_with_index do |a,i| + name_str += if a[:others] + z=(((l - i) > 1) ? ', ' : '') + "#{a[:others].strip} #{a[:the].strip}" + z + else + z=(((l - i) > 2) ? ', ' : '') + "#{a[:the].strip}" + z + end + end + {:name_a_h =>@name_a_h,:name_str =>name_str} + else nil + end + end + def build_hash(arr) + @h={} + arr.each_with_index do |x,i| + a,b=nil,nil + if x =~/^%\s/ #ignore comment + elsif x =~/:(\S+?):\s+(.+)/ + a,b=/:(\S+?):\s+(.+)/.match(x)[1,2] + elsif i == 0 + a='main' + b=x + else + end + @h[a]=b + end + @h + end + def title + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def main + @h['main'] + end + def sub + @h['subtitle'] + end + def edition + @h['edition'] + end + def note + @h['note'] + end + def short + s=(@h['short'] ? @h['short'] : @h['main']) + end + def full + s=(@h['subtitle'] ? (@h['main'] + ' - ' + @h['subtitle']) : @h['main']) + end + self + end + def creator #there are sub categories that need to be catered for and sometimes more than one author etc. + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def author + @h['author']=(@h['author'] ? @h['author'] : @h['main']) + names=name_format(@h['author']) + names[:name_str] + end + def author_detail + s=(@h['author'] ? @h['author'] : @h['main']) + names=name_format(s) + names[:name_a_h] + end + def translator + names=(@h['translator'] ? name_format(@h['translator']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def translator_detail + names=(@h['translator'] ? name_format(@h['translator']) : nil) + (names.class==Hash) ? names[:name_a_h] : nil + end + def illustrator + names=(@h['illustrator'] ? name_format(@h['illustrator']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def illustrator_detail + names=(@h['illustrator'] ? name_format(@h['illustrator']) : nil) + (names.class==Hash) ? names[:name_a_h] : nil + end + def photographer + names=(@h['photographer'] ? name_format(@h['photographer']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def photographer_detail + names=(@h['photographer'] ? name_format(@h['photographer']) : nil) + (names.class==Hash) ? names[:name_a_h] : nil + end + def audio + names=(@h['audio'] ? name_format(@h['audio']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def audio_detail + names=(@h['audio'] ? name_format(@h['audio']) : nil) + (names.class==Hash) ? names[:name_a_h] : nil + end + def digitized_by + names=(@h['digitized_by'] ? name_format(@h['digitized_by']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def digitized_by_detail + names=(@h['digitized_by'] ? name_format(@h['digitized_by']) : nil) + (names.class==Hash) ? names[:name_a_h] : nil + end + def prepared_by + names=(@h['prepared_by'] ? name_format(@h['prepared_by']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def prepared_by_detail + names=(@h['prepared_by'] ? name_format(@h['prepared_by']) : nil) + names=name_format(@h['prepared_by']) + (names.class==Hash) ? names[:name_a_h] : nil + end + def contributor + names=(@h['contributor'] ? name_format(@h['contributor']) : nil) + (names.class==Hash) ? names[:name_str] : nil + end + def contributor_detail + names=(@h['contributor'] ? name_format(@h['contributor']) : nil) + (names.class==Hash) ? names[:name_a_h] : nil + end + self + end + def rights + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def copyright + def text #you may wish to expand to take from all + r=if @h['copyright'] + @h['copyright'] + elsif @h['text'] + @h['text'] + elsif @h['main'] + @h['main'] + else p 'provide copyright' + end + end + def translation + r=(@h['translation'] ? @h['translation'] : nil) + end + def illustrations + r=(@h['illustrations'] ? @h['illustrations'] : nil) + end + def photographs + r=(@h['photographs'] ? @h['photographs'] : nil) + end + def digitiztion + r=(@h['digitization'] ? @h['digitization'] : nil) + end + def audio + r=(@h['audio'] ? @h['audio'] : nil) + end + self + end + def license + r=(@h['license'] ? @h['license'] : nil) + end + def all + s=if @h['all']; @h['all'] + else + s=copyright.text + ';' + if defined? copyright.translation \ + and copyright.translation + s +=' translation ' + copyright.translation + ';' + end + if defined? copyright.illustrations \ + and copyright.illustrations + s +=' illustrations ' + copyright.illustrations + ';' + end + if defined? copyright.photographs \ + and copyright.photographs + s +=' photographs ' + copyright.photographs + ';' + end + if defined? copyright.digitization \ + and copyright.digitization + s +=' digitization ' + copyright.digitization + ';' + end + if defined? copyright.audio \ + and copyright.audio + s +=' audio ' + copyright.audio + ';' + end + if defined? copyright.license \ + and copyright.license + s +=' License: ' + copyright.license + end + s + end + s + end + self + end + def classify + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def topic_register + @h['topic_register'] + end + def subject + @h['subject'] + end + def type + @h['type'] + end + def identifier + @h['identifier'] + end + def isbn + @h['isbn'] + end + def dewey + @h['dewey'] + end + def loc + @h['loc'] + end + def dewey + @h['dewey'] + end + def pg + @h['pg'] + end + def relation + @h['relation'] + end + def coverage + @h['coverage'] + end + self + end + def publisher + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + @h['main'] + end + def date + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def published + @h['published']=(@h['published'] ? @h['published'] : @h['main']) + end + def available + @h['available'] + end + def created + @h['created'] + end + def issued + @h['issued'] + end + def modified + @h['modified'] + end + def valid + @h['valid'] + end + def added_to_site + @h['added_to_site'] + end + self + end + def language + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def document + @h['document']=(@h['document'] ? @h['document'] : @h['main']) + end + def original + @h['original'] + end + self + end + def make + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def headings + lv=[] + s=@s + s=((s =~/;/) ? (s.split(/;\s*/)) : [ s ]) + lv[0]=s + lv1=s[0] ||='1~ ' #some arbitrary changes made + lv[1]=/^#{lv1}/ + lv2=s[1] ||='2~ ' + lv[2]=/^#{lv2}/ + lv3=s[2] ||='3~ ' + lv[3]=/^#{lv3}/ + lv4=s[3] ||='4~ ' + lv[4]=/^#{lv4}/ + lv5=s[4] ||='5~ ' + lv[5]=/^#{lv5}/ + lv6=s[5] ||='6~ ' + lv[6]=/^#{lv6}/ + lv + end + def num_top + @h['num_top'] + end + def breaks + pagebreaks=((@h['breaks'] =~/;/) ? (@h['breaks'].split(/;\s*/)) : [ @h['breaks'] ]) + page_new,page_break=nil,nil + pagebreaks.each do |x| + page_new=x[/(:?[\dA-C],?)+/] if x=~/new|clear/ + page_break=x[/(:?[\dA-C],?)+/] if x =~/break/ + end + {:page_new =>page_new, :page_break =>page_break} + end + def bold + m=@h['bold'] + x=(m=~/\/i$/)? 'i' : '' + m.gsub!(/^\/(.+?)\/i?/,'\1') + m.gsub!(/\(/,'(?:') # avoid need to escape use of brackets within regex provided + rgx='\b(' + m + ')\b' + y=((x =~/i/) ? (/#{rgx}/i) : (/#{rgx}/)) + { :str =>'\b(?:' + m + ')\b', :regx => y } + end + def italics + m=@h['italics'] + x=((m=~/\/i$/) ? 'i' : '') + m.gsub!(/^\/(.+?)\/i?/,'\1') + m.gsub!(/\(/,'(?:') # avoid need to escape use of brackets within regex provided + rgx='\b(' + m + ')\b' + y=((x =~/i/) ? (/#{rgx}/i) : (/#{rgx}/)) + { :str =>'\b(?:' + m + ')\b', :regx => y } + end + def skin + @h['skin'] + end + def promo + @h['promo'] + end + def ad + @h['ad'] + end + def manpage + manpage={} + if @h['manpage'] + if @h['manpage'] =~/;/m + man=@h['manpage'].split(/;/m) + man.each do |x| + m=(x=~/=/m) ? x.split(/=/m) : nil + if m + manpage[m[0].strip] = m[1].split(/ \. /) + end + end + end + end + if manpage['name'] + manpage['name']=manpage['name'].join("\n.BR\n") + manpage['name'].gsub!(/(-)/m,"\\\\\\1") + manpage['name'].gsub!(/\A/,"\n.SH NAME\n") + else + manpage['name']='man page "name/whatis" information not provided, set in header @man: name=[whatis information]' + end + if manpage['synopsis'] + manpage['synopsis']=manpage['synopsis'].join("\n.BR\n") + manpage['synopsis'].gsub!(/(-)/m,"\\\\\\1") + manpage['synopsis'].gsub!(/\A/,"\n.SH SYNOPSIS\n") + else + manpage['synopsis']='' + end + unless manpage['section'] + manpage['section']=1 + end + manpage + end + self + end + def current_publisher + @s + end + def original + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def publisher + @h['publisher'] + end + def language + @h['language'] + end + def source + @h['source'] + end + def institution + @h['institution'] + end + def nationality + @h['nationality'] + end + self + end + def links + a=@s.split(/[ ]*\n[ ]*/m) + a + end + def notes + a=@s.split(/[ ]*\n[ ]*/m) + @h=build_hash(a) + def comment + @h['comment'] + end + def abstract + @h['abstract'] + end + def description + @h['description'] + end + def history + @h['history'] + end + def prefix + @h['prefix'] + end + self + end + end + class Instructions + @doc={ :lv=>[] } + @doc[:fns],@doc[:fnb],@doc[:scr_suffix]='','','' + @@publisher='SiSU scribe' + attr_accessor :cmd,:make,:mod,:env,:fn,:fns,:fnb,:fnn,:fnt,:fnl,:flv,:fnz,:fnstex,:ocn,:sfx_src,:pdf,:file_type,:dir_out,:dir_tex,:dir_lout,:txt_path,:site_skin,:sisu,:sisu_version,:ruby_version,:title,:subtitle,:full_title,:html_title,:subtitle_tex,:creator,:author_home,:author,:author_title,:author_nationality,:authors,:authorship,:translator,:illustrator,:prepared_by,:digitized_by,:subject,:description,:publisher,:contributor,:date,:date_created,:date_issued,:date_available,:date_valid,:date_modified,:date_translated,:date_added_to_site,:date_scheme,:date_created_scheme,:date_issued_scheme,:date_available_scheme,:date_valid_scheme,:date_modified_scheme,:type,:format,:identifier,:source,:language,:language_original,:relation,:coverage,:rights,:keywords,:comments,:abstract,:cls_loc,:cls_dewey,:cls_pg,:cls_isbn,:papersize,:papersize_array,:toc,:lv1,:lv2,:lv3,:lv4,:lv5,:lv6,:lvs,:pagenew,:pagebreak,:num_top,:toc_lev_limit,:flag_endnotes,:flag_auto_endnotes,:flag_separate_endnotes,:flag_separate_endnotes_make,:markup,:markup_instruction,:markup_version,:markup_declared,:flag_tables,:vocabulary,:doc_skin,:doc_css,:yaml,:lnk,:prefix_a,:prefix_b,:suffix,:information,:contact,:icon,:image,:ad_url,:ad_png,:ad_alt,:ad_began,:flag_promo,:promo,:ad_home,:stmp,:stmpd,:sc_filename,:sc_number,:sc_date,:sc_time,:sc_info,:yamladdr,:locale,:wc_lines,:wc_words,:wc_bytes,:file_encoding,:file_size,:user,:home,:hostname,:pwd,:firstseg,:programs,:author_copymark,:lang,:en,:dgst,:dgst_skin,:generated,:tags,:tag_array,:concord_make,:seg_names,:seg_autoname_safe,:set_header_title,:set_heading_top,:set_heading_seg,:heading_seg_first,:heading_seg_first_flag,:base_program,:ec,:opt,:sem_tag,:book_idx,:topic_register,:topic_register_array,:original_publication,:original_publication_date,:original_publication_nationality,:original_publication_institution,:writing_focus,:audio,:daisy + def initialize(fns_array,opt) + @env=@fn=@fns=@fnb=@fnn=@fnt=@fnl=@flv=@fnz=@fnstex=@ocn=@sfx_src=@pdf=@file_type=@dir_out=@dir_tex=@dir_lout=@txt_path=@make=@flag_endnotes=@flag_auto_endnotes=@flag_separate_endnotes=@flag_separate_endnotes_make=@site_skin=@sisu=@sisu_version=@ruby_version=@title=@subtitle=@full_title=@html_title=@subtitle_tex=@creator=@author_home=@author=@author_title=@author_nationality=@translator=@illustrator=@prepared_by=@digitized_by=@subject=@description=@publisher=@contributor=@date=@date_created=@date_issued=@date_available=@date_valid=@date_modified=@date_translated=@date_added_to_site=@date_scheme=@date_created_scheme=@date_issued_scheme=@date_available_scheme=@date_valid_scheme=@date_modified_scheme=@type=@format=@identifier=@source=@language=@language_original=@relation=@coverage=@rights=@keywords=@comments=@abstract=@cls_loc=@cls_dewey=@cls_pg=@cls_isbn=@papersize=@toc=@lv1=@lv2=@lv3=@lv4=@lv5=@lv6=@pagenew=@pagebreak=@num_top=@toc_lev_limit=@flag_tables=@vocabulary=@doc_skin=@doc_css=@yaml=@lnk=@prefix_a=@prefix_b=@suffix=@information=@contact=@icon=@ad_url=@ad_png=@ad_alt=@ad_began=@promo=@ad_home=@stmp=@stmpd=@sc_filename=@sc_number=@sc_date=@sc_time=@sc_info=@yamladdr=@locale=@wc_lines=@wc_words=@wc_bytes=@file_encoding=@file_size=@firstseg=@programs=@author_copymark=@lang=@en=@dgst=@dgst_skin=@generated=@heading_seg_first=@base_program=@topic_register=@original_publication_details=@original_publication=@original_publication_date=@original_publication_nationality=@original_publication_institution=@writing_focus=@audio=nil + @data,@fns,@cmd,@mod,@opt=fns_array,opt.fns,opt.cmd,opt.mod,opt #@data used as data + @flag_tables,@set_header_title,@set_heading_top,@set_heading_seg,@heading_seg_first_flag,@flag_promo,@book_idx=false,false,false,false,false,false,false + @seg_autoname_safe=true + @daisy,@sem_tag=false,false + @authorship,@markup_instruction,@markup_declared,@image='','','','' #check which other values should be set to empty rather than nil + @markup=@markup_instruction #use @markup_instruction + @doc,@fn,@make_italic,@tag_hash,@ec={},{},{},{},{},{} + @flv,@lang,@seg_names,@tags,@tag_array,@tag_a,@ec[:image],@ec[:audio],@ec[:multimedia]=Array.new(9){[]} + @authors,@topic_register_array,@papersize_array=[],[],[] + @lvs=[nil,0,0,0,0,0,0] + @rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/ + @rgx_audio=/\{\s*(\S+?\.(?:mp3|ogg))/ + @rgx_mm=/\{\s*(\S+?\.(?:ogg|mpeg))/ #expand and distinguish ogg + begin + rescue; SiSU_Errors::Info_error.new($!,$@,@cmd,@fns).error + ensure + end + end + #protected + def determine_papersize(l) + l=case l + when /eu|europe|uk/i; 'A4' #European default, SiSU default + when /(?:us-)?legal|legal/i; 'US_legal' #U.S. alternative + when /(?:us-)?letter|u.s.|us/i; 'US_letter' #U.S. default + when /book_a5|a5/i; 'book_a5' + when /book_b5|b5|book/i; 'book_b5' #book default - larger + else 'A4' + end + end + def extract + @user,@home,@hostname,@pwd=ENV['USER'],ENV['HOME'],ENV['HOSTNAME'],ENV['PWD'] + @programs,@wc,@language,@language_original={},{},{},{} + @en={ :sum=>0,:mark=>0,:note=>0,:mismatch=>0 } + @prog=SiSU_Env::Info_settings.new + @sys=SiSU_Env::System_call.new + @env=SiSU_Env::Info_env.new(@fns) #watch + puts 'system locale: ' + @sys.locale if @opt.cmd =~/[MV]/ + if @prog.wc \ + and @sys.wc + wc=%x{wc #{fns}} + wca=wc.scan(/\d+/) + @wc_lines,@wc_words,@wc_bytes=wca[0].to_i,wca[1].to_i,wca[2].to_i + else + fns_a=@data.dup + tmp=fns_a.join + fns_a=tmp.scan(/\S+/) + @wc_words=fns_a.length + fns_a=tmp=nil + end + @concord_make=(@wc_words > @env.concord_max) ? false : true + @locale=@sys.locale + @file_encoding=@sys.file_encoding(fns,@cmd) + # programs set here for things that affect output appearance only + @programs[:pdf]=SiSU_Env::System_call.new.program_found?('pdflatex') + if @env.i18n.multilingual + m=/((.+?)(?:\~\w{2,3})?)\.((?:-|ssm\.)?sst)$/ #watch added match for sss + @fnn,@fnb,@fnt=@fns[m,1],@fns[m,2],@fns[m,3] + @flv=@env.document_language_versions_found[:f] + @fnz=(@fns =~/\.(?:ssm\.sst|ssm)$/) ? (@fnn + '.ssm.zip') : (@fnn + '.sst.zip') + else m=/(.+?)\.((?:-|ssm\.)?sst)$/ + @fnb=@fnn=@fns[m,1] + @fnt=@fns[m,2] + @flv<<@fns + @fnz=(@fns =~/\.(?:_sst|ssm)$/) ? (@fnb + '.ssm.zip') : (@@fnb + '.sst.zip') + end + @papersize=@env.papersize #'A4' #default size #get first from SiSU_Env:: # @env is probably no longer most appropriate name! as default info is more general + @sfx_src=@fns[m,2] + if @fns =~ /(?:-|ssm\.)?sst$/ #watch + @env_out_root=@env.path.output + @dir_out="#{@env.path.output}/#{@fnb}" + @dir_tex=@env.path.tex + @dir_lout=@env.path.lout + @@publisher='SiSU http://www.jus.uio.no/sisu' + end + @txt_path=@txt_path ||= @env.path.output + @stmp=%{#{@fns}}[/^(.+?)\..*/m,1] + @fnstex=@fns.gsub(/_/,'\_') + @flag_endnotes,@flag_auto_endnotes,@flag_separate_endnotes=false,false,false + @flag_separate_endnotes_make=true + regx_date=/^\d{4}(?:-(?:[0][0-9]|1[0-2])(-(?:[0-2][0-9]|3[01]))?)?$/ + ver=SiSU_Env::Info_version.instance + @sisu_version=ver.get_version + @ruby_version=ver.rbversion + @generated=Time.now + fns_array=@data.dup + skip unless fns_array # consider + @markup_version=SiSU_Markup_type::Markup_identify.new(fns_array,@opt).markup_version? #% determine markup version + if fns_array[0] =~ /^(?:% )?(?:SiSU\s+(?:master\s+)?[\d.]*|sisu-[\d.]+)$/ #check markup and markup version + if fns_array[0] =~ /^(?:% )?(?:SiSU\s+(?:master\s+)?|sisu-)[\d.]+$/ #check markup and markup version + @markup_version_declared=fns_array[0].match(/^(?:% )?(?:SiSU\s+(?:master\s+)?|sisu-)([\d.]+)$/)[1] + sm_a,sm_b,sm_c=fns_array[0].match(/^(?:% )?(?:SiSU\s+(?:master\s+)?|sisu-)([0-9]+)?(?:\.([0-9]+))?(?:\.([0-9]+))?$/)[1..3] + sm_c ||=0 + sv=(@cmd =~/[VMv]/) ? ("SiSU version (#{@sisu_version[:version]})") : '' + s_a,s_b,s_c=@sisu_version[:version].match(/^([0-9]+)?(?:\.([0-9]+))?(?:\.([0-9]+))?(?:\-\S+)?$/)[1..3] + tell=(@markup_version_declared.to_f==@markup_version.to_f) \ + ? SiSU_Screen::Ansi.new(@cmd,"Markup version (#{@markup_version})",sv) \ + : SiSU_Screen::Ansi.new(@cmd,"Markup version declared (#{@markup_version_declared}), determined (#{@markup_version})",sv) + ok=if s_a.to_i > sm_a.to_i + true + elsif s_a.to_i == sm_a.to_i \ + and s_b.to_i >= sm_b.to_i + true + elsif s_a.to_i == sm_a.to_i \ + and s_b.to_i == sm_b.to_i \ + and s_c.to_i >= sm_c.to_i + true + else false + end + if ok + tell.txt_green if @cmd =~/[vVM]/ + else + tell=SiSU_Screen::Ansi.new(@cmd,"Warning: markup version determined (#{@markup_version}) or markup version declared (#{@markup_version_declared}) is newer than SiSU version (#{@sisu_version[:version]})") + tell.warn unless @cmd =~/q/ + end + else + tell=SiSU_Screen::Ansi.new(@cmd,'No SiSU markup version provided') + tell.warn if @cmd =~/[VM]/ + end + else + tell=SiSU_Screen::Ansi.new(@cmd,'SiSU filetype indicator not provided') + tell.warn unless @cmd =~/q/ + end + @code_flag=false + fns_array.each do |para| #% Scan document + if para !~/^%+\s/ \ + and para =~//,Mx[:br_line]) #% metainfo DC copyright, public domain, copyleft, creative commons, etc. + @rights=Md.new($1.strip).rights + when /^@papersize:\s+(.+?)$/m #% metainfo DC + l=$1 + if @mod.inspect !~/--papersize[=-]\S+/ + l=determine_papersize(l.dup) + @papersize=l + end + when /^@make:(.+)/m #% metainfo DC + @make=Md.new($1.strip).make + if defined? @make.breaks \ + and @make.breaks[:page_new] #clearpage + @pagenew=@make.breaks[:page_new] + end + if defined? @make.breaks \ + and @make.breaks[:page_break] #newpage + @pagebreak=@make.breaks[:page_break] + end + if defined? @make.headings \ + and @make.headings + @toc=@make.headings[0] + @lv1=@make.headings[1] + @lv2=@make.headings[2] + @lv3=@make.headings[3] + @lv4=@make.headings[4] + @lv5=@make.headings[5] + @lv6=@make.headings[6] + end + if defined? @make.num_top \ + and @make.num_top + @num_top=@make.num_top # remove @num_top + end + if defined? @make.skin \ + and @make.skin + @doc_skin=@make.skin + end + if defined? @make.manpage \ + and @make.manpage + @man_section=(defined? @make.manpage.section) ? @make.manpage.section : 1 + end + when /^@links:\s+(.+?)\Z/m #% processing + Md.new($1.strip).links + when /^@notes?:\s(.+)/ #% metainfo + Md.new($1.strip).notes + when /^@base_program:\s+(.+?)$/; @base_program=$1 #% processing + end + @lv1 ||=/^1~/ + @lv2 ||=/^2~/ + @lv3 ||=/^3~/ + @lv4 ||=/^4~/ + @lv5 ||=/^5~/ + @lv6 ||=/^6~/ + else #% + case para + when /^:?A~/ + @lvs[1]=1 + when /^:?B~/ + @lvs[2]=1 + when /^:?C~/ + @lvs[3]=1 + when /^1~/ + @lvs[4]=1 + when /^2~/ + @lvs[5]=1 + when /^3~/ + @lvs[6]=1 + end + if para =~ /^(?:1|:?A)~/ #% processing + if para=~/^:?A~/ + if @markup.nil? \ + or @markup.empty? + @markup=@markup_version.to_s + elsif @markup !~/0\.38/; @markup=@markup.strip + "; #{@markup_version}" + end + end + if (para=~/^:?A~/ and @markup_version >= 0.38) \ + or (para=~/^1~/ and @markup_version < 0.38) + if @title.nil? + @title=para[/^:?[A1]~\S*(.+)$/m,1] + @html_title=@title.gsub(/(

|

|
|
)/,'') + @title.chomp!("\n") + @html_title.chomp!("\n") + tell=SiSU_Screen::Ansi.new(@cmd,'Parameters',@html_title) + tell.txt_grey if @cmd =~/v/ + end + end + end + if not @book_idx \ + and para =~/^=\{(.+?)\}\s*$/ + @book_idx=true + end + unless @code_flag + case para + when /~\{\s+.+?\}~/m #% processing + en=para.scan(/~\{.+?\}~/m) + en.each { |e| @en[:sum] +=1 } + when /~\^(?:\s|$)/m #% processing + mk=para.scan(/~\^(?:\s|$)/) + mk.each { |e| @en[:mark] +=1 } + when /^\^~\s+\S/; @en[:note] +=1 #% processing + end + end + if para =~/~\{|\^~ |~\^|<:ee>|\{.+?\[[1-6]\]\}\S+?\.ss[tm]/m; @flag_auto_endnotes,@flag_endnotes=true,true + end + unless @flag_auto_endnotes + if para =~/^(4~endnotes\b|<:ee>)/ + @flag_separate_endnotes=true + @flag_endnotes=true + end + end + if para =~/^(?:4~endnotes|<:ee>)/; @flag_separate_endnotes_make=false + end + if para =~/\s*.+/; @flag_endnotes=true + end + if para =~/^(?:table\{|\{table)/i; @flag_tables=true + end + end + if para =~/^:?A~/ + @set_heading_top=true + end + if para =~/^1~/ + m=nil + if para =~/^1~(\S+)\s+(.+)$/ + m,t=$1,$2 + elsif para =~/^1~\s+(.+)$/ + t=$1 + end + unless @heading_seg_first_flag # extract first segment name + @heading_seg_first=t + @heading_seg_first_flag=true + end + if m # list all segment names + @seg_names << m + @set_heading_seg=true + if m=~/^\d{1,3}/ \ + and m !~/^0/ + @seg_autoname_safe=false + end + end + end + if para !~/^%+\s/ \ + and para =~@rgx_image + @ec[:image] << para.scan(@rgx_image).uniq + end + @ec[:audio] << para.scan(@rgx_audio).uniq if para =~@rgx_audio #embedded content + @ec[:multimedia] << para.scan(@rgx_mm).uniq if para =~@rgx_mm #embedded content + unless @sem_tag + @sem_tag=true if para=~/[:;]\{.+?\}[:;][a-z+]/ #refix later + end + end #% here endeth the document loop + if @ec[:image].length > 0 + @ec[:image].flatten! + @ec[:image].uniq! + @ec[:image].delete_if {|x| x =~/http:\/\// } + @ec[:image].sort! + end + @ec[:audio].uniq!; @ec[:audio].flatten!; @ec[:audio].sort! + @ec[:multimedia].uniq!; @ec[:multimedia].flatten!; @ec[:multimedia].sort! + unless @rights + if defined? @creator.author \ + and @creator.author \ + and defined? @date.published \ + and @date.published + @rights=Md_default.new.rights(@creator.author,@date.published) + elsif defined? @creator.author \ + and @creator.author + @rights=Md_default.new.rights("[#{@creator.author}]",'') + end + end + if @markup_version.to_f >= 0.38 #convert values in headers to internal representation + translated=[] + translate_list=[@pagenew,@pagebreak,@num_top,@toc_lev_limit] + translate_list.each do |t| + translate=t.to_s if t + translated << if translate + translate.gsub!(/3/,'6') + translate.gsub!(/2/,'5') + translate.gsub!(/1/,'4') + translate.gsub!(/:?C/,'3') + translate.gsub!(/:?B/,'2') + translate.gsub!(/:?A/,'1') + translate=if translate =~/^\d+$/; translate.to_i + else translate + end + else nil + end + end + @pagenew,@pagebreak,@num_top,@toc_lev_limit=translated + @markup.gsub!(/page_new\s*=\s*([\dA-C])/,"page_new=#{@pagenew}") + @markup.gsub!(/page_break\s*=\s*([\dA-C])/,"page_break=#{@pagebreak}") + @markup.gsub!(/num_top\s*=\s*([\dA-C])/,"num_top=#{@num_top}") + @markup.gsub!(/toc_lev_limit\s*=\s*([\dA-C])/,"toc_lev_limit=#{@toc_lev_limit}") + end + if @mod.inspect =~/--papersize[=-]\S+|--pdf[=-]\S+/ \ + or @mod.inspect =~/--(?:a4|letter|legal|book|a5|b5)\b/i #command line config/header override + @papersize=determine_papersize(@mod.inspect) + end + @papersize_array=@papersize.scan(/(?:a4|letter|legal|book|a5|b5)/i) + if @sys.openssl !=false + skin=@doc_skin \ + ? (SiSU_Env::Info_skin.new(@opt,@doc_skin).select) \ + : SiSU_Env::Info_skin.new(@opt).select + @dgst,@dgst_skin=[],[] + if @env.digest.type =~/sha256/ + @dgst=@sys.sha256(@env.source_file_with_path) + @dgst_skin=skin ? (@sys.sha256(skin)) : nil + else + @dgst=@sys.md5(@env.source_file_with_path) + @dgst_skin=skin ? (@sys.md5(skin)) : nil + end + end + @publisher ||= "#@@publisher (this copy)" + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(@fns) + unless @language[:code] \ + and @language[:name] + lang=@env.i18n.language #default language settings for directory by name, or in sysrc.yml + @language[:code] ||= lang.code + @language[:name] ||= lang.title + end + unless fn_set_lang[:d]==true #decide, naming convention overrides other settings, within document, etc. + @language[:code]=fn_set_lang[:c] + @language[:name]=fn_set_lang[:l] + end + @fnl=@env.i18n.lang_filename(fn_set_lang[:c]) + @flv.each do |l| + lang=SiSU_Env::Standardise_language.new.file_to_language(l) + c={ :a=>'',:b=>'',:c=>'' } + if @fnl[:pre] =~/\S/; c[:a]="#{lang[:c]}." + elsif @fnl[:mid] =~/\S/; c[:b]=".#{lang[:c]}" + elsif @fnl[:post] =~/\S/; c[:c]=".#{lang[:c]}" + end + @lang << [lang[:l],"#{c[:a]}sisu_manifest#{c[:b]}.html#{c[:c]}"] + end if @flv + @lang.uniq! + @fn=SiSU_Env::Env_call.new(@fns).lang(fn_set_lang[:c]) + @identifier="#{@env.url.root}/#{@fnb}/#{@fn[:toc]}" #DC note constructed dc identifier + if @en[:note] > 0 \ + and @en[:sum] > 0 + if @en[:sum] > 0 + else tell=SiSU_Screen::Ansi.new(@cmd,'both endnote styles used',"~{ #{@en[:sum]} }~ and ^~ #{@en[:mark]}") + tell.warn if @cmd !~/q/ + end + end + if @en[:mark] != @en[:note] \ + and @en[:note] > 0 + @en[:mismatch]=@en[:note] - @en[:mark] + SiSU_Screen::Ansi.new(@cmd,'endnote number mismatch',"endnotes: #{@en[:note]} != endnote reference marks: #{@en[:mark]} (difference = #{@en[:mismatch]})").warn if @cmd !~/q/ + footnote_conversion_errors=File.new("#{Dir.pwd}/footnote_conversion_errors.txt",'a') + footnote_conversion_errors << "#{@fns}:\n\tendnotes: #{@en[:note]} != endnote reference marks: #{@en[:mark]} (difference = #{@en[:mismatch]})\n" + end + if @title.main !~/[\S]/ + tell=SiSU_Screen::Ansi.new(@cmd,'Document Title Missing','please provide it') + tell.warn if @cmd =~/v/ + end + if @author !~/[\S]/ + tell=SiSU_Screen::Ansi.new(@cmd,'Document Author/Creator Missing','please provide it') + tell.warn if @cmd =~/v/ + end + # Elementary Document Structure Analysis - adds complexity may remove - need to develop - appears to work, proof of concept + if @title.nil? + title_trigger=nil + fns_array.each do |para| + if para !~/@\S+:[+-]?\s/ \ + and para =~/\S/ \ + and title_trigger.nil? + @title=para[/(\S.+)/m,1] + @html_title=@title.gsub(/(

|

|
|
)/,'') + @title.chomp!("\n") + @html_title.chomp!("\n") + title_trigger=1 + tell=SiSU_Screen::Ansi.new(@cmd,@html_title) + tell.txt_cyan unless @cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@cmd,'Parameters') + tell.txt_grey unless @cmd =~/q/ + end + end + end + @struct={} + doc_struct=Hash.new(0) + if @lv1.nil? + fns_array.each do |para| + if para =~/^(Part|Chapter|Section|Article)\b/i + case para + when /^(Part|PART)\b/ + @struct[:part]=doc_struct[:part] + doc_struct[:part]=doc_struct[:part] + 1 + when /^(Chapter|CHAPTER)\b/ + @struct[:chapter]=doc_struct[:chapter] + doc_struct[:chapter]=doc_struct[:chapter] + 1 + when /^(Section|SECTION)\b/ + @struct[:section]=doc_struct[:section] + doc_struct[:section]=doc_struct[:section] + 1 + when /^(Article|ARTICLE)\b/ + @struct[:article]=doc_struct[:article] + doc_struct[:article]=doc_struct[:article] + 1 + when /^(Clause|CLAUSE)\b/ + @struct[:clause]=doc_struct[:clause] + doc_struct[:clause]=doc_struct[:clause] + 1 + when /^\d\..*[^\.]$/ + @struct[:number]=doc_struct[:number] + doc_struct[:number]=doc_struct[:number] + 1 + end + end + end + if doc_struct[:article] > 2 #%~level 4 + @lv4=/^(?:Article|ARTICLE)\b/ + elsif doc_struct[:chapter] > 2 \ + and doc_struct[:article] \ + and doc_struct[:article] < 3 + @lv4=/^(?:Chapter|CHAPTER)\b/ + elsif doc_struct[:clause] > 2 + @lv4=/^(?:Clause|CLAUSE)\b/ + elsif doc_struct[:number] > 2 + @lv4="^\d\..*[^\.]$" + end + if doc_struct[:section] > 2 #%~level 3 + @lv3=/^(?:Section|SECTION)\b/ + end + if doc_struct[:chapter] > 2 \ + and doc_struct[:article] \ + and doc_struct[:article] > 2 + @lv2=/^(?:Chapter|CHAPTER)\b/ + end + if doc_struct[:part] > 2 \ + and @lv[2].nil? + @lv2=/^(?:Part|PART)\b/ + end + if doc_struct[:part] > 2 \ + and @lv[2].inspect !~/Part/ \ + and @lv[1].nil? + @lv1=/^(Part|PART)\b/ + end + end + @lnk=@lnk.compact if @lnk + @lv1 ||=/^1~/ + @lv2 ||=/^2~/ + @lv3 ||=/^3~/ + @lv4 ||=/^4~/ + @lv5 ||=/^5~/ + @lv6 ||=/^6~/ + if @doc_skin + tell=SiSU_Screen::Ansi.new(@cmd,"doc_skin <- #{@doc_skin}") + tell.txt_grey if @cmd =~/v/ + end + @data=nil #else whole file's contents are stored in md pstore & is not required to be... big waste actually + Store.new(self,@env).store #% pstore + self + end + private + class Store + def initialize(md,env) + @md=md + @pstorefile="#{env.path.dal}/#{md.fns}.pstore" + end + def store + File.unlink(@pstorefile) if FileTest.file?(@pstorefile) + tell=SiSU_Screen::Ansi.new(@md.cmd,"PStore -> #{@pstorefile}") + tell.txt_grey if @md.cmd =~/v/ + store=PStore.new(@pstorefile) + store.transaction do + store['md']=@md + store.commit + end + @@md=@md=nil + end + end + end + end + class Instantiate + def param_instantiate + @@date=SiSU_Env::Info_date.new + @@symlnk=SiSU_Env::Create_system_link.new + @@proc=@@filename_txt=@@filename_texinfo=@@filename_lout_portrait=@@filename_lout_landscape=@@filename_html_scroll=@@filename_html_index=@@filename_html_segtoc=@@filename_semantic=@@filename_rss=@@newfile=@@drr=nil + @doc={ + :initialise=>nil, + :markup=>'',:lnks=>'',:stmp=>'',:prefix_a=>'',:prefix_b=>'', + :req=>{} + } + @@yaml=@@yamladdr=nil + @@flag={} + @@publisher='SiSU scribe' + end + end +end +__END__ -- cgit v1.2.3