# encoding: utf-8
=begin
* Name: SiSU
* Description: a framework for document structuring, publishing and search
* Author: Ralph Amissah
* Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008, 2009, 2010, 2011, 2012, 2013 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 Lic/home/ralph/live-manual/build/manual/manifest/live-manual.ca.htmlense 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:
* Git
* Ralph Amissah
** Description: make parameters extracted for program use
=end
module SiSU_Param_Make
class MdMake
def initialize(str,opt,env)
@s,@opt,@env=str,opt,env
end
def validate_length(s,l,n)
#s=(s.length <= l) ? s : nil
s=if s.is_a?(String) \
and s.length <= l
s
elsif s.is_a?(NilClass)
nil
elsif s.class !=String
STDERR.puts "#{n} is #{s.class}: programming error, String expected #{__FILE__}:#{__LINE__}"
s
else
SiSU_Screen::Ansi.new('v',"*WARN* #{n} length #{s.length} exceeds set db field length #{l}, metadata dropped",@opt.fns).warn unless @opt.cmd =~/q/
nil
end
end
def name_format(name)
if name
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+(.+)\Z/m.match(x)[1,2]
elsif i == 0
a='main'
b=x
else
end
@h[a]=b
end
@h
end
def make
a=@s.split(/\n%\s.+?$|[ ]*\n[ ]*/m)
@h=build_hash(a)
def headings
lv=[]
x=@h['headings']
x=((x =~/;/) ? (x.split(/;\s*/)) : [ x ])
lv[0]=x
lv1=x[0] ||='1~ ' #some arbitrary changes made
lv[1]=/^#{lv1}/
lv2=x[1] ||='2~ '
lv[2]=/^#{lv2}/
lv3=x[2] ||='3~ '
lv[3]=/^#{lv3}/
lv4=x[3] ||='4~ '
lv[4]=/^#{lv4}/
lv5=x[4] ||='5~ '
lv[5]=/^#{lv5}/
lv6=x[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,page_line=nil,nil,nil
pagebreaks.each do |x|
page_new=x[/(:?[\dA-C],?)+/] if x=~/new|clear/
page_break=x[/(:?[\dA-C],?)+/] if x =~/break/
page_line=x[/(:?[\dA-C],?)+/] if x =~/line/
end
{ page_new: page_new, page_break: page_break, page_line: page_line }
end
def language
l=if @h['language'] && (@h['language']=~/\S{2,}/)
((@h['language'] =~/,/) \
? (@h['language'].split(/,\s*/))
: [ @h['language'] ])
else [ 'en' ]
end
end
def bold
m=@h['bold']
i=(m=~/\/i$/)? 'i' : ''
z=if m
x=m.gsub(/^\/(.+?)\/i?/,'\1').
gsub(/\((?:\?:)?/,'(?:') # avoid need to escape use of brackets within regex provided
rgx='\b(' + x + ')\b'
y=((i =~/i/) ? (/#{rgx}/i) : (/#{rgx}/))
{ str: '\b(?:' + x + ')\b', regx: y, i: i }
else nil
end
end
def italics
m=@h['italics']
i=((m=~/\/i$/) ? 'i' : '')
z=if m
x=m.gsub(/^\/(.+?)\/i?/,'\1').
gsub(/\((?:\?:)?/,'(?:') # avoid need to escape use of brackets within regex provided
rgx='\b(' + x + ')\b'
y=((i =~/i/) ? (/#{rgx}/i) : (/#{rgx}/))
{ str: '\b(?:' + x + ')\b', regx: y, i: i }
else nil
end
end
def emphasis
if @h['emphasis'] =~/bold/ then 'bold'
elsif @h['emphasis'] =~/italics?/ then 'italics'
elsif @h['emphasis'] =~/under(?:line|score)/ then 'underscore'
else nil
end
end
def substitute
m=@h['substitute']
z=if m
w=m.scan(/\/(.+?)\/(i?,)\s*'(.+?)'(?:\s+|\s*;\s*|$)/)
arr_hash=[]
matches=''
w.each do |x|
c=(x[1] =~/[i],/) ? :i : :s
matches=matches + x[0].gsub(/([${}])/,'\\\\\1') + '|'
arr_hash << {
match: x[0].gsub(/([${}])/,'\\\\\1'),
replace: x[2],
case_s: c
}
end
matches.chop!
{ match_and_replace: arr_hash, matches: matches }
else nil
end
end
def plaintext_wrap
if @h['plaintext_wrap'].to_s =~/\d\d+/ \
and @h['plaintext_wrap'].to_i > 19 \
and @h['plaintext_wrap'].to_i < 201
@h['plaintext_wrap'].to_i
else nil
end
end
def omit
m=@h['omit']
@m=m ? (m.split(/,\s+/)) : nil
def list
@m
end
self
end
def ocn?
(omit.list.inspect =~/"ocn"/) \
? :off
: :na
end
def toc?
(omit.list.inspect =~/"toc"/) \
? :off
: :na
end
def manifest?
(omit.list.inspect =~/"manifest"/) \
? :off
: :na
end
def links_to_manifest?
(omit.list.inspect =~/"manifest_links"|"links_to_manifest"/) \
? :off
: :na
end
def metadata?
(omit.list.inspect =~/"metadata"/) \
? :off
: :na
end
def minitoc?
(omit.list.inspect =~/"minitoc"/) \
? :off
: :na
end
def html_minitoc?
(omit.list.inspect =~/"html_minitoc"/) \
? :off
: :na
end
def html_top_band?
(omit.list.inspect =~/"html_top_band"/) \
? :off
: :na
end
def html_navigation?
(omit.list.inspect =~/"html_navigation"/) \
? :off
: :na
end
def html_navigation_bar?
(omit.list.inspect =~/"html_navigation_bar"/) \
? :off
: :na
end
def segsubtoc?
(omit.list.inspect =~/"segsubtoc"/) \
? :off
: :na
end
def search_form?
(omit.list.inspect =~/"search_form"/) \
? :off
: :na
end
def html_search_form?
(omit.list.inspect =~/"html_search_form"/) \
? :off
: :na
end
def html_right_pane?
(omit.list.inspect =~/"html_right_column"|"html_right_pane"/) \
? :off
: :na
end
def manifest_minitoc?
(omit.list.inspect =~/"manifest_minitoc"/) \
? :off
: :na
end
def cover_image?
(omit.list.inspect =~/"cover_image"/) \
? :off
: :na
end
def home_button_image?
(omit.list.inspect =~/"home_button_image"/) \
? :off
: :na
end
def texpdf_font
def main
@h['texpdf_font'] \
&& (@h['texpdf_font']=~/\S{3,}/) \
? @h['texpdf_font']
: @env.font.texpdf.main
end
def sans # not used
@h['texpdf_font_sans'] \
&& (@h['texpdf_font_sans']=~/\S{3,}/) \
? @h['texpdf_font_sans']
: @env.font.texpdf.sans
end
def serif # not used
@h['texpdf_font_serif'] \
&& (@h['texpdf_font_serif']=~/\S{3,}/) \
? @h['texpdf_font_serif']
: @env.font.texpdf.serif
end
def mono
@h['texpdf_font_mono'] \
&& (@h['texpdf_font_mono']=~/\S{3,}/) \
? @h['texpdf_font_mono']
: @env.font.texpdf.mono
end
self
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").
gsub(/(-)/m,"\\\\\\1").
gsub(/\A/,"\n.br\n.SH NAME\n.br\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\n.br\n").
gsub(/(-)/m,"\\\\\\1").
gsub(/\A/,"\n.br\n.SH SYNOPSIS\n.br\n")
else
manpage['synopsis']=''
end
unless manpage['section']
manpage['section']=1
end
manpage
end
def get_image_dimensions(img)
imgk=SiSU_Env::SystemCall.new.imagemagick
gmgk=SiSU_Env::SystemCall.new.graphicksmagick
img_pth={
sst: @env.path.image_source_include,
pod: File.expand_path("../../../sisupod/image" )
}
path_img=if FileTest.file?("#{img_pth[:pod]}/#{img}")
"#{img_pth[:pod]}/#{img}"
elsif FileTest.file?("#{img_pth[:sst]}/#{img}")
"#{img_pth[:sst]}/#{img}"
else nil
end
if path_img
if imgk or gmgk
if imgk
imgsys=`identify #{path_img}`.strip #system call
elsif gmgk
imgsys=`gm identify #{path_img}`.strip #system call
end
w,h=/(\d+)x(\d+)/m.match(imgsys)[1,2]
else
w,h='600','800'
end
else
w,h=nil,nil
end
{w: w, h: h}
end
def home_button_text
s=if @h['home_button_text']
@h['home_button_text'].split(/\s*;\s*/)
else nil
end
#l,n=Db[:home_button],'make.home_button_text'
#validate_length(s,l,n)
end
def home_button_image
s=nil
s=if @h['home_button_image']
s=@h['home_button_image'].split(/\s*;\s*/)
s0=s[0] #if
image={}
s=if s0 =~/{(\S+\.(?:jpg|png|gif))(?:\s+(\d+x\d+))?\s*}(?:(http:\/\/\S+)|image)/
image[:home_button]=$1
if $2
image[:dimensions]=$2
image[:w],image[:h]=/(\d+)x(\d+)/m.match(image[:dimensions])[1,2]
else
d=get_image_dimensions(image[:home_button])
image[:w],image[:h]=d[:w],d[:h]
image[:dimensions]="#{d[:w]}x#{d[:h]}"
end
image[:link]=$3
image
end
else nil
end
end
def cover_image
s=nil
if @h['cover_image']
s=@h['cover_image'].split(/\s*;\s*/)
s=s[0] #if
image={}
if s =~/{\s*(\S+\.(?:jpg|png|gif))(?:\s+(\d+x\d+))?(?:\s+"(.+?)")?\s*}image/
image[:cover]=$1
if $2
image[:dimensions]=$2
image[:w],image[:h]=/(\d+)x(\d+)/m.match(image[:dimensions])[1,2]
else
d=get_image_dimensions(image[:cover])
image[:w],image[:h]=d[:w],d[:h]
image[:dimensions]="#{d[:w]}x#{d[:h]}"
end
image[:note]=$3
elsif s =~/(\S+\.(?:jpg|png|gif))/
image[:cover]=$1
d=get_image_dimensions(image[:cover])
image[:w],image[:h]=d[:w],d[:h]
image[:dimensions]="#{d[:w]}x#{d[:h]}"
image[:note]=nil
end
image
else nil
end
end
def footer
s=if @h['footer']
@h['footer'].split(/\s*;\s*/)
else nil
end
end
self
end
def make_links
@doc_links=@s.split(/\n%\s.+?$|[ ]*\n[ ]*/m)
def links
lnks,a_idx=[],0
@doc_links.each do |doc_link|
if doc_link=~/\{.+?\}(?:(?:https?|file|ftp):\/|\.\.)\/\S+(?:\s|$)/
say,url=/\{\s*(.+?)\s*\}((?:(?:https?|file|ftp):\/|\.\.)\/\S+)/im.match(doc_link)[1,2]
lnks[a_idx]={ say: say, url: url }
a_idx +=1
end
end
lnks
end
def append?
(@doc_links[0]=='+') \
? :yes
: :no
end
self
end
end
class MakeHead
attr_accessor :pagenew,:pagebreak,:pageline,:toc,:lv1,:lv2,:lv3,:lv4,:lv5,:lv6,:num_top,:i18n,:man_section,:substitution_match_list,:bold_match_list,:italics_match_list,:emphasis_set_to,:footer_links,:home_button_links,:home_button_image,:cover_image
def initialize(make)
@make=make
end
def clear
@pagenew=@pagebreak=@pageline=@toc=@lv1=@lv2=@lv3=@lv4=@lv5=@lv6=@num_top=@i18n=@man_section=@footer_links=@substitution_match_list=@bold_match_list=@italics_match_list=@emphasis_set_to=@home_button_links=@home_button_image=@cover_image=nil
end
def make_instruct
clear
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.breaks \
and @make.breaks[:page_line] #page line across
@pagebreak=@make.breaks[:page_line]
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.language \
and @make.language[0]
@i18n=@make.language
end
if defined? @make.manpage \
and @make.manpage
@man_section=(defined? @make.manpage.section) \
? @make.manpage.section
: 1
end
if defined? @make.substitute \
and @make.substitute
@substitution_match_list=@make.substitute
end
if defined? @make.bold \
and @make.bold
@bold_match_list=@make.bold
end
if defined? @make.italics \
and @make.italics
@italics_match_list=@make.italics
end
if defined? @make.emphasis \
and @make.emphasis
@emphasis_set_to=@make.emphasis
end
if defined? @make.footer \
and @make.footer.is_a?(Array)
@footer_links= { left: { say: '', url: '' }, center: { say: '', url: '' } } #already set
@footer_links[:left]=if @make.footer[0]=~/\{.+?\}(?:(?:https?|file|ftp):\/|\.\.)\/\S+(?:\s|$)/
say,url=/\{\s*(.+?)\s*\}((?:(?:https?|file|ftp):\/|\.\.)\/\S+)/im.match(@make.footer[0])[1,2]
{ say: say, url: url }
else
{ say: '', url: '' }
end
@footer_links[:center]=if @make.footer[1]=~/\{.+?\}(?:(?:https?|file|ftp):\/|\.\.)\/\S+(?:\s|$)/
say,url=/\{\s*(.+?)\s*\}((?:(?:https?|file|ftp):\/|\.\.)\/\S+)/im.match(@make.footer[1])[1,2]
{ say: say, url: url }
else
{ say: '', url: '' }
end
@footer_links
else #already set
@footer_links= { left: { say: '', url: '' }, center: { say: '', url: '' } }
end
if defined? @make.home_button_text \
and @make.home_button_text.is_a?(Array)
a_idx=0
@home_button_links=[]
@make.home_button_text.each do |doc_link|
if doc_link=~/\{.+?\}(?:(?:https?|file|ftp):\/|\.\.)\/\S+(?:\s|$)/
say,url=/\{\s*(.+?)\s*\}((?:(?:https?|file|ftp):\/|\.\.)\/\S+)/im.match(doc_link)[1,2]
@home_button_links[a_idx]= { say: say, url: url }
a_idx +=1
end
end
@home_button_links
end
if defined? @make.home_button_image \
and @make.home_button_image.is_a?(Hash)
@home_button_image=@make.home_button_image
end
if defined? @make.cover_image \
and @make.cover_image.is_a?(Hash)
@cover_image=@make.cover_image
end
{ pagenew: @pagenew,
pagebreak: @pagebreak,
pageline: @pageline,
toc: @toc,
lv1: @lv1,
lv2: @lv2,
lv3: @lv3,
lv4: @lv4,
lv5: @lv5,
lv6: @lv6,
num_top: @num_top,
i18n: @i18n,
emphasis_set_to: @emphasis_set_to,
bold_match_list: @bold_match_list,
italics_match_list: @italics_match_list,
substitution_match_list: @substitution_match_list,
man_section: @man_section,
footer_links: @footer_links,
home_button_links: @home_button_links,
home_button_image: @home_button_image,
cover_image: @cover_image,
}
end
end
end
__END__