diff options
Diffstat (limited to 'lib/sisu/develop/sst_identify_markup.rb')
-rw-r--r-- | lib/sisu/develop/sst_identify_markup.rb | 482 |
1 files changed, 482 insertions, 0 deletions
diff --git a/lib/sisu/develop/sst_identify_markup.rb b/lib/sisu/develop/sst_identify_markup.rb new file mode 100644 index 00000000..e8cc954f --- /dev/null +++ b/lib/sisu/develop/sst_identify_markup.rb @@ -0,0 +1,482 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** A conversion script for canned substitutions, a fairly generic + simple tool that can be used to store other canned conversions, used here for + altering SiSU markup + +** Author: Ralph Amissah + <ralph@amissah.com> + <ralph.amissah@gmail.com> + +** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Ralph Amissah, + All Rights Reserved. + +** License: GPL 3 or later: + + SiSU, a framework for document structuring, publishing and search + + Copyright (C) Ralph Amissah + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program. If not, see <http://www.gnu.org/licenses/>. + + If you have Internet connection, the latest version of the GPL should be + available at these locations: + <http://www.fsf.org/licensing/licenses/gpl.html> + <http://www.gnu.org/licenses/gpl.html> + + <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html> + +** SiSU uses: + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + +** Hompages: + <http://www.jus.uio.no/sisu> + <http://www.sisudoc.org> + +** Git + <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary> + <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/sst_identify_markup.rb;hb=HEAD> + +=end +module SiSU_Markup + class MarkupInform + attr_accessor :version + def initialize(version,message,declared_markup='',declared_type='') + @version,@message,@declared_markup,@declared_type=version,message,declared_markup,declared_type + end + def version + @version + end + def message + @message + end + def declared_version + @declared_markup + end + def declared_type + @declared_type + end + def history + MarkupHistory.new(@version).query + end + end + class MarkupIdentify + def initialize(opt) + @opt=opt + @description='This is a script attempts to identify the version of markup used in SiSU (and provides information on changes in markup)' + end + def help + print <<WOK + +#{@description} + +WOK + exit + end + def identify + f=@opt.fns + if f =~/(?:\.sst|\.ssm|\.ssi|\.s[123])$/ \ + and File.exist?(f) + file=File.open(f,'r') + cont=file.readlines + file.close + links,oldlinks='','' + markup=nil + @declared_type,@declared_markup='[text?]','' + if cont[0] =~ /^(?:%\s+)?SiSU\s+(text|master|insert)\s+([0-9](?:\.[0-9]+){1,2})/ \ + or cont[0] =~ /^(?:%\s+)?sisu-([0-9](?:\.[0-9]+){1,2})/ + @declared_type,@declared_markup=$1,$2 + elsif cont[0] =~ /^(?:%\s+)?SiSU\s+([0-9](?:\.[0-9]+){1,2})/ \ + or cont[0] =~ /^(?:%\s+)?sisu-([0-9](?:\.[0-9]+){1,2})/ + @declared_markup=$1 + end + @flag_2_0,@flag_1_0,@flag_69,@flag_66,@flag_57,@flag_38=false,false,false,false,false,false + cont.each_with_index do |y,i| + if y =~/^(?:0\{?~links?|@links?:)\s/ \ + and f =~/(?:\.sst|\.ssm|\.ssi|\.s[123])/ + links=unless y =~/\{.+?\}\S+/; oldlinks=' (pre 0.20.4 header links)' + else ' (post 0.20.4 header links)' + end + end + if @flag_2_0 \ + or y =~/^@make:|^@classify|^\s\s?:[a-z_-]+?:\s+\S/ + version=2.0.to_f + markup=MarkupInform.new(version,'2.0' + oldlinks,@declared_markup,@declared_type) + @flag_2_0=true + break + end + unless @flag_38 + if (y =~/^:?A~/ and f =~/(?:\.sst|\.ssm|\.ssi)/) + version='0.38' + markup=MarkupInform.new(version,'0.38' + oldlinks,@declared_markup,@declared_type) + @flag_38=true + end + end + if @flag_38 + if @flag_1_0 \ + or y =~/^=\{.+?\}\s*$/ + version='0.69' + markup=MarkupInform.new(version,'0.69' + oldlinks,@declared_markup,@declared_type) + @flag_1_0=true + break + end + if @flag_66 \ + or y =~/[a-z+][:;]\{.+?\}[:;][a-z+]/ + version='0.66' + markup=MarkupInform.new(version,'0.66' + oldlinks,@declared_markup,@declared_type) + @flag_66=true + break + end + end + end + unless @flag_2_0 \ + or @flag_1_0 \ + or @flag_66 + cont.each_with_index do |y,i| + if y =~/^(?:0\{?~links?|@links?:)\s/ \ + and f =~/(?:\.sst|\.ssm|\.ssi|\.s[123])/ + links=unless y =~/\{.+?\}\S+/; oldlinks=' (pre 0.20.4 header links)' + else ' (post 0.20.4 header links)' + end + end + if @flag_57 \ + or (y =~/^:?A~\?? @title/ and f =~/(?:\.sst|\.ssm|\.ssi)/) + version='0.57' + markup=MarkupInform.new(version,'0.57' + oldlinks,@declared_markup,@declared_type) + @flag_57=true + break + end + if @flag_38 \ + or (y =~/^:?A~/ and f =~/(?:\.sst|\.ssm|\.ssi)/) + version='0.38' + markup=MarkupInform.new(version,'0.38' + oldlinks,@declared_markup,@declared_type) + @flag_38=true + break if i >= 200 + if y =~ /(?:~{\*+|~\[\*|~\[\+)\s/ + version='0.42' + markup=MarkupInform.new(version,'0.42' + oldlinks,@declared_markup,@declared_type) + break + end + end + if (y =~/^1~/ and f =~/(?:\.sst|\.ssm|\.ssi)/) \ + and not @flag_38 + version='0.37' + markup=MarkupInform.new(version,'0.37 is substantially 0.16 - 0.36 markup with new file-extension' + oldlinks,@declared_markup,@declared_type) + break + end + if y =~/^1~/ \ + and f =~/\.([rs])([123])/ \ + and not @flag_38 + t,n=$1,$2 + version='0.16' + instruct=if t =~/r/ + " (change file extension from .#{t}#{n} to .ssm)" + else " (change file extension from .#{t}#{n} to .sst)" + end + markup=MarkupInform.new(version,'0.16 - 0.36' + instruct + links,@declared_markup,@declared_type) + break + end + if y =~/^0\{~/ \ + and not @flag_38 + version='0.1' + markup=MarkupInform.new(version,'0.1 - 0.15',@declared_markup,@declared_type) + break + end + if y =~/^0\{{3}/ \ + and not @flag_38 + markup=MarkupInform.new('circa. 1997','old, check date',@declared_markup,@declared_type) + break + end + markup='Not a recognised file type ' + end + end + markup + else MarkupHistory.new(@opt).help_query + end + end + def determine_markup_version + if @opt.fns.nil? \ + or @opt.fns.empty? + MarkupHistory.new(@opt).help_identify + end + if File.exist?(@opt.fns) + if @opt.fns =~/\.(?:sst|ssm|ssi|s[123i]|r[123])/ + markup=identify #(@opt.fns) + if defined? markup.version + unless @opt.act[:quiet][:set]==:on + message=unless markup.declared_version.empty? + "#{@opt.fns}\n markup Type Declared as SiSU #{markup.declared_version} #{markup.declared_type}\n appears to be SiSU #{markup.version}" + else + "Markup Type Appears to be SiSU #{markup.version}\n in file #{@opt.fns}" + end + puts message + puts %{"sisu --query-#{markup.version}" for a brief description of markup type} + end + end + else puts 'file-type not recognised: ' + @opt.fns + end + else puts 'file not found: ' + @opt.fns + end + (defined? markup.version) \ + ? markup.version + : 'markup type/version not determined' + end + def markup_version? + if @opt.fns.empty? + @opt.files.each do |fns| + @opt.fns=fns + determine_markup_version + end + else determine_markup_version + end + end + end + class MarkupHistory + def initialize(opt) + @opt=opt + end + def sisu_3_0 + <<WOK + SiSU 3.0 same as 2.0, apart from change to headers + + see document markup samples, and sisu --help headers + +WOK + end + def sisu_2_0 + <<WOK + SiSU 2.0 same as 1.0, apart from the changing of headers and the addition of a monospace tag + related headers now grouped, e.g. + + @title: + :subtitle: + + @creator: + :author: + :translator: + :illustrator: + + see document markup samples, and sisu --help headers + + the monospace tag takes the form of a has '#' \#{ this enclosed text would be monospaced }# + +WOK + end + def sisu_1_0 + <<WOK + SiSU 1.0 same as 0.69 + +WOK + end + def sisu_0_69 + <<WOK + SiSU 0.69 (same as 1.0) as previous (0.57) with the addition of book index tags + /^=\{.+?\}$/ + e.g. appended to a paragraph, on a new-line (without a blank line in between) + logical structure produced assuming this is the first text "object" + ={GNU/Linux community distribution:Debian+2|Fedora|Gentoo;Free Software Foundation+5} + + Free Software Foundation, 1-6 + GNU/Linux community distribution, 1 + Debian, 1-3 + Fedora, 1 + Gentoo, + +WOK + end + def sisu_0_66 + <<WOK + SiSU 0.66 same as previous, adds semantic tags + /[:;]\{.+?\}[:;][a-z+]/ + e.g. :{ Ralph last;{Amissah};last }:author + +WOK + end + def sisu_0_65 + <<WOK + SiSU 0.65 same as previous, adds semantic tags + /[a-z+][:;]\{.+?\}[:;][a-z+]/ + e.g. author:{ Ralph last;{Amissah};last }:author + +WOK + end + def sisu_0_57 + <<WOK + + SiSU 0.57 (a subset of 1.0) is the same as 0.42 with the introduction of some + a shortcut to use the headers @title and @creator in the first heading + [expanded using the contents of the headers @title: and @author:] + + :A~ @title by @author + +WOK + end + def sisu_0_42 + <<WOK + SiSU 0.42 (a subset of 1.0) is the same as 0.38 with the introduction of some additional endnote types, + + Introduces some varations on endnotes, in particular the use of the asterisk + ~{* for example for describing an author }~ and ~{** for describing a second author }~ + + * for example for describing an author + + ** for describing a second author + + and ~[* my note ]~ or ~[+ another note ]~ which numerically increments an + asterisk and plus respectively + + *1 my note + +1 another note + +WOK + end + def sisu_0_38 + <<WOK + + SiSU 0.38 (a subset of 1.0) introduced alternative experimental header and heading/structure markers, + + @headername: and headers :A~ :B~ :C~ 1~ 2~ 3~ + + as the equivalent of (the superceded) + + 0~headername and headers 1~ 2~ 3~ 4~ 5~ 6~ + + The internal document markup of SiSU 0.16 remains valid and standard + Though note that SiSU 0.37 introduced a new file naming convention + + SiSU has in effect two sets of levels to be considered, using 0.38 notation + A-C headings/levels, pre-ordinary paragraphs /pre-substantive text, and + 1-3 headings/levels, levels which are followed by ordinary text. + This may be conceptualised as levels A,B,C, 1,2,3, and using such letter + number notation, in effect: + A must exist, optional B and C may follow in sequence (not strict) + 1 must exist, optional 2 and 3 may follow in sequence + i.e. there are two independent heading level sequences A,B,C and 1,2,3 + (using the 0.16 standard notation 1,2,3 and 4,5,6) + on the positive side: + * the 0.38 A,B,C,1,2,3 alternative makes explicit an aspect of structuring + documents in SiSU that is not otherwise obvious to the newcomer (though + it appears more complicated, is more in your face and likely to be + understood fairly quickly) + * the substantive text follows levels 1,2,3 and it is 'nice' to do + most work in those levels +WOK + end + def sisu_0_37 + <<WOK + + SiSU 0.37 introduced the file naming convention, that remains in use in SiSU + v1 and v2, using the file extensions .sst .ssm and .ssi + to replace .s1 .s2 .s3 .r1 .r2 .r3 and .si + + this is captured by the following file 'rename' instruction: + + rename 's/\.s[123]$/\.sst/' *.s{1,2,3} + rename 's/\.r[123]$/\.ssm/' *.r{1,2,3} + rename 's/\.si$/\.ssi/' *.si + + The internal document markup remains unchanged, from SiSU 0.16 +WOK + end + def sisu_0_16 + <<WOK + + SiSU 0.16 (0.15 development branch) introduced the use of + + the header 0~ and headings/structure 1~ 2~ 3~ 4~ 5~ 6~ + + in place of the 0.1 header, heading/structure notation +WOK + end + def sisu_0_1 + <<WOK + + SiSU 0.1 headers and headings structure represented by + header 0{~ and headings/structure 1{ 2{ 3{ 4{~ 5{ 6{ +WOK + end + def help_query + <<WOK + + sisu --query=[sisu version [0.38] or 'history] + provides a short history of changes to SiSU markup + +WOK + end + def help_identify + <<WOK + + sisu --identify [filename] + attempts to identify the SiSU markup used in a file + +WOK + end + def query + tell=if @opt.selections.str =~/--query/ + tell=case @opt.selections.str + when /history/ + "#{sisu_3_0}#{sisu_2_0}#{sisu_1_0}#{sisu_0_69}#{sisu_0_66}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}\n#{sisu_0_37}\n#{sisu_0_16}\n#{sisu_0_1}" + when /3.0/ + "#{sisu_3_0}#{sisu_2_0}#{sisu_1_0}#{sisu_0_69}#{sisu_0_66}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /2.0/ + "#{sisu_2_0}#{sisu_1_0}#{sisu_0_69}#{sisu_0_66}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /1.0/ + "#{sisu_1_0}#{sisu_0_69}#{sisu_0_66}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.69/ + "#{sisu_0_69}#{sisu_0_66}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.66/ + "#{sisu_0_66}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.65/ + "#{sisu_0_65}#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.57/ + "#{sisu_0_57}#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.42/ + "#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.38/ + "#{sisu_0_38}#{sisu_0_16}" + when /0.37/ + "#{sisu_0_37}\n#{sisu_0_16}" + when /0.1[6-9]|0.2[0-9]|0.3[0-6]/ + "#{sisu_0_16}\n#{sisu_0_1}" + when /0.[1-9]|0.1[1-4]/ + sisu_0_1 + else puts "NOT RECOGNISED: #{@opt.selections.str}" + help_query + end + tell + else help_query + end + end + end +end +__END__ +#%% to use as independent program -------------------------> +f=$* +cf=f[0].to_s +f.shift +match_and_replace=[] +unless f.length > 0; f=Dir.glob("[a-z]*.ss?") #restricted to sisu type files, it need not be +end +puts "SiSU files:" +puts f +f.each do |x| + SiSU_Markup::MarkupIdentify.new(x).markup_version? +end |