sisu 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. checksums.yaml +7 -0
  2. data/bin/sisu +367 -0
  3. data/bin/sisugem +367 -0
  4. data/data/sisu/image/arrow_next_red.png +0 -0
  5. data/data/sisu/image/arrow_prev_red.png +0 -0
  6. data/data/sisu/image/arrow_up_red.png +0 -0
  7. data/data/sisu/image/b_bluebell.png +0 -0
  8. data/data/sisu/image/b_doc.png +0 -0
  9. data/data/sisu/image/b_epub.png +0 -0
  10. data/data/sisu/image/b_home.png +0 -0
  11. data/data/sisu/image/b_info.png +0 -0
  12. data/data/sisu/image/b_odf.png +0 -0
  13. data/data/sisu/image/b_pdf.png +0 -0
  14. data/data/sisu/image/b_search.png +0 -0
  15. data/data/sisu/image/b_toc.png +0 -0
  16. data/data/sisu/image/bullet_08.png +0 -0
  17. data/data/sisu/image/bullet_09.png +0 -0
  18. data/data/sisu/image/bullet_10.png +0 -0
  19. data/data/sisu/image/bullet_11.png +0 -0
  20. data/data/sisu/image/bullet_12.png +0 -0
  21. data/data/sisu/image/bullet_doc.png +0 -0
  22. data/data/sisu/image/bullet_red.png +0 -0
  23. data/data/sisu/image/dot_clear.png +0 -0
  24. data/data/sisu/image/dot_white.png +0 -0
  25. data/data/sisu/image/gplv3.png +0 -0
  26. data/data/sisu/image/gplv3_free_software.png +0 -0
  27. data/data/sisu/image/next.png +0 -0
  28. data/data/sisu/image/previous.png +0 -0
  29. data/data/sisu/image/rb7.ico +0 -0
  30. data/data/sisu/image/sisu.png +0 -0
  31. data/data/sisu/image/toctoc.png +0 -0
  32. data/data/sisu/version.yml +5 -0
  33. data/lib/sisu.rb +94 -0
  34. data/lib/sisu/air.rb +80 -0
  35. data/lib/sisu/ao.rb +590 -0
  36. data/lib/sisu/ao_character_check.rb +102 -0
  37. data/lib/sisu/ao_composite.rb +286 -0
  38. data/lib/sisu/ao_doc_objects.rb +565 -0
  39. data/lib/sisu/ao_doc_str.rb +2269 -0
  40. data/lib/sisu/ao_endnotes.rb +136 -0
  41. data/lib/sisu/ao_expand_insertions.rb +514 -0
  42. data/lib/sisu/ao_hash_digest.rb +174 -0
  43. data/lib/sisu/ao_idx.rb +422 -0
  44. data/lib/sisu/ao_images.rb +187 -0
  45. data/lib/sisu/ao_metadata.rb +86 -0
  46. data/lib/sisu/ao_misc_arrange.rb +207 -0
  47. data/lib/sisu/ao_numbering.rb +720 -0
  48. data/lib/sisu/ao_persist.rb +194 -0
  49. data/lib/sisu/ao_references.rb +502 -0
  50. data/lib/sisu/ao_syntax.rb +640 -0
  51. data/lib/sisu/cgi.rb +84 -0
  52. data/lib/sisu/cgi_pgsql.rb +270 -0
  53. data/lib/sisu/cgi_sql_common.rb +986 -0
  54. data/lib/sisu/cgi_sqlite.rb +244 -0
  55. data/lib/sisu/conf.rb +287 -0
  56. data/lib/sisu/constants.rb +388 -0
  57. data/lib/sisu/css.rb +3484 -0
  58. data/lib/sisu/db_columns.rb +1997 -0
  59. data/lib/sisu/db_create.rb +689 -0
  60. data/lib/sisu/db_dbi.rb +90 -0
  61. data/lib/sisu/db_drop.rb +207 -0
  62. data/lib/sisu/db_import.rb +877 -0
  63. data/lib/sisu/db_indexes.rb +146 -0
  64. data/lib/sisu/db_load_tuple.rb +323 -0
  65. data/lib/sisu/db_remove.rb +182 -0
  66. data/lib/sisu/db_select.rb +230 -0
  67. data/lib/sisu/db_sqltxt.rb +173 -0
  68. data/lib/sisu/db_tests.rb +114 -0
  69. data/lib/sisu/dbi.rb +166 -0
  70. data/lib/sisu/dbi_discrete.rb +206 -0
  71. data/lib/sisu/digests.rb +306 -0
  72. data/lib/sisu/dp.rb +1606 -0
  73. data/lib/sisu/dp_identify_markup.rb +161 -0
  74. data/lib/sisu/dp_make.rb +668 -0
  75. data/lib/sisu/embedded.rb +149 -0
  76. data/lib/sisu/errors.rb +84 -0
  77. data/lib/sisu/generic_parts.rb +131 -0
  78. data/lib/sisu/git.rb +277 -0
  79. data/lib/sisu/html.rb +775 -0
  80. data/lib/sisu/html_concordance.rb +391 -0
  81. data/lib/sisu/html_format.rb +1348 -0
  82. data/lib/sisu/html_harvest.rb +109 -0
  83. data/lib/sisu/html_harvest_author_format.rb +111 -0
  84. data/lib/sisu/html_harvest_authors.rb +466 -0
  85. data/lib/sisu/html_harvest_topics.rb +893 -0
  86. data/lib/sisu/html_lite_shared.rb +324 -0
  87. data/lib/sisu/html_manifest.rb +1032 -0
  88. data/lib/sisu/html_minitoc.rb +230 -0
  89. data/lib/sisu/html_parts.rb +437 -0
  90. data/lib/sisu/html_persist.rb +237 -0
  91. data/lib/sisu/html_promo.rb +440 -0
  92. data/lib/sisu/html_scroll.rb +235 -0
  93. data/lib/sisu/html_segments.rb +716 -0
  94. data/lib/sisu/html_shared.rb +62 -0
  95. data/lib/sisu/html_table.rb +64 -0
  96. data/lib/sisu/html_tune.rb +301 -0
  97. data/lib/sisu/hub.rb +277 -0
  98. data/lib/sisu/hub_actions.rb +1122 -0
  99. data/lib/sisu/hub_loop_markup_files.rb +170 -0
  100. data/lib/sisu/hub_options.rb +1695 -0
  101. data/lib/sisu/i18n.rb +702 -0
  102. data/lib/sisu/manpage.rb +377 -0
  103. data/lib/sisu/manpage_format.rb +85 -0
  104. data/lib/sisu/object_munge.rb +307 -0
  105. data/lib/sisu/prog_text_translation.rb +1702 -0
  106. data/lib/sisu/qrcode.rb +754 -0
  107. data/lib/sisu/relaxng.rb +1153 -0
  108. data/lib/sisu/remote.rb +246 -0
  109. data/lib/sisu/rexml.rb +148 -0
  110. data/lib/sisu/se.rb +158 -0
  111. data/lib/sisu/se_cleanoutput.rb +145 -0
  112. data/lib/sisu/se_clear.rb +105 -0
  113. data/lib/sisu/se_createsite.rb +273 -0
  114. data/lib/sisu/se_css.rb +221 -0
  115. data/lib/sisu/se_date.rb +92 -0
  116. data/lib/sisu/se_db.rb +214 -0
  117. data/lib/sisu/se_envcall.rb +326 -0
  118. data/lib/sisu/se_file_op.rb +2758 -0
  119. data/lib/sisu/se_filemap.rb +247 -0
  120. data/lib/sisu/se_get_init.rb +238 -0
  121. data/lib/sisu/se_hub_particulars.rb +234 -0
  122. data/lib/sisu/se_info_env.rb +2179 -0
  123. data/lib/sisu/se_info_port.rb +70 -0
  124. data/lib/sisu/se_info_system.rb +202 -0
  125. data/lib/sisu/se_load.rb +108 -0
  126. data/lib/sisu/se_processing.rb +659 -0
  127. data/lib/sisu/se_programs.rb +394 -0
  128. data/lib/sisu/se_remotes.rb +553 -0
  129. data/lib/sisu/se_standardise_lang.rb +176 -0
  130. data/lib/sisu/se_version.rb +174 -0
  131. data/lib/sisu/shared_images.rb +137 -0
  132. data/lib/sisu/shared_markup_alt.rb +336 -0
  133. data/lib/sisu/shared_metadata.rb +1361 -0
  134. data/lib/sisu/shared_sem.rb +156 -0
  135. data/lib/sisu/sisu_thor_lib.rb +407 -0
  136. data/lib/sisu/sitemaps.rb +224 -0
  137. data/lib/sisu/src_kdissert_share.rb +102 -0
  138. data/lib/sisu/src_po4a_share.rb +309 -0
  139. data/lib/sisu/src_po4a_shelf.rb +1217 -0
  140. data/lib/sisu/src_po4a_shelf_set.rb +297 -0
  141. data/lib/sisu/src_po4a_sst_ao_sst.rb +893 -0
  142. data/lib/sisu/src_po4a_sst_ao_sst_set.rb +284 -0
  143. data/lib/sisu/src_po4a_sstm.rb +135 -0
  144. data/lib/sisu/src_shared.rb +347 -0
  145. data/lib/sisu/src_sisupod_make.rb +171 -0
  146. data/lib/sisu/src_sisupod_sstm.rb +109 -0
  147. data/lib/sisu/sst_convert_markup.rb +323 -0
  148. data/lib/sisu/sst_do_inline_footnotes.rb +440 -0
  149. data/lib/sisu/sst_from_xml.rb +178 -0
  150. data/lib/sisu/sst_identify_markup.rb +482 -0
  151. data/lib/sisu/sst_to_s_xml_sax.rb +471 -0
  152. data/lib/sisu/termsheet.rb +163 -0
  153. data/lib/sisu/texinfo.rb +430 -0
  154. data/lib/sisu/texinfo_format.rb +541 -0
  155. data/lib/sisu/texpdf.rb +1162 -0
  156. data/lib/sisu/texpdf_format.rb +1689 -0
  157. data/lib/sisu/texpdf_parts.rb +235 -0
  158. data/lib/sisu/txt_asciidoc.rb +354 -0
  159. data/lib/sisu/txt_asciidoc_decorate.rb +207 -0
  160. data/lib/sisu/txt_markdown.rb +389 -0
  161. data/lib/sisu/txt_markdown_decorate.rb +207 -0
  162. data/lib/sisu/txt_orgmode.rb +376 -0
  163. data/lib/sisu/txt_orgmode_decorate.rb +186 -0
  164. data/lib/sisu/txt_output.rb +86 -0
  165. data/lib/sisu/txt_plain.rb +410 -0
  166. data/lib/sisu/txt_plain_decorate.rb +189 -0
  167. data/lib/sisu/txt_read.rb +109 -0
  168. data/lib/sisu/txt_rst.rb +371 -0
  169. data/lib/sisu/txt_rst_decorate.rb +186 -0
  170. data/lib/sisu/txt_shared.rb +241 -0
  171. data/lib/sisu/txt_textile.rb +367 -0
  172. data/lib/sisu/txt_textile_decorate.rb +186 -0
  173. data/lib/sisu/update.rb +141 -0
  174. data/lib/sisu/urls.rb +696 -0
  175. data/lib/sisu/utils.rb +232 -0
  176. data/lib/sisu/utils_composite.rb +115 -0
  177. data/lib/sisu/utils_response.rb +114 -0
  178. data/lib/sisu/utils_screen_text_color.rb +472 -0
  179. data/lib/sisu/utils_spell.rb +99 -0
  180. data/lib/sisu/webrick.rb +191 -0
  181. data/lib/sisu/wikispeak.rb +375 -0
  182. data/lib/sisu/xhtml.rb +472 -0
  183. data/lib/sisu/xhtml_epub2.rb +890 -0
  184. data/lib/sisu/xhtml_epub2_concordance.rb +322 -0
  185. data/lib/sisu/xhtml_epub2_format.rb +2272 -0
  186. data/lib/sisu/xhtml_epub2_persist.rb +278 -0
  187. data/lib/sisu/xhtml_epub2_segments.rb +599 -0
  188. data/lib/sisu/xhtml_epub2_tune.rb +330 -0
  189. data/lib/sisu/xhtml_parts.rb +183 -0
  190. data/lib/sisu/xhtml_shared.rb +62 -0
  191. data/lib/sisu/xhtml_table.rb +97 -0
  192. data/lib/sisu/xml_docbook5.rb +376 -0
  193. data/lib/sisu/xml_dom.rb +624 -0
  194. data/lib/sisu/xml_fictionbook2.rb +389 -0
  195. data/lib/sisu/xml_format.rb +865 -0
  196. data/lib/sisu/xml_md_oai_pmh_dc.rb +229 -0
  197. data/lib/sisu/xml_odf_odt.rb +887 -0
  198. data/lib/sisu/xml_odf_odt_format.rb +674 -0
  199. data/lib/sisu/xml_parts.rb +191 -0
  200. data/lib/sisu/xml_persist.rb +126 -0
  201. data/lib/sisu/xml_sax.rb +521 -0
  202. data/lib/sisu/xml_scaffold_structure_collapsed.rb +198 -0
  203. data/lib/sisu/xml_scaffold_structure_sisu.rb +201 -0
  204. data/lib/sisu/xml_shared.rb +665 -0
  205. data/lib/sisu/xml_tables.rb +261 -0
  206. data/lib/sisu/zap.rb +90 -0
  207. metadata +251 -0
