# 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: document abstraction
=end
module SiSU_document_structure_code
class Instantiate < SiSU_Param::Parameters::Instructions
@@flag={} #Beware!!
def initialize
@@flag['table_to']=false
@@counter=@@column=@@columns=0
@@line_mode=''
end
end
class Code
@@flag={} #Beware!!
def initialize(md,data)
@md,@data=md,data
Instantiate.new
end
def code
data=@data
tuned_file=[]
@tuned_group=[]
@@counter=0
@verse_count=0
data.each do |para|
para.gsub!(/(#{Mx[:gr_o]}(?:code|verse|alt|group)#{Mx[:gr_c]})\s/,'\1') #double check
para.gsub!(/(?:\n\s*\n)+/m,"\n") unless @@flag['code']
if para =~/^code\{/ and not @@flag['code']
@@flag['code']=true
@@counter=1
para.gsub!(/^code\{.*/,"#{Mx[:gr_o]}code#{Mx[:gr_c]}")
elsif para =~/^(?:poem)\{/ \
and not @@flag['code']
@@flag['poem']=true
para.gsub!(/^(poem)\{.*/,"#{Mx[:gr_o]}verse#{Mx[:gr_c]}")
elsif para =~/^(?:alt|group)\{/ \
and not @@flag['code'] #group not tested, stub 2005
@@flag['group']=true
para.gsub!(/^(alt|group)\{.*/,"#{Mx[:gr_o]}\\1#{Mx[:gr_c]}")
end
if @@flag['code']
if @@flag['code'] \
and para =~/^\}code/
para.gsub!(/^\}code.*/,"#{Mx[:gr_o]}code-end#{Mx[:gr_c]}")
@@flag['code']=false
end
if @@flag['code'] \
or para =~/#{Mx[:gr_o]}code-end#{Mx[:gr_c]}/ #and para =~/\S/
sub_array=if para !~/#{Mx[:gr_o]}code(?:-end)?#{Mx[:gr_c]}/; para.dup + "#{Mx[:br_nl]}"
else para.dup
end
@line_mode=sub_array.scan(/.+/)
#@line_mode=[]
#sub_array.scan(/.+/) {|w| @line_mode << w + '<:br>' if w =~/[\Ss]+/}
SiSU_document_structure_code::Code.new(@md,@line_mode).code_lines('code')
para=@line_mode.join
end
elsif ( @@flag['poem'] \
or @@flag['group'] ) \
and not @@flag['code']
if @@flag['poem'] \
and para =~/^\}(?:poem)/
para.gsub!(/^\}(poem).*/,"\n#{Mx[:gr_o]}verse-end#{Mx[:gr_c]}")
@@flag['poem']=false
elsif ( @@flag['group'] \
and para =~/^\}(?:alt|group)/ ) \
and not @@flag['code']
para.gsub!(/^\}(alt|group).*/,"#{Mx[:gr_o]}\\1-end#{Mx[:gr_c]}")
@@flag['group']=false
end
if @@flag['poem'] \
or @@flag['group'] \
and para =~/\S/ \
and para !~/#{Mx[:gr_o]}(verse|code|alt|group)(-end)?#{Mx[:gr_c]}/ \
and not @@flag['code']
sub_array=para.dup
@line_mode=sub_array.scan(/.+/)
type=if @@flag['poem']; 'poem'
else 'group'
end
SiSU_document_structure_code::Code.new(@md,@line_mode).code_lines(type)
div=if @@flag['poem'] \
and @verse_count > 0
"\n" + "#{Mx[:gr_o]}verse-end#{Mx[:gr_c]}" + "\n\n" + "#{Mx[:gr_o]}verse#{Mx[:gr_c]}"
else ''
end
@verse_count+=1 if @@flag['poem']
para = div + @line_mode.join
else para
end
end
if @@flag['code'] \
or @@flag['poem'] \
or @@flag['group']
@tuned_group << para if para =~/\S+/
elsif para =~/#{Mx[:gr_o]}(?:code|alt|group|verse)-end#{Mx[:gr_c]}/
@verse_count=0
@tuned_group << para
tuned_file <<= if para =~/#{Mx[:gr_o]}group-end#{Mx[:gr_c]}/
@tuned_group.join("\n")
else @tuned_group=@tuned_group.join
@tuned_group.gsub!(/#{Mx[:br_nl]}#{Mx[:br_nl]}(#{Mx[:gr_o]}code-end#{Mx[:gr_c]})/,'\1')
@tuned_group
end
@tuned_group=[]
else tuned_file << para
end
end
tuned_file
end
def code_lines(type='')
data=@data
data.each do |line|
if line =~/\S/ \
and line !~/^code\{|^\}code|#{Mx[:gr_o]}code.+/
line.gsub!(/\s\s/,"#{Mx[:nbsp]}#{Mx[:nbsp]}")
line.gsub!(/^/,"#{Mx[:gr_o]}codeline#{Mx[:gr_c]}") if type=='code' # try sort for texpdf special case
if line =~/(?:https?|file|ftp):\/\/\S+$/
line.gsub!(/$/," #{Mx[:br_nl]}")
else line.gsub!(/$/,"#{Mx[:br_nl]}") #unless type=='code'
end
if @@flag['code']; @@counter+=1
else
end
elsif line =~/^\s*$/
line.gsub!(/$/,"#{Mx[:br_nl]}")
end
end
end
end
end
__END__