From a37a13fbe35be7b9a340520d313ec8a8a576a41f Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Thu, 20 Nov 2014 22:53:19 -0500 Subject: d: orgmode, add orgmode structure output to txts --- data/doc/sisu/CHANGELOG_v6 | 2 + lib/sisu/develop/constants.rb | 1 + lib/sisu/develop/hub_actions.rb | 14 ++ lib/sisu/develop/hub_options.rb | 6 + lib/sisu/develop/se_file_op.rb | 57 +++++ lib/sisu/develop/se_filemap.rb | 6 + lib/sisu/develop/se_info_env.rb | 6 + lib/sisu/develop/txt_orgmode.rb | 376 +++++++++++++++++++++++++++++++ lib/sisu/develop/txt_orgmode_decorate.rb | 186 +++++++++++++++ lib/sisu/develop/urls.rb | 13 ++ 10 files changed, 667 insertions(+) create mode 100644 lib/sisu/develop/txt_orgmode.rb create mode 100644 lib/sisu/develop/txt_orgmode_decorate.rb diff --git a/data/doc/sisu/CHANGELOG_v6 b/data/doc/sisu/CHANGELOG_v6 index 37a80918..4299810c 100644 --- a/data/doc/sisu/CHANGELOG_v6 +++ b/data/doc/sisu/CHANGELOG_v6 @@ -69,6 +69,8 @@ http://www.jus.uio.no/sisu/pkg/src/sisu_6.4.0.orig.tar.xz * txt outputs, reorganize, introduce new files + * orgmode, add orgmode structure output to txts + ** SiSU "UnFrozen" - prior to end of Debian Freeze (upstream bugfix 6.3.2 (5.7.2) intended for Jessie (packaged for Debian as 5.7.1-2) was not accepted) diff --git a/lib/sisu/develop/constants.rb b/lib/sisu/develop/constants.rb index ae086b88..c5f439ca 100644 --- a/lib/sisu/develop/constants.rb +++ b/lib/sisu/develop/constants.rb @@ -62,6 +62,7 @@ Sfx={ txt_asciidoc: '.ad', txt_markdown: '.md', txt_rst: '.rst', + txt_orgmode: '.org', html: '.html', xhtml: '.xhtml', xml: '.xml', diff --git a/lib/sisu/develop/hub_actions.rb b/lib/sisu/develop/hub_actions.rb index 6ae81b70..36a06000 100644 --- a/lib/sisu/develop/hub_actions.rb +++ b/lib/sisu/develop/hub_actions.rb @@ -278,6 +278,20 @@ module SiSU_Hub_Actions end end end + if @opt.act[:txt_orgmode][:set]==:on #% --orgmode + if @opt.f_pths.length > 0 + require_relative 'txt_orgmode' # txt_orgmode.rb + SiSU_Txt_OrgMode::Source.new(@opt).read + else + msg='orgmode request requires sisu markup files' + if (@opt.act[:verbose_plus][:set]==:on \ + || @opt.act[:maintenance][:set]==:on) + SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:yellow). + mark(msg) + else puts msg + end + end + end end def html? if @opt.act[:html][:set]==:on #% --html, -h diff --git a/lib/sisu/develop/hub_options.rb b/lib/sisu/develop/hub_options.rb index 3d46a84f..e7df01db 100644 --- a/lib/sisu/develop/hub_options.rb +++ b/lib/sisu/develop/hub_options.rb @@ -1150,6 +1150,10 @@ module SiSU_Commandline =~/"--rst"|"--rest"|"--restructuredtext"/) \ ? { bool: true, set: :on } : { bool: false, set: :na } + act[:txt_orgmode]=(select_arr.inspect \ + =~/"--org"|"--orgmode"/) \ + ? { bool: true, set: :on } + : { bool: false, set: :na } act[:manpage]=(select_arr.inspect \ =~/"--manpage"|"--man"/) \ ? { bool: true, set: :on } @@ -1407,6 +1411,7 @@ module SiSU_Commandline || act[:txt_asciidoc][:set]==:on \ || act[:txt_markdown][:set]==:on \ || act[:txt_rst][:set]==:on \ + || act[:txt_orgmode][:set]==:on \ || act[:xhtml][:set]==:on \ || act[:epub][:set]==:on \ || act[:html][:set]==:on \ @@ -1455,6 +1460,7 @@ module SiSU_Commandline || act[:txt_asciidoc][:set]==:on \ || act[:txt_markdown][:set]==:on \ || act[:txt_rst][:set]==:on \ + || act[:txt_orgmode][:set]==:on \ || act[:xhtml][:set]==:on \ || act[:epub][:set]==:on \ || act[:html][:set]==:on \ diff --git a/lib/sisu/develop/se_file_op.rb b/lib/sisu/develop/se_file_op.rb index 01d72c19..38b52f98 100644 --- a/lib/sisu/develop/se_file_op.rb +++ b/lib/sisu/develop/se_file_op.rb @@ -347,6 +347,12 @@ module SiSU_File_Op fn=base_filename.rst make_file(path,fn) end + def orgmode + path=output_path.orgmode.dir + make_path(path) + fn=base_filename.orgmode + make_file(path,fn) + end def html_scroll pth=output_path.html.dir make_path(pth) @@ -526,6 +532,17 @@ module SiSU_File_Op end self end + def orgmode + def dir + output_path.orgmode.dir + '/' \ + + base_filename.orgmode + end + def rel + output_path.orgmode.rel + '/' \ + + base_filename.orgmode + end + self + end def html_scroll def dir output_path.html_scroll.dir + '/' \ @@ -961,6 +978,24 @@ module SiSU_File_Op end i18n(fnh) end + def orgmode(fh=nil) + fh=default_hash_build(fh,Sfx[:txt_orgmode]) + fh[:lng]=lang_code?(fh[:lng]) + fnh=if output_dir_structure.by_filename? + { + fn: 'plain', + ft: fh[:ft], + lng: fh[:lng], + } + else + { + fn: fh[:fn], + ft: fh[:ft], + lng: fh[:lng], + } + end + i18n(fnh) + end def html_scroll(fh=nil) fh=default_hash_build(fh,Sfx[:html]) fh[:lng]=lang_code?(fh[:lng]) @@ -1887,6 +1922,28 @@ module SiSU_File_Op end self end + def orgmode + def ft + 'orgmode' \ + + DEVELOPER[:under_construction] + end + def dir + set_path(ft).dir.abc + end + def url + set_path(ft).url.abc + end + def rel + set_path(ft).rel.abc + end + def rcp + set_path(ft).rcp.abc + end + def rel_sm + set_path(ft).rel_sm.ab + end + self + end def html_scroll def ft 'html' diff --git a/lib/sisu/develop/se_filemap.rb b/lib/sisu/develop/se_filemap.rb index 1179e417..10931b74 100644 --- a/lib/sisu/develop/se_filemap.rb +++ b/lib/sisu/develop/se_filemap.rb @@ -96,6 +96,9 @@ module SiSU_File_Map if @md.opt.act[:txt_rst][:set]==:on #% --rst, --rest ft << @md.fn[:txt_rst] end + if @md.opt.act[:txt_orgmode][:set]==:on #% --orgmode + ft << @md.fn[:txt_orgmode] + end if @md.opt.act[:xhtml][:set]==:on #% --xhtml, -b xhtml ft << @md.fn[:xhtml] end @@ -164,6 +167,9 @@ module SiSU_File_Map if @opt.act[:txt_rst][:set]==:on #% --rst, --rest ft << 'plain.txt' << '??.plain.txt' << 'plain.??.txt' end + if @opt.act[:txt_orgmode][:set]==:on #% --orgmode + ft << 'plain.txt' << '??.plain.txt' << 'plain.??.txt' + end if @opt.act[:xhtml][:set]==:on #% --xhtml, -b xhtml ft << 'scroll.xhtml' << '??.scroll.xhtml' << 'scroll.??.xhtml' end diff --git a/lib/sisu/develop/se_info_env.rb b/lib/sisu/develop/se_info_env.rb index 8c20d085..941452de 100644 --- a/lib/sisu/develop/se_info_env.rb +++ b/lib/sisu/develop/se_info_env.rb @@ -568,6 +568,12 @@ module SiSU_Info_Env ? @rc['rst']['ocn'] : false end + def orgmode_ocn? + ((defined? @rc['orgmode']['ocn']) \ + && @rc['orgmode']['ocn']==true) \ + ? @rc['orgmode']['ocn'] + : false + end def widget #needs (md) #move @rc=SiSU_Env::GetInit.new.sisu_yaml.rc @ad=SiSU_Env::GetInit.new.ads diff --git a/lib/sisu/develop/txt_orgmode.rb b/lib/sisu/develop/txt_orgmode.rb new file mode 100644 index 00000000..e8fc38ad --- /dev/null +++ b/lib/sisu/develop/txt_orgmode.rb @@ -0,0 +1,376 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** plaintext (smarttext) generation, orgmode structure + +** Author: Ralph Amissah + + + +** 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 . + + 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: + + + +** Git + + + +=end +module SiSU_Txt_OrgMode + require_relative 'ao' # ao.rb + require_relative 'se' # se.rb + include SiSU_Env + require_relative 'shared_metadata' # shared_metadata.rb + require_relative 'generic_parts' # generic_parts.rb + require_relative 'txt_read' # txt_read.rb + require_relative 'txt_shared' # txt_shared.rb + require_relative 'txt_orgmode_decorate' # txt_orgmode_decorate.rb + require_relative 'txt_output' # txt_output.rb + include SiSU_Param + @@alt_id_count,@@alt_id_count=0,0 + @@tablefoot='' + class Source + include SiSU_Txt_Read + def initialize(opt) + @opt=opt + unless @opt.fns =~/(.+?)\.(?:-|ssm\.)?sst$/ + puts "#{sf} not a processed file type" + end + end + def read + begin + md=SiSU_Param::Parameters.new(@opt).get + specific={ + description: 'OrgMode (plaintext utf-8)', + output_path: md.file.output_path.orgmode.dir, + output_file: md.file.base_filename.orgmode, + } + read_generic(@opt,specific) + SiSU_Txt_OrgMode::Source::Scroll.new(md,@ao_array,@wrap_width).songsheet + rescue + SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do + __LINE__.to_s + ':' + __FILE__ + end + ensure + end + end + private + class Scroll appropriately within plaintext, consider + n=n.dup.to_s + if n =~/#{Mx[:br_line]}|#{Mx[:br_nl]}/ + fix = n.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/) #watch #added + fix.each do |x| + unless x.empty? then @n << x + end + end + else @n << n + end + end + notes=@n.flatten + notes.each do |e| + util=(e.to_s =~/^\[[\d*+]+\]:/) \ + ? (SiSU_TextUtils::Wrap.new(e.to_s,@wrap_width,4,1)) + : (SiSU_TextUtils::Wrap.new(e.to_s,@wrap_width,1,1)) + wrap=util.line_wrap + wrap=if wrap =~ /^\s*[\d*+]+\s+.+?\s*\Z/m + wrap.gsub(/^(\s*)([\d*+]+)\s+(.+?)\s*\Z/m, <<-GSUB +\\1[\\2]: \\3 + GSUB + ) + else + wrap.gsub(/^(.+)\Z/m, <<-GSUB +\\1 + GSUB + ) + end + @@endnotes[:para] << "-#{wrap}" + @@endnotes[:end] << '' << wrap + end + @@endnotes + end + # Used for extraction of endnotes from paragraphs + def plaintext_metadata + array=SiSU_Metadata::Summary.new(@md).plaintext.metadata + array.each do |meta| + tag,inf=meta.scan(/^.+?:\s|.+/) + if tag and inf + util=SiSU_TextUtils::Wrap.new(inf,@wrap_width,15,1) + txt=util.line_wrap + @plaintext[:metadata] <<<]'). + gsub(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}image/,'\1 [link: local image]'). + gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/,"#{the_text.url_open}\\1#{the_text.url_close}") + extract_endnotes(dob) + dob.obj=dob.obj.gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'[^\1]'). # endnote marker marked up + gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'[^\1]'). # endnote marker marked up + gsub(/#{Mx[:gl_o]}(?:#lt|#060)#{Mx[:gl_c]}/,'<'). + gsub(/#{Mx[:gl_o]}(?:#gt|#062)#{Mx[:gl_c]}/,'>'). + gsub(/#{Mx[:gl_o]}#(?:038|amp)#{Mx[:gl_c]}/,'&'). + gsub(/#{Mx[:gl_o]}#033#{Mx[:gl_c]}/,'!'). + gsub(/#{Mx[:gl_o]}#035#{Mx[:gl_c]}/,'#'). + gsub(/#{Mx[:gl_o]}#042#{Mx[:gl_c]}/,'*'). + gsub(/#{Mx[:gl_o]}#045#{Mx[:gl_c]}/,'-'). + gsub(/#{Mx[:gl_o]}#047#{Mx[:gl_c]}/,'/'). + gsub(/#{Mx[:gl_o]}#095#{Mx[:gl_c]}/,'_'). + gsub(/#{Mx[:gl_o]}#123#{Mx[:gl_c]}/,'{'). + gsub(/#{Mx[:gl_o]}#125#{Mx[:gl_c]}/,'}'). + gsub(/#{Mx[:gl_o]}#126#{Mx[:gl_c]}/,'~'). + gsub(/#{Mx[:gl_o]}#169#{Mx[:gl_c]}/,'©'). + gsub(/#{Mx[:gl_o]}#092#{Mx[:gl_c]}/,'\\') + end + dob.obj=if dob.of==:block # watch + dob.obj.gsub(/#{Mx[:gl_o]}●#{Mx[:gl_c]}/m,"* "). + gsub(/\n?#{Mx[:br_line]}\n?|\n?#{Mx[:br_nl]}\n?/m,break_line) + else dob.obj.gsub(/\n?#{Mx[:br_line]}\n?|\n?#{Mx[:br_nl]}\n?/m,break_line*2) + end + if dob.is==:code + dob.obj=dob.obj.gsub(/(^|[^}])_([<>])/m,'\1\2'). # _> _< + gsub(/(^|[^}])_([<>])/m,'\1\2') # _<_< + end + dob.obj=dob.obj.gsub(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/,'\1'). + gsub(/(.+?)<\/a>/m,'\1'). + gsub(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,''). # remove name links + gsub(/ |#{Mx[:nbsp]}/,' '). # decide on + gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}(\S+?\.(?:png|jpg|gif)) .+?#{Mx[:lnk_c]}#{Mx[:url_o]}\S+?#{Mx[:url_c]}/,' [ \1 ]'). #"[ #{dir.url.images_local}\/\\1 ]") + gsub(/(?:^|[^_\\])#{Mx[:lnk_o]}(\S+?\.(?:png|jpg|gif)) .+?#{Mx[:lnk_c]}image/,' [ \1 ]'). + gsub(/(?:^|[^_\\])\{\s*\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"\s*\}\S+/,'[image: "\1"]') + if dob.obj !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/ + p_num='' + #ocn + if dob.is==:heading \ + or dob.is==:para + plaintext_structure(dob,p_num) + elsif dob.is==:group \ + or dob.is==:block \ + or dob.is==:verse \ + or dob.is==:code \ + or dob.is==:table + @plaintext[:body] << dob.obj + p_num << break_line + elsif dob.is==:break + sp=' ' + ln='<' #ln='-' + @plaintext[:body] <<=if dob.obj==Mx[:br_page] \ + or dob.obj==Mx[:br_page_new] \ + or dob.obj==Mx[:br_page_line] + "#{break_line}#{ln*40}#{break_line*2}" + elsif dob.obj ==Mx[:br_obj] + "#{break_line}#{sp*20}* * *#{break_line*2}" + end # following empty line (break_line) missing, fix + end + dob='' if (dob.obj =~// \ + and dob.obj =~/^(-\{{2}~\d+|)/) # -endnote + if dob ## Clean Prepared Text + dob.obj=dob.obj.gsub(//,' '). + gsub(/<:\S+>/,' ') + end + end + end + @plaintext + end + def publish(plaintext) + divider='=' + content=[] + content << plaintext[:open] + content << plaintext[:head] + content << plaintext[:body] + if @@endnotes_ + content << '** Endnotes' << @@endnotes[:end] + end + content << plaintext[:metadata] + content << "#{break_line}#{divider*@wrap_width}#{break_line}" if @md.stmp =~/\w+/ #not used? + content << plaintext[:tail] + outputfile=SiSU_Env::FileOp.new(@md).write_file.orgmode + Txt_Output::Output.new.document(content,outputfile) + @@endnotes={ para: [], end: [] } + end + end + end +end +__END__ diff --git a/lib/sisu/develop/txt_orgmode_decorate.rb b/lib/sisu/develop/txt_orgmode_decorate.rb new file mode 100644 index 00000000..67813729 --- /dev/null +++ b/lib/sisu/develop/txt_orgmode_decorate.rb @@ -0,0 +1,186 @@ +# encoding: utf-8 +=begin + +* Name: SiSU + +** Description: documents, structuring, processing, publishing, search +*** plaintext decoration + +** Author: Ralph Amissah + + + +** 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 . + + 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: + + + +** Git + + + +=end + +module SiSU_Decorate_Txt_OrgMode + def decorate + def heading + def inline + def l0 + '*' + end + def l1 + '**' + end + def l2 + '***' + end + def l3 + '****' + end + def l4 + '*****' + end + def l5 + '******' + end + self + end + self + end + def bold + def open + '*' + end + def close + '*' + end + self + end + def italics + def open + '/' + end + def close + '/' + end + self + end + def underscore + def open + '' + end + def close + '' + end + self + end + #def emphasis + # def open + # '' + # end + # def close + # '' + # end + # self + #end + def cite + def open + '"' + end + def close + '"' + end + self + end + def insert + def open + '' + end + def close + '' + end + self + end + def strike + def open + '+' + end + def close + '+' + end + self + end + def superscript + def open + '^' + end + def close + '^' + end + self + end + def subscript + def open + '~' + end + def close + '~' + end + self + end + def hilite #bold + def open + '*' + end + def close + '*' + end + self + end + def monospace + def open + '~' + end + def close + '~' + end + self + end + self + end +end +__END__ diff --git a/lib/sisu/develop/urls.rb b/lib/sisu/develop/urls.rb index fc84f16b..6fa28a4b 100644 --- a/lib/sisu/develop/urls.rb +++ b/lib/sisu/develop/urls.rb @@ -197,6 +197,15 @@ module SiSU_Urls fn: @fn[:txt_textile], } end + def orgmode + { + cmd: '--orgmode', + viewer: @prog.web_browser, + f_pth: @md.file.output_path.orgmode.dir + '/' \ + + @md.file.base_filename.orgmode, + fn: @fn[:txt_orgmode], + } + end self end def html @@ -557,6 +566,10 @@ module SiSU_Urls show.report(report_info.text.rst) #show.maintenance(report_info.text.rst) end + if @opt.act[:txt_orgmode][:set]==:on + show.report(report_info.text.orgmode) + #show.maintenance(report_info.text.orgmode) + end if (@opt.act[:html][:set]==:on \ or @opt.act[:html_scroll][:set]==:on \ or @opt.act[:html_seg][:set]==:on) -- cgit v1.2.3