@@ -0,0 +1,720 @@
1
+ # encoding: utf-8
2
+ =begin
3
+
4
+ * Name: SiSU
5
+
6
+ ** Description: documents, structuring, processing, publishing, search
7
+ *** system environment, resource control and configuration details
8
+
9
+ ** Author: Ralph Amissah
10
+ <ralph@amissah.com>
11
+ <ralph.amissah@gmail.com>
12
+
13
+ ** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
14
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Ralph Amissah,
15
+ All Rights Reserved.
16
+
17
+ ** License: GPL 3 or later:
18
+
19
+ SiSU, a framework for document structuring, publishing and search
20
+
21
+ Copyright (C) Ralph Amissah
22
+
23
+ This program is free software: you can redistribute it and/or modify it
24
+ under the terms of the GNU General Public License as published by the Free
25
+ Software Foundation, either version 3 of the License, or (at your option)
26
+ any later version.
27
+
28
+ This program is distributed in the hope that it will be useful, but WITHOUT
29
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
30
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
31
+ more details.
32
+
33
+ You should have received a copy of the GNU General Public License along with
34
+ this program. If not, see <http://www.gnu.org/licenses/>.
35
+
36
+ If you have Internet connection, the latest version of the GPL should be
37
+ available at these locations:
38
+ <http://www.fsf.org/licensing/licenses/gpl.html>
39
+ <http://www.gnu.org/licenses/gpl.html>
40
+
41
+ <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html>
42
+
43
+ ** SiSU uses:
44
+ * Standard SiSU markup syntax,
45
+ * Standard SiSU meta-markup syntax, and the
46
+ * Standard SiSU object citation numbering and system
47
+
48
+ ** Hompages:
49
+ <http://www.jus.uio.no/sisu>
50
+ <http://www.sisudoc.org>
51
+
52
+ ** Git
53
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
54
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/ao_numbering.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_AO_Numbering
58
+ class Numbering
59
+ attr_accessor :obj,:osp,:ocn,:lv,:name,:index,:comment
60
+ @@segments_count=0
61
+ def initialize(md,data,fnx,process)
62
+ @md,@data,@fnx,@process=md,data,fnx,process
63
+ @obj=@type=@ocn=@lv=@name=@index=@comment=nil
64
+ @chosen_seg_names=[]
65
+ end
66
+ def chosen_seg_names(chosen,chosen_seg_name,dob,md,type)
67
+ @chosen_seg_names=if chosen.compact.uniq.length \
68
+ == chosen.compact.length
69
+ chosen
70
+ else
71
+ if md.opt.act[:maintenance][:set]==:on
72
+ SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:green).
73
+ mark(
74
+ "duplicated auto segment name: #{type} #{chosen}\n" \
75
+ + "#{chosen}\n" \
76
+ + " manually name level 1 segments '1~given_name'\n" \
77
+ + 'filename: ' + md.fns + "\n" \
78
+ + 'heading text: "' + dob.obj + '"' + "\n" \
79
+ + 'duplication: "' + chosen_seg_name + '" (level: ' + dob.lv + '; numbering type: ' + type.to_s + ')'
80
+ )
81
+ end
82
+ chosen=chosen[0..-2]
83
+ chosen_seg_name=auto_numbering_exceptions(chosen,md,dob)
84
+ chosen << chosen_seg_name
85
+ end
86
+ end
87
+ def number_of_segments?
88
+ if @@segments_count==0
89
+ @data.each do |dob|
90
+ if dob.is == :heading \
91
+ and dob.lv == '1'
92
+ @@segments_count += 1
93
+ end
94
+ end
95
+ @@segments_count
96
+ else @@segments_count
97
+ end
98
+ end
99
+ def numbering_song
100
+ begin
101
+ data=@data
102
+ data=number_plaintext_para(data)
103
+ data=auto_number_heading_ie_title(data.compact) #tr issue
104
+ data=ocn(data.compact) #watch
105
+ data=xml(data.compact)
106
+ data=minor_numbering(data.compact)
107
+ if @process==:complete
108
+ data,tags_map,ocn_html_seg_map=name_para_seg_filename(data)
109
+ end
110
+ data=set_heading_top(data) unless @md.set_heading_top
111
+ [data,tags_map,ocn_html_seg_map]
112
+ ensure
113
+ @@segments_count=0
114
+ end
115
+ end
116
+ def set_tags(tags,tag)
117
+ tags=if not tag.empty? \
118
+ and tag !~/^\d+$/
119
+ tag=tag.gsub(/[^a-z0-9._-]/,'')
120
+ [tag,tags].flatten
121
+ else tags
122
+ end
123
+ end
124
+ def number_plaintext_para(data)
125
+ @tuned_file=[]
126
+ data.each do |dob|
127
+ if (dob.of !=:block \
128
+ && dob.of !=:comment \
129
+ && dob.of !=:layout) \
130
+ && dob.ocn_ #and dob.obj !~ /#{Mx[:gr_o]}Th|#{Mx[:tc_o]}#{Mx[:tc_p]}#{Mx[:tc_p]}/ #FIX
131
+ dob.obj=dob.obj.gsub(/(.+)\n/,'\1 ') #messy, but idea is that tables should retain breaks
132
+ end
133
+ unless dob.obj.is_a?(Array)
134
+ dob.obj=dob.obj.gsub(/^\s+/,'').
135
+ gsub(/\s$/,"\n")
136
+ end
137
+ @tuned_file << dob
138
+ end
139
+ @tuned_file=@tuned_file.flatten
140
+ end
141
+ def number_sub_heading(dob,num,title_no)
142
+ unless dob.obj =~/\d+\.|(?:chapter|article|section|clause)\s+\d+/i #name selection arbitrary, fix
143
+ dob.obj=case dob.name
144
+ when /-/ then dob.obj.gsub(/^/,"#{title_no} ")
145
+ when /^#/ then dob.obj.gsub(/^/,"#{title_no} ")
146
+ when /^[a-z_\.]+/ then dob.obj.gsub(/^/,"#{title_no} ")
147
+ else
148
+ dob.name=title_no if dob.name=~/^$/ #where title contains title number
149
+ dob.obj.gsub(/^/,"#{title_no} ") if title_no =~/\d+/ #main, where title number is to be provided #watch changed placement
150
+ end
151
+ if @md.toc_lev_limit \
152
+ and @md.toc_lev_limit < num
153
+ dob.obj=dob.obj.gsub(/^/,'!_ ') #bold line, watch
154
+ end
155
+ end
156
+ dob
157
+ end
158
+ def heading_tag_clean(heading_tag)
159
+ heading_tag=heading_tag.
160
+ gsub(/[ ]+/,'_').
161
+ gsub(/["']/,'').
162
+ gsub(/[\/]/,'-').
163
+ gsub(/#{Mx[:fa_bold_o]}|#{Mx[:fa_bold_c]}/,'').
164
+ gsub(/#{Mx[:fa_italics_o]}|#{Mx[:fa_italics_c]}/,'').
165
+ gsub(/#{Mx[:fa_underscore_o]}|#{Mx[:fa_underscore_c]}/,'').
166
+ gsub(/#{Mx[:fa_cite_o]}|#{Mx[:fa_cite_c]}/,'').
167
+ gsub(/#{Mx[:fa_insert_o]}|#{Mx[:fa_insert_c]}/,'').
168
+ gsub(/#{Mx[:fa_strike_o]}|#{Mx[:fa_strike_c]}/,'').
169
+ gsub(/#{Mx[:fa_superscript_o]}|#{Mx[:fa_superscript_c]}/,'').
170
+ gsub(/#{Mx[:fa_subscript_o]}|#{Mx[:fa_subscript_c]}/,'').
171
+ gsub(/#{Mx[:fa_hilite_o]}|#{Mx[:fa_hilite_c]}/,'').
172
+ gsub(/#{Mx[:gl_bullet]}/,'')
173
+ end
174
+ def auto_number_heading_ie_title(data) #also does some segment naming
175
+ if defined? @md.make.num_top \
176
+ and @md.make.num_top \
177
+ and @md.make.num_top !~/^$/
178
+ input||=@md.make.num_top
179
+ end
180
+ num_top=(input ? input.to_i : nil)
181
+ t_no1=t_no2=t_no3=0
182
+ if num_top
183
+ no1=num_top; no2=(num_top + 1); no3=(num_top + 2)
184
+ end
185
+ chapter_number_counter=0
186
+ data=data.compact
187
+ @tuned_file=data.each.map do |dob| #@md.seg_names << [additions to segment names]
188
+ title_no=nil
189
+ if dob.is ==:heading \
190
+ && dob.autonum_ \
191
+ and defined? @md.make.num_top \
192
+ and @md.make.num_top !~/^$/
193
+ if dob.lv=='1' \
194
+ and dob.obj =~/^#\s|\s#(?:\s|$)/
195
+ chapter_number_counter +=1
196
+ dob.obj=dob.obj.gsub(/^#\s/,"#{chapter_number_counter} ").
197
+ gsub(/#([:,]?\s|[.]?$)/,"#{chapter_number_counter}\\1")
198
+ end
199
+ if dob.ln==no1
200
+ @subnumber=1
201
+ @subnumber=0 if dob.ln==no1
202
+ end
203
+ if dob.ln.to_s =~/^[0-6]/ \
204
+ and not dob.use_ ==:dummy \
205
+ and dob.obj !~/#{Mx[:fa_o]}(?:~#|-#)#{Mx[:fa_c]}/ # <-- fix
206
+ if dob.ln==no1
207
+ t_no1+=1; t_no2=0; t_no3=0
208
+ title_no="#{t_no1}"
209
+ if @md.seg_names.is_a?(Array) \
210
+ and not @md.seg_names.include?(title_no)
211
+ if dob.ln==no1
212
+ dob.name="#{title_no}" if not dob.name
213
+ dob.tags=set_tags(dob.tags,title_no)
214
+ tag=dob.obj.
215
+ gsub(/(Article|Clause|Section|Chapter)\s+/,
216
+ "\\1_#{title_no}").
217
+ downcase
218
+ tag=heading_tag_clean(tag)
219
+ dob.tags=set_tags(dob.tags,tag)
220
+ dob.obj=(dob.obj =~/(Article|Clause|Section)\s+/) \
221
+ ? (dob.obj.gsub(/(Article|Clause|Section)\s+/,"\\1 #{title_no} "))
222
+ : (dob.obj.gsub(/^/,"#{title_no}. ")) #fix stop later
223
+ end
224
+ if dob.ln !=no1 \
225
+ and dob.obj =~/^[\d.]+\s/ #fix -> if the title starts with a numbering scheme, do not auto-number, review
226
+ dob.name ="#{title_no}" if not dob.name
227
+ dob.tags=set_tags(dob.tags,title_no)
228
+ dob.obj=dob.obj.gsub(/^/,"#{title_no}. ")
229
+ end
230
+ @md.seg_names << title_no
231
+ end
232
+ if dob.ln!=no1 \
233
+ and dob.name!~/^[a-z_\.]+$/ \
234
+ and dob.obj !~/[A-Z]\.?\s/ #bug -> tmp fix, excludes A. B. C. lettering, but not roman numerals, is arbitrary, review required # not fixed, work on
235
+ dob.tags=set_tags(dob.tags,title_no)
236
+ dob.obj=dob.obj.gsub(/^/i,"#{title_no}. ")
237
+ end
238
+ end
239
+ if dob.ln==no1 #watch because here you change dob.name
240
+ dob.tags=set_tags(dob.tags,"h#{title_no}")
241
+ end
242
+ if dob.ln==no2 #watch because here you change dob.name
243
+ t_no2+=1; t_no3=0
244
+ title_no="#{t_no1}.#{t_no2}"
245
+ dob.tags=set_tags(dob.tags,"h#{title_no}")
246
+ dob=number_sub_heading(dob,no2,title_no)
247
+ end
248
+ if dob.ln==no3 #watch because here you change dob.name
249
+ t_no3+=1
250
+ title_no="#{t_no1}.#{t_no2}.#{t_no3}"
251
+ dob.tags=set_tags(dob.tags,"h#{title_no}")
252
+ dob=number_sub_heading(dob,no3,title_no)
253
+ end
254
+ elsif dob.ln.to_s =~/^[0-6]/ \
255
+ and dob.name =~ /^[\w-]+-/ # endnotes, watch2005# endnotes, watch2005
256
+ dob.tags=set_tags(dob.tags,dob.name)
257
+ dob.name.gsub(/^([a-z_\.]+)-$/,'\1')
258
+ end
259
+ elsif dob.is ==:heading \
260
+ and dob.autonum_ \
261
+ and @md.markup =~/num_extract/ #AS DANGEROUS force enable with document, note already does this type of numbering for cisg, locate and coordinate logic, is currently misplaced in code, chengwei inspired 2004w23/4
262
+ #here lies a bug, as is nil when run from -Dv --update, FIX
263
+ if (dob.name.nil? or dob.name.empty?) \
264
+ and dob.ln.to_s =~/^[0-9]/ \
265
+ and dob.obj =~ /^([\d\.]+)/ #risky (must be unique) consider output to 4~~\d instead of 4~\d
266
+ dob.name=$1
267
+ dob.tags=set_tags(dob.tags,dob.name)
268
+ end
269
+ if @md.toc_lev_limit
270
+ end
271
+ elsif defined? dob.name \
272
+ and dob.name
273
+ dob.tags=set_tags(dob.tags,dob.name)
274
+ end
275
+ dob.tags=dob.tags.uniq if defined? dob.tags
276
+ dob
277
+ end.flatten
278
+ end
279
+ def ocn(data) #and auto segment numbering increment
280
+ @tuned_file=SiSU_AO_DocumentStructureExtract::OCN.new(@md,data,@fnx,@process).ocn
281
+ @tuned_file
282
+ end
283
+ def xml(data)
284
+ @tuned_file=SiSU_AO_DocumentStructureExtract::XML.new(@md,data).dom
285
+ @tuned_file
286
+ end
287
+ def minor_numbering(data) #and auto segment numbering increment
288
+ number_small,letter_small=0,0
289
+ letter=%w( a b c d e f g h i j k l m n o p q r s t u v w x y z )
290
+ @tuned_file=data.each.map do |dob|
291
+ if dob.of ==:heading \
292
+ || dob.of ==:heading_insert \
293
+ || dob.of ==:para \
294
+ || dob.of ==:block
295
+ if dob.is ==:heading \
296
+ and dob.ln.to_s=~/^[0-9]/ #% sub-number system, (baby numbering) reset with any change of major number (more obviously should be placed in number titles, but that is conditionally executed, check and move later)
297
+ number_small,letter_small=0,0
298
+ elsif dob.is ==:para
299
+ if dob.obj =~/^#[ 1]/ \
300
+ and dob.obj !~/^#\s+(?:~#)?$/
301
+ letter_small=0
302
+ number_small=0 if dob.obj =~ /^#1/
303
+ number_small+=1
304
+ dob.obj=dob.obj.gsub(/^#[ 1]/,"#{number_small}. ")
305
+ end
306
+ if dob.obj =~/^_# /
307
+ dob.obj=dob.obj.gsub(/^_# /,"#{letter[letter_small]}. ")
308
+ dob.indent='1'
309
+ letter_small+=1
310
+ end
311
+ end
312
+ end
313
+ dob
314
+ end.flatten
315
+ end
316
+ def leading_zeros_fixed_width_number(possible_seg_name)
317
+ if possible_seg_name.to_s =~/^([0-9]+?\.|[0-9]+)$/m #!~/[.,:-]+/
318
+ possible_seg_name=possible_seg_name.to_s.
319
+ gsub(/\.$/,'')
320
+ nl=possible_seg_name.to_s.length
321
+ zero='0'
322
+ zeros_fixed_width=number_of_segments?.to_s.length
323
+ zero_width=(zeros_fixed_width - nl)
324
+ zero_width == 0 \
325
+ ? possible_seg_name.to_s
326
+ : zero*zero_width +
327
+ possible_seg_name.to_s
328
+ end
329
+ end
330
+ def auto_numbering_exceptions(chosen_seg_names_,md,dob)
331
+ number_make=case dob.lv.to_i
332
+ when 1
333
+ @num_exc={
334
+ t1: @num_exc[:t1] += 1,
335
+ t2: 0,
336
+ t3: 0,
337
+ t4: 0
338
+ }
339
+ Mx[:segname_prefix_auto_num_other] + '_' \
340
+ + @num_exc[:t1].to_s
341
+ when 2
342
+ @num_exc={
343
+ t1: @num_exc[:t1],
344
+ t2: @num_exc[:t2] += 1,
345
+ t3: 0,
346
+ t4: 0
347
+ }
348
+ Mx[:segname_prefix_auto_num_other] + '_' \
349
+ + @num_exc[:t1].to_s + '_' \
350
+ + @num_exc[:t2].to_s
351
+ when 3
352
+ @num_exc={
353
+ t1: @num_exc[:t1],
354
+ t2: @num_exc[:t2],
355
+ t3: @num_exc[:t3] += 1,
356
+ t4: 0
357
+ }
358
+ Mx[:segname_prefix_auto_num_other] + '_' \
359
+ + @num_exc[:t1].to_s + '_' \
360
+ + @num_exc[:t2].to_s + '_' \
361
+ + @num_exc[:t3].to_s
362
+ when 4
363
+ @num_exc[:t4] += 1
364
+ @num_exc={
365
+ t1: @num_exc[:t1],
366
+ t2: @num_exc[:t2],
367
+ t3: @num_exc[:t3],
368
+ t4: @num_exc[:t4] += 1
369
+ }
370
+ Mx[:segname_prefix_auto_num_other] + '_' \
371
+ + @num_exc[:t1].to_s + '_' \
372
+ + @num_exc[:t2].to_s + '_' \
373
+ + @num_exc[:t3].to_s + '_' \
374
+ + @num_exc[:t4].to_s
375
+ end
376
+ end
377
+ def check_that_seg_names_are_unique(chosen_seg_names_,chosen_seg_name,type,md,dob)
378
+ begin
379
+ chosen_seg_names_ << chosen_seg_name
380
+ chosen_seg_names_=chosen_seg_names(chosen_seg_names_,chosen_seg_name,dob,md,type)
381
+ if chosen_seg_names_.compact.uniq.length \
382
+ == chosen_seg_names_.compact.length
383
+ #check that all auto given seg names are unique
384
+ chosen_seg_names_=chosen_seg_names(chosen_seg_names_,chosen_seg_name,dob,md,type)
385
+ chosen_seg_name
386
+ else
387
+ SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:green).
388
+ mark(
389
+ "duplicated auto segment name: #{type} #{chosen_seg_name}\n" \
390
+ + "#{chosen_seg_names_}\n" \
391
+ + " manually name level 1 segments '1~given_name'\n" \
392
+ + 'filename: ' + md.fns + "\n" \
393
+ + 'heading text: "' + dob.obj + '"' + "\n" \
394
+ + 'duplication: "' + chosen_seg_name + '" (level: ' + dob.lv + '; numbering type: ' + type.to_s + ')'
395
+ )
396
+ chosen_seg_name=auto_numbering_exceptions(chosen_seg_names_,md,dob)
397
+ check_that_seg_names_are_unique(chosen_seg_names_,chosen_seg_name,:exception,md,dob)
398
+ end
399
+ rescue
400
+ end
401
+ end
402
+ def auto_seg_name(possible_seg_name,heading_num_is,dob,type)
403
+ prefix=case type
404
+ when :auto then Mx[:segname_prefix_auto_num_provide]
405
+ when :extract then Mx[:segname_prefix_auto_num_extract]
406
+ else '_'*dob.lv.to_i #should not occur
407
+ end
408
+ if possible_seg_name =~/^[0-9]+?\.$/m #!~/[.,:-]+/
409
+ possible_seg_name=possible_seg_name.
410
+ gsub(/\.$/,'')
411
+ end
412
+ @chosen_seg_name=
413
+ if dob.lv=='4' \
414
+ and possible_seg_name.to_s =~/^[0-9]+(?:[.,:-][0-9]){3}/m
415
+ possible_seg_name=possible_seg_name.to_s.
416
+ gsub(/(?:[:,-]|\W)/,'.').
417
+ gsub(/\.$/,'')
418
+ prefix + possible_seg_name
419
+ elsif dob.lv=='3' \
420
+ and possible_seg_name.to_s =~/^[0-9]+(?:[.,:-][0-9]){2}/m
421
+ possible_seg_name=possible_seg_name.to_s.
422
+ gsub(/(?:[:,-]|\W)/,'.').
423
+ gsub(/\.$/,'')
424
+ prefix + possible_seg_name
425
+ elsif dob.lv=='2' \
426
+ and possible_seg_name.to_s =~/^[0-9]+(?:[.,:-][0-9]){1}/m
427
+ possible_seg_name=possible_seg_name.to_s.
428
+ gsub(/(?:[:,-]|\W)/,'.').
429
+ gsub(/\.$/,'')
430
+ prefix + possible_seg_name
431
+ elsif dob.lv=='1' \
432
+ and possible_seg_name.to_s =~/^[0-9]+[:,-]?$/m
433
+ if possible_seg_name.to_i <= heading_num_is.to_i
434
+ prefix + leading_zeros_fixed_width_number(possible_seg_name)
435
+ else
436
+ possible_seg_name=possible_seg_name.to_s.
437
+ gsub(/(?:[:,-]|\W)/,'.').
438
+ gsub(/\.$/,'')
439
+ prefix + possible_seg_name
440
+ end
441
+ else
442
+ @chosen_seg_name=auto_numbering_exceptions(@chosen_seg_names,md,dob)
443
+ end
444
+ check_that_seg_names_are_unique(@chosen_seg_names,@chosen_seg_name,type,@md,dob)
445
+ end
446
+ def set_name_and_tags(dob,possible_seg_name)
447
+ if @md.seg_names.is_a?(Array) \
448
+ and not @md.seg_names.include?(possible_seg_name)
449
+ dob.name=possible_seg_name
450
+ dob.tags=set_tags(dob.tags,dob.name)
451
+ @md.seg_names << possible_seg_name
452
+ elsif (@md.opt.act[:verbose_plus][:set]==:on \
453
+ or @md.opt.act[:maintenance][:set]==:on)
454
+ puts 'warn, there may be a conflicting numbering scheme'
455
+ end
456
+ end
457
+ def name_para_seg_filename(data) #segment naming, remaining
458
+ # paragraph name/numbering rules
459
+ # manual naming overrides, manual naming may be
460
+ # alpha-numeric characters mixed,
461
+ # numeric only (a number), if
462
+ # all segments have been named,
463
+ # the numbers used are over 1000 or
464
+ # it is not minded that auto-numbering uses a funny scheme for naming segments (not yet implemented)
465
+ # [for now a warning is printed for such documents on use of maintenance or very-verbose flag]
466
+ # auto-naming takes the form of giving numbers to segments
467
+ # the rules for which are as follows
468
+ # if the title/heading text starts with a numeric, then that is used (1 3.1 3rd etc.)
469
+ # otherwise the level 4 segment number from the embedded document structure info is used
470
+ # if there is none a sequential number is designated, preceded by an underscore
471
+ @tuned_file,@unique_auto_name=[],[]
472
+ tags={}
473
+ @art_filename_auto=0
474
+ @counter=1
475
+ if not @md.seg_autoname_safe \
476
+ and (@md.opt.act[:verbose_plus][:set]==:on \
477
+ || @md.opt.act[:maintenance][:set]==:on)
478
+ puts 'manual segment names, numbers used as names, risk warning (segmented html)'
479
+ end
480
+ ocn_html_seg=[]
481
+ @num_exc={ t1: 0, t2: 0, t3: 0, t4: 0 }
482
+ data.each do |dob|
483
+ if dob.is==:heading \
484
+ && dob.ln \
485
+ and dob.ln.to_s =~/^[4-7]/
486
+ heading_num_is=/^\d+:(\d+);\d/m.match(dob.node)[1]
487
+ if dob.ln==4 \
488
+ and not dob.name \
489
+ and not @md.set_heading_seg
490
+ @md.set_heading_seg=true
491
+ end
492
+ if dob.name !~/^\S+/ \
493
+ and dob.ln.to_s =~/^[5-7]/ \
494
+ and dob.obj =~/^\s*(?:\S+\s+)?([0-9]+(?:[.,:-][0-9])+)/m
495
+ #heading starts with a recognised numeric
496
+ #or word followed by a recognised numeric construct,
497
+ #use that as name
498
+ if dob.ln==7 \
499
+ and dob.obj =~/^\s*(?:\S+\s+)?([0-9]+(?:[.,:-][0-9]){3})/m
500
+ possible_seg_name=$1.
501
+ gsub(/(?:[:,-]|\W)/,'.').
502
+ gsub(/\.$/,'')
503
+ possible_seg_name=
504
+ auto_seg_name(possible_seg_name,heading_num_is,dob,:extract)
505
+ set_name_and_tags(dob,possible_seg_name)
506
+ elsif dob.ln==6 \
507
+ and dob.obj =~/^\s*(?:\S+\s+)?([0-9]+(?:[.,:-][0-9]){2})/m
508
+ possible_seg_name=$1.
509
+ gsub(/(?:[:,-]|\W)/,'.').
510
+ gsub(/\.$/,'')
511
+ possible_seg_name=
512
+ auto_seg_name(possible_seg_name,heading_num_is,dob,:extract)
513
+ set_name_and_tags(dob,possible_seg_name)
514
+ elsif dob.ln==5 \
515
+ and dob.obj =~/^\s*(?:\S+\s+)?([0-9]+(?:[.,:-][0-9]){1})/m
516
+ possible_seg_name=$1.
517
+ gsub(/(?:[:,-]|\W)/,'.').
518
+ gsub(/\.$/,'')
519
+ possible_seg_name=
520
+ auto_seg_name(possible_seg_name,heading_num_is,dob,:extract)
521
+ set_name_and_tags(dob,possible_seg_name)
522
+ end
523
+ end
524
+ if dob.ln==4
525
+ if dob.name !~/^\S+/ \
526
+ and dob.obj =~/^\s*(?:\S+\s+)?([0-9]+)/m
527
+ #heading starts with a recognised numeric
528
+ #or word followed by a recognised numeric construct,
529
+ #use that as name
530
+ possible_seg_name=$1
531
+ possible_seg_name=
532
+ auto_seg_name(possible_seg_name,heading_num_is,dob,:extract)
533
+ set_name_and_tags(dob,possible_seg_name)
534
+ end
535
+ if dob.name
536
+ #extract segment name from embedded document structure info
537
+ if @md.seg_names.is_a?(Array) \
538
+ and not @md.seg_names.include?(dob.name)
539
+ dob.tags=set_tags(dob.tags,dob.name)
540
+ @md.seg_names << dob.name
541
+ end
542
+ else
543
+ #if no segment name,
544
+ #provide a numerical one
545
+ @art_filename_auto+=1
546
+ possible_seg_name=
547
+ auto_seg_name(@art_filename_auto,heading_num_is,dob,:auto)
548
+ if @md.seg_names.is_a?(Array) \
549
+ and not @md.seg_names.include?(possible_seg_name)
550
+ dob.name=possible_seg_name
551
+ dob.tags=set_tags(dob.tags,dob.name)
552
+ @md.seg_names << possible_seg_name
553
+ else puts 'segment name (numbering) error'
554
+ end
555
+ end
556
+ if not dob.name #should not occur
557
+ puts "e r r o r -\t#{__FILE__}::#{__LINE__}\n#{dob.inspect}"
558
+ end
559
+ end
560
+ end
561
+ if (dob.is ==:heading \
562
+ || dob.is ==:heading_insert) \
563
+ && dob.ln==4
564
+ @seg=dob.name
565
+ end
566
+ @tuned_file << if dob.is==:heading \
567
+ && (@md.pagenew || @md.pagebreak || @md.pageline)
568
+ m=dob.ln.to_s
569
+ dob_tmp=[]
570
+ if @md.pagenew.inspect =~/#{m}/
571
+ dob_tmp <<
572
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_new]) <<
573
+ dob
574
+ elsif @md.pagebreak.inspect =~/#{m}/
575
+ dob_tmp <<
576
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page]) <<
577
+ dob
578
+ elsif @md.pageline.inspect =~/#{m}/
579
+ dob_tmp <<
580
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_line]) <<
581
+ dob
582
+ end
583
+ unless dob_tmp.length > 0; dob
584
+ else dob_tmp
585
+ end
586
+ else dob
587
+ end
588
+ if defined? dob.ocn \
589
+ and dob.ocn
590
+ @segname=((dob.is==:heading || dob.is==:heading_insert) && dob.ln==4 && (defined? dob.name)) \
591
+ ? (dob.name)
592
+ : @segname
593
+ tags["#{dob.ocn}"]={ segname: @segname }
594
+ ocn_html_seg[dob.ocn]=if (dob.is==:heading || dob.is==:heading_insert)
595
+ if dob.ln =~/[0-3]/
596
+ {
597
+ seg: nil,
598
+ level: dob.ln,
599
+ }
600
+ #elsif dob.ln =~/[4-6]/
601
+ else
602
+ {
603
+ seg: @seg,
604
+ level: dob.ln,
605
+ }
606
+ end
607
+ else
608
+ {
609
+ seg: @seg,
610
+ level: nil,
611
+ }
612
+ end
613
+ end
614
+ dob.tags=dob.tags.uniq if defined? dob.tags
615
+ if defined? dob.tags \
616
+ and dob.tags.length > 0
617
+ #@segname=((dob.is=='heading'|| dob.is=='heading_insert') && dob.ln==4 && (defined? dob.name)) \
618
+ #? (dob.name) \
619
+ #: @segname
620
+ dob.tags.each do |y|
621
+ tags[y]={ ocn: dob.ocn.to_s, segname: @segname }
622
+ end
623
+ end
624
+ dob
625
+ end
626
+ ocn_html_seg.each_with_index do |ocn,i|
627
+ if ocn \
628
+ and ocn[:level].to_s=~/[1-3]/
629
+ (1..4).each do |x|
630
+ if ocn_html_seg[i+x] \
631
+ and ocn_html_seg[i+x][:level]==4
632
+ ocn[:seg]=ocn_html_seg[i+x][:seg]
633
+ end
634
+ end
635
+ end
636
+ end
637
+ if @md.seg_names.length > 0
638
+ @md.set_heading_seg=true
639
+ end
640
+ tuned_file=@tuned_file.flatten
641
+ [tuned_file,tags,ocn_html_seg]
642
+ end
643
+ def set_heading_top(data) #% make sure no false positives
644
+ unless @md.set_heading_top
645
+ if (@md.opt.act[:verbose_plus][:set]==:on \
646
+ or @md.opt.act[:maintenance][:set]==:on)
647
+ puts "\tdocument contains no top level heading, (will have to manufacture one)"
648
+ end
649
+ @tuned_file=[]
650
+ data.each do |t_o|
651
+ unless @md.set_heading_top
652
+ if t_o !~/^(?:#{Rx[:meta]}|@\S+:)\s/m \
653
+ and t_o !~/\A\s*\Z/m
654
+ @md.set_heading_top=true
655
+ if defined? @md.title \
656
+ and @md.title \
657
+ and defined? @md.title.full \
658
+ and defined? @md.creator \
659
+ and @md.creator
660
+ head=@md.title.main \
661
+ ? ([@lv='1',@obj=@md.title.main])
662
+ : ([@lv='1',@obj='[no title provided]'])
663
+ @tuned_file << head
664
+ end
665
+ end
666
+ end
667
+ @tuned_file << t_o
668
+ end
669
+ @tuned_file=@tuned_file.flatten
670
+ end
671
+ end
672
+ def set_heading_seg(data) #% make sure no false positives
673
+ unless @md.set_heading_seg
674
+ if (@md.opt.act[:verbose_plus][:set]==:on \
675
+ or @md.opt.act[:maintenance][:set]==:on)
676
+ puts "\tdocument contains no segment level, (will have to manufacture one)"
677
+ end
678
+ @tuned_file=[]
679
+ data.each do |dob|
680
+ unless @md.set_heading_seg
681
+ if defined? dob.ln and dob.ln.to_s !~/^[0-3]/m \
682
+ and dob.obj !~/\A\s*\Z/m \
683
+ and dob.is !=:layout
684
+ @md.set_heading_seg=true
685
+ head=@md.title.main \
686
+ ? (dob.ln,dob.name,dob.obj=4,'seg',@md.title.main)
687
+ : (dob.ln,dob.name,dob.obj=4,'seg','[segment]')
688
+ @tuned_file << head
689
+ end
690
+ end
691
+ @tuned_file << dob
692
+ end
693
+ @tuned_file=@tuned_file.flatten
694
+ end
695
+ end
696
+ def set_header_title(data) #% make sure no false positives
697
+ unless @md.set_header_title
698
+ if (@md.opt.act[:verbose_plus][:set]==:on \
699
+ or @md.opt.act[:maintenance][:set]==:on)
700
+ puts "\t no document title provided, (will have to manufacture one)"
701
+ end
702
+ @tuned_file=[]
703
+ data.each do |t_o|
704
+ unless @md.set_header_title
705
+ if t_o !~/^%{1,2}\s/m \
706
+ and t_o !~/\A\s*\Z/m
707
+ @tuned_file <<
708
+ "#{Mx[:meta_o]}title#{Mx[:meta_c]} #{@md.heading_seg_first}"
709
+ @md.title.main=@md.heading_seg_first
710
+ @md.set_header_title=true
711
+ end
712
+ end
713
+ @tuned_file << t_o
714
+ end
715
+ @tuned_file=@tuned_file.flatten
716
+ end
717
+ end
718
+ end
719
+ end
720
+ __END__