# coding: utf-8
=begin
* Name: SiSU
* Description: a framework for document structuring, publishing and search
* Author: Ralph Amissah
* Copyright: (C) 1997 - 2009 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: opendocument text generation
=end
module SiSU_ODF
require "#{SiSU_lib}/particulars"
include SiSU_Particulars
require "#{SiSU_lib}/dal"
require "#{SiSU_lib}/sysenv"
include SiSU_Env
include SiSU_Viz
require "#{SiSU_lib}/odf_format"
include SiSU_ODF_format
require "#{SiSU_lib}/shared_txt"
require "#{SiSU_lib}/shared_structure"
@@alt_id_count,@@alt_id_count,@@tablehead,@@number_of_cols=0,0,0,0
class Source
require 'zlib'
require 'find'
require 'fileutils'
include FileUtils
def initialize(opt)
@opt=opt
@particulars=SiSU_Particulars::Combined_singleton.instance.get_all(opt)
@@endnotes_para=[]
end
def read
begin
@env,@md,@dal_array=@particulars.env,@particulars.md,@particulars.dal_array
@env.odf_structure
opendoc=@md.fn[:odf]
path=@env.path.output_tell
tool=if @opt.cmd =~/[MVv]/; "#{@env.program.odf_viewer} #{path}/#{@md.fnb}/#{opendoc}"
else ''
end
tell=SiSU_Screen::Ansi.new(@opt.cmd,'Opendocument (ODF:ODT)',tool)
tell.green_hi_blue unless @opt.cmd =~/q/
tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{opendoc}")
tell.flow if @opt.cmd =~/[MV]/
my_make=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns)
SiSU_ODF::Source::Scroll.new(@particulars).songsheet
SiSU_Env::Info_skin.new(@md).select
rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error
ensure
end
end
private
class Scroll [],:open=>[],:close=>[],:head=>[],:metadata=>[],:tail=>[],:endnotes=>[] }
@@docstart=true
@@fns,@@dp=nil,nil
def initialize(particulars)
@env,@md,@dal_array=particulars.env,particulars.md,particulars.dal_array
@vz=SiSU_Env::Get_init.instance.skin
@dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern
@regx=/^(?:(?:#{Mx[:br_page]}\s*|#{Mx[:br_page_new]}\s*)?#{Mx[:lv_o]}\d:(\S*?)#{Mx[:lv_c]})?\s*(.+?)\s*#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#@dp:#@dp#{Mx[:id_c]}$/
@serial=/\s*#{Mx[:id_o]}~\d+;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#@dp:#@dp#{Mx[:id_c]}\s*/
@tab="\t"
@url_brace=SiSU_Viz::Skin.new.url_decoration
@br=if @md.cmd =~/M/; "\n"
else ''
end
end
def songsheet
pre
@data=markup(@dal_array)
post
publish
end
# Used for extraction of endnotes from paragraphs
def extract_endnotes(para='')
notes=para.scan(/#{Mx[:en_a_o]}(\d+\s+.+?)\s*#{Mx[:id_o]}#@dp#{Mx[:id_c]}#{Mx[:en_a_c]}/)[1]
@n=[]
notes.each do |n| #high cost to deal with appropriately within odf, consider
n=n.dup.to_s
if n =~/#{Mx[:br_line]}/
fix=n.split(/#{Mx[:br_line]}/) #watch #added
fix.each do |x|
if x =~/\S+/; @n << x
end
end
else @n << n
end
end
end
def odf_metadata(meta)
#meta.el,meta.txt,meta.type,meta.attrib
end
def odf_tail
generator="Generated by: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" if @md.sisu_version[:version]
lastdone="Last Generated on: #{Time.now}"
rubyv="Ruby version: #{@md.ruby_version}"
sc=if @md.sc_info
"Source file: #{@md.sc_filename}\nVersion number: #{@md.sc_number}\nVersion date: #{@md.sc_date}\n"
else ''
end
url=@md.fnb
fn=@md.fn[:manifest]
manifest="#{@vz.url_root_http}/#{url}/#{fn}"
@@odf[:tail] << %{Available document outputs: <#{manifest} > }
@@odf[:tail] << %{\nSiSU: <www.jus.uio.no/sisu > and <www.sisudoc.org > }
@@odf[:tail] << "\n"
end
def heading(para,no)
para.gsub!(@serial,'')
para.gsub!(/#{Mx[:mk_o]}:name#\S+?#{Mx[:mk_c]}/,'')
para.gsub!(/^#{Mx[:lv_o]}(\d):\S*?#{Mx[:lv_c]}\s*/,'')
m=/#{$1}/
breakpage=''
if @md.fns \
and @md.fns != '' \
and @md.fns !=@@fns
@@docstart=true
@@fns=@md.fns
end
unless @@docstart
breakpage=if (@md.pagenew or @md.pagebreak) \
and (@md.pagenew =~ m or @md.pagebreak =~m)
' '
else ''
end
end
@@docstart=false
%{#{breakpage}#{para} }
end
def image_src(i)
image_source=if @md.fns =~/\.ss[tm]$/ \
and FileTest.file?("#{@env.path.image_source_local_tex}/#{i}") #review
@env.path.image_source_local_tex
elsif @md.fns =~/\.-ss[tm]$/ \
and FileTest.file?("#{@env.path.image_source_remote_tex}/#{i}")
@env.path.image_source_remote_tex
elsif FileTest.file?("#{@env.path.image_source_tex}/#{i}")
@env.path.image_source_tex
else
tell=SiSU_Screen::Ansi.new(@md.cmd,"ERROR - image:",%{"#{i}" missing},"search locations: #{@env.path.image_source_local_tex},#{@env.path.image_source_remote_tex} and #{@env.path.image_source_tex}")
tell.error2 unless @md.cmd =~/q/
nil
end
end
def image_odf(img)
# copy image to od image directory (unless exists)
# divide pixel dimension by 37.79485 and retain 3 decimal places
# x=str.scan(/(aa[^a]+)/)
m,u=img[1],img[2]
i=/^(\S+?\.(?:png|jpg|gif))/.match(m).captures.join if m =~/^(\S+?\.(?:png|jpg|gif))/
c=/^\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"/.match(m).captures.join if m =~/^\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"/
w,h=/(\d+)x(\d+)/.match(m).captures if m =~/\d+x\d+/
w=(w.to_i/37.79485).to_s
h=(h.to_i/37.79485).to_s
h=/([0-9]+\.\d{0,3})/.match(h).captures.join
w=/([0-9]+\.\d{0,3})/.match(w).captures.join
image_source=image_src(i)
pwd=Dir.pwd
cp("#{image_source}/#{i}","#{@env.path.odf}/Pictures/#{i}") if image_source
img=if i.to_s =~/jpg|png|gif/ \
and h.to_s =~/\d/ \
and w.to_s =~/\d/
@@img_count +=1
%{ #{c}} #anchor-type: as-char or paragraph or char or ...
else %{[image omitted] }
end
end
def image(para)
para.gsub!(@serial,'')
m=para.scan(/(#{Mx[:lnk_o]}\s*(.+?)\s*#{Mx[:lnk_c]}((?:https?|file|ftp)\S+|image))/)
if m; m.each do |i|
cont,url=i[1],i[2]
cont.gsub!(/([)(\]\[])/,"\\\\\\1")
cont.gsub!(/([+?])/,"\\\\\\1") # incorrect handling of +
url.gsub!(/([+?])/,"\\\\\\1")
para.sub!(/#{Mx[:lnk_o]}\s*#{cont}\s*#{Mx[:lnk_c]}#{url}/m,image_odf(i)) #watch
para.gsub!(/\\([)(\]\[?])/,'\1') #clumsy fix
end
m=nil
end
para
end
def text_link_odf(txt,url,trail)
txt.gsub!(/(\\\+)/,'+') #this is convoluted, and risky :-(
url.gsub!(/(\\\+)/,'+') #this is convoluted, and risky :-(
%{#{txt.strip} #{trail}}
end
def text_link(para)
para.gsub!(@serial,'')
m=para.scan(/(#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}((?:https?|file|ftp)\S+?))([;.,]?(?=\s|$))/) #sort
if m
m.each do |i|
txt,url,trail=i[1],i[2]
txt.gsub!(/([)(\]\[])/,"\\\\\\1")
txt.gsub!(/([+?*])/,"\\\\\\1") # problems with +
url.gsub!(/([+?])/,"\\\\\\1") # problems with +
para.gsub!(/#{Mx[:lnk_o]}\s*#{txt}#{Mx[:lnk_c]}#{url}/m,text_link_odf(txt,url,trail)) #make sure trailing ']' are not caught in url
para.gsub!(/\\([)(\]\[?])/,'\1') #clumsy fix
end
m=nil
end
para
end
def normal(para) #P1 - P3
para.gsub!(@serial,'')
para.gsub!(/\b[_\\]((?:https?|file|ftp):\/\/\S+?\.[^'"><\s]+?)([;.,]?(?:\s|$))/,
'\1 \2') #http ftp matches escaped, no decoration
para.gsub!(/((?:^|\s)#{Mx[:lnk_c]})((?:https?|file|ftp):\/\/\S+?\.[^'"><\s]+?)([;.,]?(?=\s|$))/,
'\1\2 \3') #special case \{ e.g. \}http://url
para.gsub!(/(^|#{Mx[:gl_c]}|\s)((?:https?|file|ftp):\/\/\S+?\.[^'"><\s]+?)([;.,]?(?=\s|$))/,
%{\\1#{@url_brace.xml_open}\\2 #{@url_brace.xml_close}\\3}) #http ftp matches with decoration
#para.gsub!(/\b((?:https?|ftp):\/\/\S+?\.[^'"><\s]+?)([;.,]?(?:\s|$))/, also works
#%{#{@url_brace.xml_open}\\1 #{@url_brace.xml_close}\\2}) #http ftp matches with decoration
para.gsub!(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)/,
%{#{@url_brace.xml_open}\\1 #{@url_brace.xml_close}}) if para !~/http:\/\// # improve upon, document crash where url contains '@' symbol
para=case para
when /^#{Mx[:pa_o]}:i([1-9])#{Mx[:pa_c]}/m
m=$1
para.gsub!(/^#{Mx[:pa_o]}:i#{m}#{Mx[:pa_c]}/m,'')
%{#{para} }
else %{#{para} }
end
para
end
def fontface(para)
#para=para.gsub(/(.+?)<\/b>/,%{\\1 })
#para=para.gsub(/(.+?)<\/i>/,%{\\1 })
end
def footnote(para)
@astx||=10000
para.gsub!(/#{Mx[:id_o]}#@dp#{Mx[:id_c]}(#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/,'\1')
#para.gsub!(/ <:i[1-9]>/,' ')
if para =~/#{Mx[:en_a_o]}\d+\s+/
para=para.gsub(/#{Mx[:en_a_o]}(\d+)\s+(.+?)#{Mx[:en_a_c]}/,'\1 \2 ')
end
if para=~/#{Mx[:en_a_o]}[*+]+\s/
asterisk=para.scan(/#{Mx[:en_a_o]}([*+]+)\s+(.+?)#{Mx[:en_a_c]}/)
asterisk.each do |x|
a=x[0].gsub(/([*+])/,"\\\\\\1")
para=para.gsub(/#{Mx[:en_a_o]}(#{a})\s+(.+?)#{Mx[:en_a_c]}/,%{\\1 \\2 })
@astx+=1
end
end
if para=~/#{Mx[:en_b_o]}[*+]\d+\s/
asterisk=para.scan(/#{Mx[:en_b_o]}([*+]\d+)\s+(.+?)#{Mx[:en_b_c]}/)
asterisk.each do |x|
a=x[0].gsub(/([*+])/,"\\\\\\1")
para=para.gsub(/#{Mx[:en_b_o]}(#{a})\s+(.+?)#{Mx[:en_b_c]}/,%{\\1 \\2 })
@astx+=1
end
end
para
end
def group_clean(para)
para.gsub!(/ | |#{Mx[:nbsp]}/,' ')
para.gsub!(/,'<'); para.gsub!(/>/,'>')
para.gsub!(/<(text:span text:style-name="T[1-5]"|\/text:span)>/,'<\1>') #works, not ideal
para.gsub!(/#{Mx[:br_line]}/,' ')
para.gsub!(/<br(?:\s+\/)?>/,' ')
#para.gsub!(/\s\s/,' ')
para
end
def poem(para) #P4 #same as group
para.gsub!(@serial,'')
para.gsub!(/#{Mx[:gr_o]}verse(?:-end)?#{Mx[:gr_c]}\s*/m,'')
parray=[]
para.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock|
parablock=group_clean(parablock)
parray << %{#{parablock} } if parablock =~/\S+/
end
para=parray.join + ' '
end
def group(para) #P4 #same as verse
para.gsub!(@serial,'')
para.gsub!(/#{Mx[:gr_o]}group(?:-end)?#{Mx[:gr_c]}\s*/m,'')
parray=[]
para.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock|
parablock=group_clean(parablock)
parablock.gsub!(/<text:a xlink:type="simple" xlink:href="(.+?)">/m,'')
parablock.gsub!(/<(\/text:a)>/,'<\1>')
parablock.gsub!(/<(text:note text:id=.+?)>/,'<\1>')
parablock.gsub!(/<(text:p text:style-name="Footnote")>/,'<\1>')
parablock.gsub!(/<(\/?text:(?:note-citation|note-body|note|p))>/,'<\1>')
parablock=footnote(parablock)
parray << %{#{parablock} } if parablock =~/\S+/
end
para=parray.join + ' '
end
def code(para) #P5
para.gsub!(@serial,'')
para.gsub!(/#{Mx[:gr_o]}code(?:-end)?#{Mx[:gr_c]}\s*/m,'')
para.gsub!(/\s\s/,' ')
parray=[]
para.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock|
parablock=group_clean(parablock)
parablock.gsub!(/^\s*$/,' ')
parablock.gsub!(/\b[_\\]((?:https?|file|ftp):\/\/\S+?\.[^'"><\s]+?)([;.,]?(?:\s|$))/,
'\1 \2') #http ftp matches escaped, no decoration
parray << %{#{parablock} } if parablock =~/\S+/
end
para=parray.join + ' '
para
end
def table(para) #
if para =~/#{Mx[:gr_o]}Th?.+/ # tables come as single block
txt_obj={:table =>para}
table=SiSU_ODF_format::Table.new(@md,txt_obj)
para=table.table_split
end
end
def odf_structure(md,t_o)
@md,@t_o=md,t_o
if t_o.class == Hash
para =t_o[:txt] || nil
lv =t_o[:lv] || nil
ocn =t_o[:ocn] || nil
hname =t_o[:h_name] || nil
#@h_name =t_o[:h_name] || nil
#elsif t_o.class == Array
# @txt =txt[0]
#elsif t_o.class == String
# @txt =txt
else
#@one,@two,@three=one,two,three
p t_o.class
p caller
end
lv=lv.to_i
n=lv - 1
n3=lv + 2
lv=nil if lv == 0
para=unless para=~/^#{Mx[:gr_o]}code#{Mx[:gr_c]}/
para=if para =~/#{Mx[:lnk_o]}\s*\S+?\.(?:png|jpg|gif)\s.+?#{Mx[:lnk_c]}(?:(?:https?|file|ftp):\S+|image)/; image(para)
elsif para =~/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}(?:(?:https?|file|ftp):\S+|image)/; text_link(para)
else para
end
else para
end
para=footnote(para)
if lv
@@odf[:body] << case lv
when 1; heading(para,'1') << @br*2
when 2; heading(para,'2') << @br*2
when 3; heading(para,'3') << @br*2
when 4; heading(para,'4') << @br*2
when 5; heading(para,'5') << @br*2
when 6; heading(para,'6') << @br*2
end
elsif para =~ /#{Mx[:gr_o]}verse(?:-end)?#{Mx[:gr_c]}/
@@odf[:body] << poem(para)
@@odf[:body] << @br*2
elsif para =~ /#{Mx[:gr_o]}group(?:-end)?#{Mx[:gr_c]}/
@@odf[:body] << group(para)
@@odf[:body] << @br*2
elsif para =~ /#{Mx[:gr_o]}code(?:-end)?#{Mx[:gr_c]}/
@@odf[:body] << code(para)
@@odf[:body] << @br*2
elsif para =~ /#{Mx[:gr_o]}Th?/ #elsif para =~ /<\-_&!@%~#\]\[*=$| \n+`#{Mx[:tc_p]}]/u
dir=SiSU_Env::Info_env.new(@md.fns)
@data_mod,@endnotes,@level,@cont,@copen,@odf_contents_close=Array.new(6){[]}
@rcdc=false
(0..6).each { |x| @cont[x]=@level[x]=false }
(4..6).each { |x| @odf_contents_close[x]='' }
odf_tail #($1,$2)
fix=[]
bullet=image_src('bullet_09.png')
cp("#{bullet}/bullet_09.png","#{@env.path.odf}/Pictures/.") #if image_src('bullet_09.png')
data.each do |para|
para.gsub!(/#{Mx[:id_o]}~0;0:0;x\d+#{Mx[:id_c]}/,'') # if book index? remove
#p para if para =~safe_characters and @md.cmd =~/V/ #KEEP
#para.gsub!(/<(~\d+;(?:\w|[0-6]:)\d+;\w\d+)><(#@dp:#@dp)>/,'<\1><\2>')
para='' if para =~/#{Mx[:lv_o]}\d+:.*?#{Mx[:lv_c]}.+?#{Mx[:pa_non_object_dummy_heading]}/
para_array=[]
para.gsub!(/,'<'); para.gsub!(/>/,'>')
word=para.scan(/\S+|\n/)
if word
word.each do |w| # _ - / # | : ! ^ ~
unless para =~/^(?:#{Rx[:meta]}|%+ )/m
w.gsub!(/(?:126|152);/,'~') #126 usual
if w !~/&\S{1,7};/ \
or w =~/ /
w.gsub!(/&/,'&') #watch
end
end
para_array << w
end
para=para_array.join(' ')
para=para.strip
end
if para =~/#{Mx[:gr_o]}code#{Mx[:gr_c]}/ #code-block: angle brackets special characters
para.gsub!(/(^|[^}])_/m,'\1>')
para.gsub!(/(^|[^}])_/m,'\1>')
end
para.gsub!(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1')
para.gsub!(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1 ')
para.gsub!(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1 ')
para.gsub!(/#{Mx[:mk_o]}:name#\S+?#{Mx[:mk_c]}/,'')
para.gsub!(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;')
para.gsub!(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;')
para.gsub!(/#{Mx[:mk_o]}[~-]##{Mx[:mk_c]}/,'')
para.gsub!(/^(#{Mx[:pa_o]}:i[1-9]#{Mx[:pa_c]}\s*)?#{Mx[:gl_bullet]}/,'\1 ') # bullet_09.png
#para.gsub!(/^(<:i[1-9]>\s+)?_\*\s+/,'\1● ') #bullet
#para.gsub!(/^(<:i[1-9]>\s+)?_\*\s+/,'\1● ') # bullet utf8, make smaller if used
#para.gsub!(/^_\*\s+/,'● ') #bullet
para.gsub!(/^(#{Mx[:pa_o]}:i[1-9]#{Mx[:pa_c]})\s*#{Mx[:gl_bullet]}/,'\1 · ') #bullet
para.gsub!(/^#{Mx[:gl_bullet]}/,'· ') #bullet
para.gsub!(/#{Mx[:br_line]}/,' ')
para.gsub!(/#{Mx[:br_page]}|#{Mx[:br_page_new]}/,' ')
para.gsub!(/©/,'©') #too arbitrary
para.gsub!(/.+?<-#>/,'') # remove dummy headings (used by html) #check
para.gsub!(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'\1 ')
para.gsub!(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1 ')
para.gsub!(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1 ')
para.gsub!(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1 ')
para.gsub!(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1 ')
para.gsub!(//u,'-')
para.gsub!(/ /u, ' ') # space identify
para.gsub!(/ /u, ' ') # space identify
para.gsub!(/·/u,'*')
para.gsub!(/[–—]/u,'-') #— – chk
para.gsub!(/ < /i,'<')
para.gsub!(/\\copy(?:right)?\b/,'©')
para.gsub!(/\\trademark\b|\\tm\b/,'®')
#para.gsub!(/\43/,'#') ## watch
#para.gsub!(/$/,'$') #$ watch
para.gsub!(/\44/,'$') #$ watch
#para.gsub!(/^·/,'_*') #$ watch
#para.gsub!(/·/,'*') #$ watch
para.gsub!(/#{Mx[:br_page]}|#{Mx[:br_page_new]}/,'') # remove page breaks
para.gsub!(/^\s*#{Mx[:id_o]}~\d+;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#@dp:#@dp#{Mx[:id_c]}/,'') # remove empty lines
para.gsub!(/(.+?)<\/a>/,'\1')
para.gsub!(/#{Mx[:mk_o]}name#\S+?#{Mx[:mk_c]}/,'') # remove name links
#para.gsub!(/ (.+?)<\/a>/im,'\1')
#para.gsub!(/ /,' ') # decide on
#para.gsub!(/\{(\S+?\.(?:png|jpg)) .+?\}(?:http:\/\/\S+|image)/," [ \\1 ]") #"[ #{@env.url.images_local}\/\\1 ]")
#para.gsub!(/");
#p para if para =~safe_characters and @md.cmd =~/M/ #KEEP
#para.gsub!(/^(\{\S+?\.(?:png|jpg)\s+.+?"(.*?)"\s*\}\S+)/,"\\1 \n [image: \"\\2\"]")
wordlist=para.scan(/\S+/)
para=tidywords(wordlist).join(' ').strip
if para =~/^#{Rx[:meta]}(\S+)\s+(.+?)\Z/m # for headers
d_meta=SiSU_text_utils::Header_scan.new(@md,para).meta
if d_meta; odf_metadata(d_meta)
end
end
@rcdc=true if @rcdc==false \
and (para =~/~metadata/ or para =~/#{Mx[:lv_o]}1:meta#{Mx[:lv_x]}\s*Document Information/)
if para !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/
if para =~@regx #/.+?<~\d+;\w\d+;\w\d+>.*/ #watch change
paranum=para[@regx,3]
@p_num=SiSU_ODF_format::Paragraph_number.new(paranum)
end
@sto=SiSU_Structure::Split_text_object.new(@md,para).odt
#yyyy-mm-ddT00:00:00 #{ocn} #followed immediately by paragraph closure
### problem in scroll, it appears tables are getting paragraph numbers
unless @rcdc
m=/#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#@dp:#@dp#{Mx[:id_c]}$/
if para =~m \
and para=~/\S+/
para=case @sto.format
when /^(1):(\S*)/
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
para
when /^(2):(\S*)/
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
para
when /^(3):(\S*)/
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
para
when /^(4):(\S+)/ # work on see Split_text_object
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
# work on see SiSU_text_parts::Split_text_object
para
when /^(5):(\S*)/
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
para
when /^(6):(\S*)/
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
para
else
txt_obj={:txt =>para}
odf_structure(@md,txt_obj) #watch may be problematic
para
end
end
if para =~/ / \
and para =~/^(-\{{2}~\d+|)/ # -endnote
para=''
end
if (para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/)
# i don't get the condition for no paranum
end
else
if para =~ /^(4)~(\S+)/
txt_obj={:txt =>para,:lv =>$1,:ocn =>@sto.ocn,:h_name=>$2}
odf_structure(@md,txt_obj)
para
elsif para =~/#{Mx[:id_o]}~(\d+);m\d+;[mdv]\d+#{Mx[:id_c]}#{Mx[:id_o]}#@dp:#@dp#{Mx[:id_c]}$/
txt_obj={:txt =>para}
odf_structure(@md,txt_obj) #watch may be problematic
para
end
end
para.gsub!(//,' ') if para ## Clean Prepared Text
para.gsub!(/#{Mx[:gr_o]}.+?#{Mx[:gr_c]}/,' ') if para ## CHECK Clean Prepared Text
para.gsub!(/#{Mx[:tc_o]}.+?#{Mx[:tc_c]}/,' ') if para ## CHECK Clean Prepared Text
para.gsub!(/<:\S+>/,' ') if para ## Clean Prepared Text
end
end
end
def pre
table=if @md.flag_tables
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br}
else ''
end
breakpage=if @md.pagenew \
or @md.pagebreak
' fo:break-before="page"'
else ''
end
@@odf[:head]<<%{#@br} +
%{ #@br} +
%{ #@br} +
%{#@br} +
%{#{table}#@br} +
%{ #@br} +
%{ #@br} + # P1
%{ #@br} + # P1
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} + # P1
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{ #@br} +
%{#@br} +
%{ #@br} +
%{ }
end
def post
end
def publish
divider='='
content=[]
data=@data
content << @@odf[:open]
content << @@odf[:head]
content << @@odf[:body]
content << @@odf[:metadata]
#content << @@odf[:owner_details] if @md.stmp =~/\w+/ #not used?
content << @@odf[:tail]
Output.new(content,@md,@env).odf
@@odf[:head],@@odf[:body],@@odf[:tail],@@odf[:metadata]=[],[],[],[]
end
end
class Output