sisu 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,297 @@
1
+ # encoding: utf-8
2
+ =begin
3
+
4
+ * Name: SiSU
5
+
6
+ ** Description: documents, structuring, processing, publishing, search
7
+ *** po4a
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/src_po4a_shelf_set.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_Po4aUtils
58
+ class Wrap
59
+ def initialize(md,orig='',trans='',is_desc='',n_char_max=76,n_indent=0,n_hang=nil)
60
+ @md,@orig,@trans,@is_desc,@n_char_max,@n_indent=
61
+ md, orig, trans, is_desc, n_char_max, n_indent
62
+ @n_char_max_extend = n_char_max
63
+ @br="\n"
64
+ @n_hang=n_hang ? n_hang : @n_indent
65
+ @po4a_identify_type='type: SiSU doc'
66
+ #@po4a_identify_type='type: Plain text'
67
+ end
68
+ def line_wrap
69
+ space=' '
70
+ spaces_indent,spaces_hang=
71
+ "#{@br}#{space*@n_indent}",space*@n_hang
72
+ pot,i=[],0
73
+ pot_array=(@trans.empty?) ? [@orig] : [@orig,@trans]
74
+ pot_array.each do |pa|
75
+ line=0
76
+ out=[]
77
+ out[line]=''
78
+ @oldword='' #REMOVE @oldword
79
+ pa=pa.gsub(/<br>/,' <br> ').
80
+ gsub(/#{Mx[:br_nl]}/,"\n\n")
81
+ words=pa.scan(/\n\n|\\\\\\|<br>|\S+/m)
82
+ while words != ''
83
+ word=words.shift
84
+ if not word
85
+ out[line] unless out[line].empty? #check
86
+ break
87
+ elsif word =~/\n\n/
88
+ word="\n"
89
+ @n_char_max_extend = @n_char_max + out[line].length
90
+ line=line
91
+ elsif (out[line].length + word.length) > (@n_char_max_extend - @n_indent) \
92
+ and out[line] =~/\S+/
93
+ @n_char_max_extend = @n_char_max
94
+ out[line].squeeze!(' ')
95
+ line += 1
96
+ end
97
+ if word
98
+ out[line]=if out[line] \
99
+ and out[line] !~/\S+$/m
100
+ "#{out[line]}#{word}"
101
+ elsif out[line] \
102
+ and out[line] =~/\S+/
103
+ "#{out[line]} #{word}"
104
+ else "#{word.strip}"
105
+ end
106
+ end
107
+ @oldword=word if word =~/\S+/
108
+ end
109
+ x=out.join(spaces_indent).gsub(/\A\n+/m,'').insert(0,spaces_hang)
110
+ z=[]
111
+ x.split(/\n/).each do |y|
112
+ y=y.gsub(/"/,'\"')
113
+ y=%{"#{y}"}
114
+ z << y
115
+ end
116
+ pot[i]=z.join("\n")
117
+ i +=1
118
+ pot
119
+ end
120
+ trans=(pot.length == 2) ? pot[1] : ''
121
+ po_str=<<WOK
122
+ #. #{@po4a_identify_type} - #{@is_desc}
123
+ #: en/#{@md.fns}:#{PotNumber.new.num}
124
+ msgid ""
125
+ #{pot[0]}
126
+ msgstr ""
127
+ #{trans}
128
+ WOK
129
+ po_str
130
+ end
131
+ def no_line_wrap_block
132
+ pot,i=[],0
133
+ pot_array=(@trans.empty?) ? [@orig] : [@orig,@trans]
134
+ pot_array.each do |pa|
135
+ z=[]
136
+ pa.split(/\n\n/).each do |y|
137
+ y=y.gsub(/"/,'\"')
138
+ y=%{"#{y}"}
139
+ z << y if not y.empty?
140
+ end
141
+ pot[i]=z.join("\n")
142
+ i +=1
143
+ pot
144
+ end
145
+ trans=(pot.length == 2) ? pot[1] : ''
146
+ po_str=<<WOK
147
+ #. #{@po4a_identify_type} - #{@is_desc}
148
+ #: en/#{@md.fns}:#{PotNumber.new.num}
149
+ #, no-wrap
150
+ msgid ""
151
+ #{pot[0]}
152
+ msgstr ""
153
+ #{trans}
154
+ WOK
155
+ po_str
156
+ end
157
+ def line_wrap_indent1
158
+ @n_indent,@n_hang=2,2
159
+ line_wrap
160
+ end
161
+ def line_wrap_endnote
162
+ @n_indent,@n_hang=4,2
163
+ line_wrap
164
+ end
165
+ def array_wrap
166
+ if @orig.is_a?(Array)
167
+ @arr=[]
168
+ @orig.each do |line|
169
+ @arr << SiSU_TextUtils::Wrap.new(line,@n_char_max,@n_indent,@n_hang).line_wrap
170
+ end
171
+ end
172
+ @arr
173
+ end
174
+ end
175
+ class HeaderScan
176
+ def initialize(md,para)
177
+ @md,@p=md,para
178
+ end
179
+ def extract(tag,tag_content,type,attrib)
180
+ if dc_tag \
181
+ and dc_content
182
+ [dc_tag,dc_content,{dc_tag=>dc_content}]
183
+ else nil
184
+ end
185
+ end
186
+ def header(tag,tag_content,type='',attrib='') #this will break stuff and must be tested thoroughly 20060825
187
+ @tag,@tag_content,@type,@attrib=tag,tag_content,type,attrib
188
+ def label #element
189
+ @tag
190
+ end
191
+ def type
192
+ @type
193
+ end
194
+ def text
195
+ @tag_content
196
+ end
197
+ def info #element text
198
+ @tag_content
199
+ end
200
+ def attribute
201
+ @attrib
202
+ end
203
+ def element
204
+ @tag
205
+ end
206
+ def attrib
207
+ @attrib
208
+ end
209
+ def el
210
+ @tag
211
+ end
212
+ self
213
+ end
214
+ def start_is_match
215
+ case @p
216
+ when /^#{Mx[:meta_o]}(title)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,@md.title.full,'meta','dc') #dc 1
217
+ when /^#{Mx[:meta_o]}(creator|author)#{Mx[:meta_c]}\s*(.+?)$/ then header('creator',$2,'meta','dc') #dc 2
218
+ when /^#{Mx[:meta_o]}(subject)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 3
219
+ when /^#{Mx[:meta_o]}(description)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 4
220
+ when /^#{Mx[:meta_o]}(publisher)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 5
221
+ when /^#{Mx[:meta_o]}(contributor)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 6
222
+ when /^#{Mx[:meta_o]}(date)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 7
223
+ when /^#{Mx[:meta_o]}(date\.created)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
224
+ when /^#{Mx[:meta_o]}(date\.issued)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
225
+ when /^#{Mx[:meta_o]}(date\.available)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
226
+ when /^#{Mx[:meta_o]}(date\.valid)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
227
+ when /^#{Mx[:meta_o]}(date\.modified)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
228
+ when /^#{Mx[:meta_o]}(type)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 8
229
+ when /^#{Mx[:meta_o]}(format)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 9
230
+ when /^#{Mx[:meta_o]}(identifier)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 10
231
+ when /^#{Mx[:meta_o]}(source)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 11
232
+ when /^#{Mx[:meta_o]}(language)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 12
233
+ when /^#{Mx[:meta_o]}(relation)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 13
234
+ when /^#{Mx[:meta_o]}(coverage)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 14
235
+ when /^#{Mx[:meta_o]}(rights)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','dc') #dc 15
236
+ when /^#{Mx[:meta_o]}(keywords)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
237
+ when /^#{Mx[:meta_o]}(copyright)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
238
+ when /^#{Mx[:meta_o]}(translator|translated_by)#{Mx[:meta_c]}\s*(.+?)$/ then header('translator',$2)
239
+ when /^#{Mx[:meta_o]}(illustrator|illustrated_by)#{Mx[:meta_c]}\s*(.+?)$/ then header('illustrator',$2)
240
+ when /^#{Mx[:meta_o]}(prepared_by)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
241
+ when /^#{Mx[:meta_o]}(digitized_by)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
242
+ when /^#{Mx[:meta_o]}(comments?)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
243
+ when /^#{Mx[:meta_o]}(abstract)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
244
+ when /^#{Mx[:meta_o]}(tags?)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
245
+ when /^#{Mx[:meta_o]}(catalogue)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'meta','extra')
246
+ when /^#{Mx[:meta_o]}(class(?:ify)?_loc)#{Mx[:meta_c]}\s*(.+?)$/ then header('classify_loc',$2,'meta','extra')
247
+ when /^#{Mx[:meta_o]}(class(?:ify)?_dewey)#{Mx[:meta_c]}\s*(.+?)$/ then header('classify_dewey',$2,'meta','extra')
248
+ when /^#{Mx[:meta_o]}(class(?:ify)?_pg)#{Mx[:meta_c]}\s*(.+?)$/ then header('classify_pg',$2,'meta','extra')
249
+ when /^#{Mx[:meta_o]}(class(?:ify)?_isbn)#{Mx[:meta_c]}\s*(.+?)$/ then header('classify_isbn',$2,'meta','extra')
250
+ when /^#{Mx[:meta_o]}(toc|structure)#{Mx[:meta_c]}\s*(.+?)$/ then header('structure',$2,'process','instruct')
251
+ when /^#{Mx[:meta_o]}(level|page|markup)#{Mx[:meta_c]}\s*(.+?)$/ then header('markup',$2,'process','instruct')
252
+ when /^#{Mx[:meta_o]}(bold)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'process','instruct')
253
+ when /^#{Mx[:meta_o]}(italics|itali[sz]e)#{Mx[:meta_c]}\s*(.+?)$/ then header('italicize',$2,'process','instruct')
254
+ when /^#{Mx[:meta_o]}(vocabulary|wordlist)#{Mx[:meta_c]}\s*(.+?)$/ then header('vocabulary',$2,'process','instruct')
255
+ when /^#{Mx[:meta_o]}(css|stylesheet)#{Mx[:meta_c]}\s*(.+?)$/ then header('css',$2,'process','instruct')
256
+ when /^#{Mx[:meta_o]}(links)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'process','instruct')
257
+ when /^#{Mx[:meta_o]}(prefix)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'process','instruct') #add a & b
258
+ when /^#{Mx[:meta_o]}(suffix)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'process','instruct')
259
+ when /^#{Mx[:meta_o]}(information)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'process','instruct')
260
+ when /^#{Mx[:meta_o]}(contact)#{Mx[:meta_c]}\s*(.+?)$/ then header($1,$2,'process','instruct')
261
+ when /^#{Mx[:meta_o]}(rcs|cvs)#{Mx[:meta_c]}\s*(.+?)$/ then header('version',$2,'process','instruct')
262
+ else nil
263
+ end
264
+ end
265
+ def dublin
266
+ (@p =~/^#{Mx[:meta_o]}\S+?#{Mx[:meta_c]}/) \
267
+ ? start_is_match
268
+ : nil
269
+ end
270
+ def meta
271
+ (@p =~/^#{Mx[:meta_o]}\S+?#{Mx[:meta_c]}/) \
272
+ ? start_is_match
273
+ : nil
274
+ end
275
+ end
276
+ class ParagraphNumber
277
+ def initialize(paranum)
278
+ @paranum=/(\d+)/m.match(paranum)[1]
279
+ end
280
+ def display
281
+ @paranum.gsub(/(\d+)/,'#\1')
282
+ end
283
+ end
284
+ class PotNumber
285
+ @@n=0
286
+ def initialize
287
+ @@n +=2
288
+ end
289
+ def num
290
+ @@n
291
+ end
292
+ def reset
293
+ @@n=0
294
+ end
295
+ end
296
+ end
297
+ __END__
@@ -0,0 +1,893 @@
1
+ # encoding: utf-8
2
+ =begin
3
+
4
+ * Name: SiSU
5
+
6
+ ** Description: documents, structuring, processing, publishing, search
7
+ *** pot file generation
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/src_po4a_sst_ao_sst.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_SStm_AO_SStm
58
+ require_relative 'ao' # ao.rb
59
+ require_relative 'se' # se.rb
60
+ include SiSU_Env
61
+ require_relative 'ao_composite' # ao_composite.rb
62
+ require_relative 'shared_metadata' # shared_metadata.rb
63
+ require_relative 'src_po4a_share' # src_po4a_share.rb
64
+ require_relative 'src_po4a_sst_ao_sst_set' # src_po4a_sst_ao_sst_set.rb
65
+ include SiSU_Param
66
+ require_relative 'object_munge' # object_munge.rb
67
+ require_relative 'utils_composite' # utils_composite.rb
68
+ require_relative 'utils_response' # utils_response.rb
69
+ class Source
70
+ include SiSU_Object_Munge
71
+ include SiSU_Languages_Selected
72
+ include SiSU_Response
73
+ @@md_src,@@md_master=
74
+ nil, nil
75
+ @@auto_translation_ = :go
76
+ def initialize(opt,fn=nil)
77
+ @opt,@fn=opt,fn
78
+ #unless @opt.fns =~/(.+?\.(?:-|ssm\.)?sst)$/
79
+ # puts "#{@opt.fns} not a processed file type"
80
+ #end
81
+ file_arr=SiSU_Info_Env::InfoEnv.new.
82
+ source_file_processing_array(@opt.fno)
83
+ SiSU_Param::Parameters::Instructions.new(file_arr,@opt).extract
84
+ r=Px[:lng_lst_rgx].gsub(/\|#{language.source_language_selected_str}\|/,'|')
85
+ @lang_regx=%r{(?:#{r})}
86
+ @@todo=if source_language_selected_str == opt.f_pth[:lng]
87
+ :same_file
88
+ else :compare
89
+ end
90
+ if opt.f_pth[:lng]==@opt.lng_base \
91
+ and opt.f_pth[:lng]==source_language_selected_str
92
+ @@md_master=SiSU_Param::Parameters.new(opt).get
93
+ end
94
+ end
95
+ def wrap_width_set(md,env)
96
+ if defined? md.make.plaintext_wrap \
97
+ and md.make.plaintext_wrap
98
+ md.make.plaintext_wrap
99
+ elsif defined? env.plaintext_wrap \
100
+ and env.plaintext_wrap
101
+ #env.plaintext_wrap # 78 use 75
102
+ 75
103
+ else 75 #78
104
+ end
105
+ end
106
+ def process_file(md,env,file,wrap_width,fn)
107
+ if source_language_selected_str == @opt.f_pth[:lng]
108
+ @@ao_arr_lang_trans=
109
+ SiSU_AO::Source.new(
110
+ @opt,
111
+ fn,
112
+ :po4a
113
+ ).get # ao file drawn here
114
+ end
115
+ @ao_arr_lang_src=
116
+ SiSU_AO::Source.new(
117
+ @opt,
118
+ fn,
119
+ :po4a
120
+ ).get # ao file drawn here
121
+ SiSU_SStm_AO_SStm::Source::Scroll.new(
122
+ fn,
123
+ @ao_arr_lang_src,
124
+ @@ao_arr_lang_trans,
125
+ @@md_src,
126
+ @@md_master,
127
+ wrap_width
128
+ ).songsheet
129
+ end
130
+ def read_process_src_files
131
+ begin
132
+ src={}
133
+ src[:pth]=@opt.f_pth[:pth]
134
+ src[:files]=if @opt.fns =~ /\.(?:(?:-|ssm\.)sst|ssm)$/
135
+ @opt.fns=@opt.fns.gsub(/\.ssm\.sst$/,'.ssm')
136
+ SiSU_Assemble::CompositeFileList.new(@opt).read
137
+ else
138
+ [@opt.fns]
139
+ end
140
+ md=SiSU_Param::Parameters.new(@opt).get
141
+ env=SiSU_Env::InfoEnv.new(@opt.fns)
142
+ file=SiSU_Env::FileOp.new(md)
143
+ lng=/\/([^\/]+)$/.match(src[:pth])[1]
144
+ if language.source_language_selected_str == lng
145
+ SiSU_Po4a_Project::Po4aDistClean.new(@opt,file).song
146
+ end
147
+ wrap_width=wrap_width_set(md,env)
148
+ lng = /\/([^\/]+)$/.match(src[:pth])[1]
149
+ ans=response?('process files?')
150
+ if ans
151
+ src[:files].each do |fn|
152
+ puts "[#{lng}] #{fn}"
153
+ process_file(md,env,file,wrap_width,fn)
154
+ end
155
+ end
156
+ rescue
157
+ SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do
158
+ __LINE__.to_s + ':' + __FILE__
159
+ end
160
+ ensure
161
+ end
162
+ end
163
+ def read_setup
164
+ begin
165
+ md=SiSU_Param::Parameters.new(@opt).get
166
+ file=SiSU_Env::FileOp.new(md)
167
+ SiSU_Po4a_Project::Po4aCfg.new(@opt,file).song
168
+ SiSU_Po4a_Project::Po4aProject.new(@opt,file).song
169
+ rescue
170
+ SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do
171
+ __LINE__.to_s + ':' + __FILE__
172
+ end
173
+ ensure
174
+ end
175
+ end
176
+ private
177
+ class Scroll <Source
178
+ include SiSU_Po4aUtils
179
+ @@endnotes={ para: [], end: [] }
180
+ def initialize(fn,data_src,data_master,md_src,md_master,wrap_width)
181
+ @fn,@data_src,@data_master,@md_src,@md_master,@wrap_width=
182
+ fn, data_src, data_master, md_src, md_master, wrap_width
183
+ @md=md_src
184
+ @tab="\t"
185
+ @@endnotes_=(@md.opt.selections.str =~/--endnote/) \
186
+ ? true
187
+ : false # --footnote
188
+ @pot={
189
+ body: [],
190
+ open: [],
191
+ close: [],
192
+ head: [],
193
+ metadata: [],
194
+ tail: []
195
+ }
196
+ end
197
+ def br
198
+ (@md.opt.selections.str =~/--dos/) ? "\r\n" : "\n" # --unix
199
+ end
200
+ def songsheet
201
+ fn=@fn
202
+ pot=compare_structure_src_trn(@data_src,@data_master,@@todo)
203
+ publish(fn,pot)
204
+ end
205
+ def pot_structure_wrap(orig,trans,indent=0,hang=0)
206
+ SiSU_Po4aUtils::Wrap.new(
207
+ @md,
208
+ orig,
209
+ trans,
210
+ @wrap_width,
211
+ indent,
212
+ hang
213
+ )
214
+ end
215
+ def wrap_endnotes(orig_notes='',trn_notes='')
216
+ #nt=@@endnotes_ ? 'endnote' : 'footnote'
217
+ @fn=0
218
+ a_l=orig_notes.length
219
+ 0.upto(a_l-1) do |i|
220
+ @fn=if orig_notes[i].to_s =~/^\^~([\d*+]+)/ # provides endnote number within paragraph
221
+ @fn += 1
222
+ else @fn
223
+ end
224
+ #mark="^~ "
225
+ orig=(orig_notes[i].to_s =~/^\^~[\d*+]+/) \
226
+ ? (orig_notes[i].to_s.gsub(/^\^~[\d*+]+/,'^~'))
227
+ : orig_notes[i].to_s
228
+ trans=if trn_notes.is_a?(Array) \
229
+ and trn_notes.length==orig_notes.length
230
+ (trn_notes[i].to_s =~/^\^~[\d*+]+/) \
231
+ ? (trn_notes[i].to_s.gsub(/^\^~[\d*+]+/,'^~'))
232
+ : trn_notes[i].to_s
233
+ else ''
234
+ end
235
+ util=pot_structure_wrap(orig,trans)
236
+ wrap=util.line_wrap
237
+ wrap=if wrap =~ /^\s*\^~[\d*+]+\s+.+?\s*\Z/m
238
+ wrap.gsub(/^\s*(\^~[\d*+]+)\s+(.+?)\s*\Z/m, <<GSUB
239
+ \\1 \\2
240
+ GSUB
241
+ )
242
+ else
243
+ wrap.gsub(/^(.+)\Z/m, <<GSUB
244
+ \\1
245
+ GSUB
246
+ )
247
+ end
248
+ @@endnotes[:para] << wrap
249
+ @@endnotes[:end] << '' << wrap
250
+ end
251
+ @@endnotes[:para].each {|e| @pot[:body] << e << br}
252
+ @@endnotes[:para]=[]
253
+ @@endnotes
254
+ end
255
+ def pot_metadata_src
256
+ @po4a_identify_type='type: SiSU doc' #'type: Plain text'
257
+ meta_src=SiSU_Metadata::Summary.new(@md_src)
258
+ w=[]
259
+ w << [
260
+ meta_src.metadata_tags.title.main,
261
+ meta_src.metadata_tags.title.sub,
262
+ meta_src.metadata_tags.title.edition,
263
+ meta_src.metadata_tags.title.note,
264
+ meta_src.metadata_tags.title.short,
265
+ meta_src.metadata_tags.title.language,
266
+ meta_src.metadata_tags.title.language_char,
267
+ ]
268
+ w << [
269
+ meta_src.metadata_tags.creator.head,
270
+ meta_src.metadata_tags.creator.author,
271
+ meta_src.metadata_tags.creator.contributor,
272
+ meta_src.metadata_tags.creator.illustrator,
273
+ meta_src.metadata_tags.creator.photographer,
274
+ meta_src.metadata_tags.creator.translator,
275
+ meta_src.metadata_tags.creator.audio,
276
+ meta_src.metadata_tags.creator.digitized_by,
277
+ meta_src.metadata_tags.creator.prepared_by,
278
+ ]
279
+ w << [
280
+ meta_src.metadata_tags.rights.head,
281
+ meta_src.metadata_tags.rights.copyright.text,
282
+ meta_src.metadata_tags.rights.copyright.translation,
283
+ meta_src.metadata_tags.rights.copyright.illustrations,
284
+ meta_src.metadata_tags.rights.copyright.photographs,
285
+ meta_src.metadata_tags.rights.copyright.digitization,
286
+ meta_src.metadata_tags.rights.copyright.audio,
287
+ meta_src.metadata_tags.rights.license,
288
+ ]
289
+ w << [
290
+ meta_src.metadata_tags.classify.head,
291
+ meta_src.metadata_tags.classify.subject,
292
+ meta_src.metadata_tags.classify.topic_register,
293
+ meta_src.metadata_tags.classify.loc,
294
+ meta_src.metadata_tags.classify.dewey,
295
+ ]
296
+ w << [
297
+ meta_src.metadata_tags.date.head,
298
+ meta_src.metadata_tags.date.added_to_site,
299
+ meta_src.metadata_tags.date.available,
300
+ meta_src.metadata_tags.date.created,
301
+ meta_src.metadata_tags.date.issued,
302
+ meta_src.metadata_tags.date.modified,
303
+ meta_src.metadata_tags.date.published,
304
+ meta_src.metadata_tags.date.valid,
305
+ ]
306
+ w << [
307
+ meta_src.processing_tags.make.language,
308
+ meta_src.processing_tags.make.headings,
309
+ meta_src.processing_tags.make.num_top,
310
+ meta_src.processing_tags.make.breaks,
311
+ meta_src.processing_tags.make.emphasis,
312
+ meta_src.processing_tags.make.bold,
313
+ meta_src.processing_tags.make.italics,
314
+ meta_src.processing_tags.make.texpdf_font,
315
+ ]
316
+ w.each do |y|
317
+ z=''
318
+ y.each do |x|
319
+ if x
320
+ z += x + "\n" if x =~/^#|^msg(?:id|str)/
321
+ z += %{#{x}\n} if x =~/^@\S+?:(?: |$)/
322
+ z += %{#{x}\n} if x =~/^\s+:\S+?: /
323
+ end
324
+ end
325
+ @pot[:metadata] << z << br
326
+ #puts z unless z.empty?
327
+ end
328
+ end
329
+ def pot_metadata_src_trn
330
+ #@po4a_identify_type='type: Plain text'
331
+ meta_src=SiSU_Metadata::Summary.new(@md_src)
332
+ w=[]
333
+ w << [
334
+ meta_src.metadata_tags.title.main,
335
+ meta_src.metadata_tags.title.sub,
336
+ meta_src.metadata_tags.title.edition,
337
+ meta_src.metadata_tags.title.note,
338
+ meta_src.metadata_tags.title.short,
339
+ meta_src.metadata_tags.title.language,
340
+ meta_src.metadata_tags.title.language_char,
341
+ ]
342
+ w << [
343
+ meta_src.metadata_tags.creator.head,
344
+ meta_src.metadata_tags.creator.author,
345
+ meta_src.metadata_tags.creator.contributor,
346
+ meta_src.metadata_tags.creator.illustrator,
347
+ meta_src.metadata_tags.creator.photographer,
348
+ meta_src.metadata_tags.creator.translator,
349
+ meta_src.metadata_tags.creator.audio,
350
+ meta_src.metadata_tags.creator.digitized_by,
351
+ meta_src.metadata_tags.creator.prepared_by,
352
+ ]
353
+ w << [
354
+ meta_src.metadata_tags.rights.head,
355
+ meta_src.metadata_tags.rights.copyright.text,
356
+ meta_src.metadata_tags.rights.copyright.translation,
357
+ meta_src.metadata_tags.rights.copyright.illustrations,
358
+ meta_src.metadata_tags.rights.copyright.photographs,
359
+ meta_src.metadata_tags.rights.copyright.digitization,
360
+ meta_src.metadata_tags.rights.copyright.audio,
361
+ meta_src.metadata_tags.rights.license,
362
+ ]
363
+ w << [
364
+ meta_src.metadata_tags.classify.head,
365
+ meta_src.metadata_tags.classify.subject,
366
+ meta_src.metadata_tags.classify.topic_register,
367
+ meta_src.metadata_tags.classify.loc,
368
+ meta_src.metadata_tags.classify.dewey,
369
+ ]
370
+ w << [
371
+ meta_src.metadata_tags.date.head,
372
+ meta_src.metadata_tags.date.added_to_site,
373
+ meta_src.metadata_tags.date.available,
374
+ meta_src.metadata_tags.date.created,
375
+ meta_src.metadata_tags.date.issued,
376
+ meta_src.metadata_tags.date.modified,
377
+ meta_src.metadata_tags.date.published,
378
+ meta_src.metadata_tags.date.valid,
379
+ ]
380
+ w << [
381
+ meta_src.processing_tags.make.language,
382
+ meta_src.processing_tags.make.headings,
383
+ meta_src.processing_tags.make.num_top,
384
+ meta_src.processing_tags.make.breaks,
385
+ meta_src.processing_tags.make.emphasis,
386
+ meta_src.processing_tags.make.bold,
387
+ meta_src.processing_tags.make.italics,
388
+ meta_src.processing_tags.make.texpdf_font,
389
+ ]
390
+ w.each do |y|
391
+ z=''
392
+ y.each do |x|
393
+ if x
394
+ z += x + "\n" if x =~/^#|^msg(?:id|str)/
395
+ z += %{#{x}\n} if x =~/^@\S+?:(?: |$)/
396
+ z += %{#{x}\n} if x =~/^\s+:\S+?: /
397
+ end
398
+ end
399
+ @pot[:metadata] << z << br
400
+ #puts z unless z.empty?
401
+ end
402
+ end
403
+ def auto_translate?(set_to=nil)
404
+ @@auto_translation_=
405
+ if @md.opt.act[:po4a_lang_trans][:set]==:on
406
+ set_to \
407
+ ? set_to
408
+ : @@auto_translation_
409
+ else :skip
410
+ end
411
+ end
412
+ def auto_translation(src_txt,markup=:src) # check for an appropriate request flag
413
+ auto_translate?(:skip)
414
+ begin
415
+ src_txt_clean=clean_text(src_txt,markup)
416
+ src_txt_clean=src_txt_clean.
417
+ gsub(/\n/,' ').
418
+ gsub(/"/,'\"').
419
+ gsub(/([()])/,'\\\\\1')
420
+ trans=''
421
+ unless auto_translate? == :skip
422
+ require 'timeout'
423
+ Timeout::timeout(60) {
424
+ trans=`trans -b -no-ansi en:#{@md.opt.f_pth[:lng_is]} #{src_txt_clean}`.strip
425
+ unless trans.empty?
426
+ trans + ' {[G.Tr]}http://translate.google.com'
427
+ end
428
+ }
429
+ end
430
+ trans
431
+ rescue
432
+ auto_translate?(:skip)
433
+ p 'timeout issues with translation, skip remaining'
434
+ end
435
+ end
436
+ def pot_structure
437
+ def heading(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
438
+ lv=n=n3=nil
439
+ lv=dob_src.ln
440
+ n=lv - 1
441
+ n3=lv + 2
442
+ util=nil
443
+ fn=(dob_src.name=~/[a-z\d]/i) ? dob_src.name : ''
444
+ mark="#{dob_src.lv}~#{fn} "
445
+ orig="#{mark}#{dob_src.obj}"
446
+ trans=((dob_trn=='') \
447
+ || (dob_src.obj == dob_trn.obj)) \
448
+ ? ''
449
+ : "#{mark}#{dob_trn.obj}"
450
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
451
+ and trans.empty? \
452
+ and auto_translate?
453
+ trans=auto_translation(dob_src.obj,:src)
454
+ end
455
+ util=pot_structure_wrap(orig,trans)
456
+ wrapped=util.line_wrap
457
+ @pot[:body] << wrapped << br # main text, contents, body KEEP
458
+ if @@endnotes[:para] \
459
+ and notes_s.length > 0 \
460
+ and not @@endnotes_
461
+ @pot[:body] << br
462
+ wrap_endnotes(notes_s,notes_t)
463
+ elsif @@endnotes[:para] \
464
+ and @@endnotes_
465
+ @pot[:body] << br*2
466
+ end
467
+ end
468
+ def para(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
469
+ util=nil
470
+ wrapped=if dob_src.indent =~/[1-9]/ \
471
+ and dob_src.indent == dob_src.hang
472
+ s_mark=desc=orig=trans=''
473
+ mark=if dob_src.bullet_
474
+ "_#{dob_src.indent}* "
475
+ else
476
+ "_#{dob_src.indent} "
477
+ end
478
+ orig="#{mark}#{dob_src.obj}"
479
+ trans=((dob_trn=='') \
480
+ || (dob_src.obj == dob_trn.obj)) \
481
+ ? ''
482
+ : "#{mark}#{dob_trn.obj}"
483
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
484
+ and trans.empty? \
485
+ and auto_translate?
486
+ trans=auto_translation(dob_src.obj,:src)
487
+ end
488
+ util=pot_structure_wrap(orig,trans)
489
+ elsif dob_src.hang =~/[0-9]/ \
490
+ and dob_src.indent != dob_src.hang
491
+ s_mark=desc=orig=trans=''
492
+ mark="_#{dob_src.hang}_#{dob_src.indent} "
493
+ orig="#{mark}#{dob_src.obj}"
494
+ trans=((dob_trn=='') \
495
+ || (dob_src.obj == dob_trn.obj)) \
496
+ ? ''
497
+ : "#{mark}#{dob_trn.obj}"
498
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
499
+ and trans.empty? \
500
+ and auto_translate?
501
+ trans=auto_translation(dob_src.obj,:src)
502
+ end
503
+ util=pot_structure_wrap(orig,trans)
504
+ else
505
+ s_mark=desc=orig=trans=''
506
+ if dob_src.bullet_
507
+ mark='_* '
508
+ orig="#{mark}#{dob_src.obj}"
509
+ trans=((dob_trn=='') \
510
+ || (dob_src.obj == dob_trn.obj)) \
511
+ ? ''
512
+ : "#{mark}#{dob_trn.obj}"
513
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
514
+ and trans.empty? \
515
+ and auto_translate?
516
+ trans=auto_translation(dob_src.obj,:src)
517
+ end
518
+ else
519
+ mark=''
520
+ orig=dob_src.obj
521
+ trans=((dob_trn=='') \
522
+ || (dob_src.obj == dob_trn.obj)) \
523
+ ? ''
524
+ : "#{mark}#{dob_trn.obj}"
525
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
526
+ and trans.empty? \
527
+ and auto_translate?
528
+ trans=auto_translation(dob_src.obj,:src)
529
+ end
530
+ end
531
+ util=pot_structure_wrap(orig,trans)
532
+ end
533
+ wrapped=util.line_wrap
534
+ @pot[:body] << wrapped << br # main text, contents, body KEEP
535
+ if @@endnotes[:para] \
536
+ and notes_s.length > 0 \
537
+ and not @@endnotes_
538
+ @pot[:body] << br
539
+ wrap_endnotes(notes_s,notes_t)
540
+ elsif @@endnotes[:para] \
541
+ and @@endnotes_
542
+ @pot[:body] << br*2
543
+ end
544
+ end
545
+ def block(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
546
+ mark_o ="block{\n\n"
547
+ mark_c ="\n\n}block"
548
+ orig="#{mark_o}#{dob_src.obj}#{mark_c}"
549
+ trans=((dob_trn=='') \
550
+ || (dob_src.obj == dob_trn.obj)) \
551
+ ? ''
552
+ : "#{mark_o}#{dob_trn.obj}#{mark_c}"
553
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
554
+ and trans.empty? \
555
+ and auto_translate?
556
+ trans=auto_translation(dob_src.obj,:src)
557
+ end
558
+ util=pot_structure_wrap(orig,trans)
559
+ unwrapped=util.no_line_wrap_block
560
+ @pot[:body] << unwrapped << br
561
+ end
562
+ def group(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
563
+ mark_o ="group{\n\n"
564
+ mark_c ="\n\n}group"
565
+ orig="#{mark_o}#{dob_src.obj}#{mark_c}"
566
+ trans=((dob_trn=='') \
567
+ || (dob_src.obj == dob_trn.obj)) \
568
+ ? ''
569
+ : "#{mark_o}#{dob_trn.obj}#{mark_c}"
570
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
571
+ and trans.empty? \
572
+ and auto_translate?
573
+ trans=auto_translation(dob_src.obj,:src)
574
+ end
575
+ util=pot_structure_wrap(orig,trans)
576
+ unwrapped=util.no_line_wrap_block
577
+ @pot[:body] << unwrapped << br
578
+ end
579
+ def verse(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
580
+ mark="poem{\n\nverse\n\nverse\n\n...\n\n}poem"
581
+ instruct=s_mark=''
582
+ if @md.opt.act[:maintenance][:set]==:on
583
+ instruct=%{\n# verse are part of the text block described as a poem, } \
584
+ + %{the first verse is preceeded by an opening marker, } \
585
+ + %{and the last verse by a closing marker, } \
586
+ + %{the content of which should remain unwrapped}
587
+ s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
588
+ end
589
+ orig=dob_src.obj
590
+ trans=(dob_trn=='') \
591
+ ? ''
592
+ : dob_trn.obj
593
+ util=pot_structure_wrap(orig,trans)
594
+ unwrapped=util.no_line_wrap_block
595
+ @pot[:body] << unwrapped << br
596
+ end
597
+ def code(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
598
+ mark_o ="code{\n\n"
599
+ mark_c ="\n\n}code"
600
+ orig="#{mark_o}#{dob_src.obj}#{mark_c}"
601
+ trans=(dob_trn=='') \
602
+ ? ''
603
+ : "#{mark_o}#{dob_trn.obj}#{mark_c}"
604
+ util=pot_structure_wrap(orig,trans)
605
+ unwrapped=util.no_line_wrap_block
606
+ @pot[:body] << unwrapped << br
607
+ end
608
+ def table(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
609
+ mark_o ="table{\n\n"
610
+ mark_c ="\n\n}table"
611
+ orig="#{mark_o}#{dob_src.obj}#{mark_c}"
612
+ orig=orig.gsub(/#{Mx[:tc_c]}/m,"\n")
613
+ trans=(dob_trn=='') \
614
+ ? ''
615
+ : "#{mark_o}#{dob_trn.obj}#{mark_c}"
616
+ trans=trans.gsub(/#{Mx[:tc_c]}/m,"\n")
617
+ util=pot_structure_wrap(orig,trans)
618
+ unwrapped=util.no_line_wrap_block
619
+ @pot[:body] << unwrapped << br
620
+ end
621
+ def idx_markup(idx)
622
+ struct=['={' + "\n "]
623
+ idx.sort.each do |x|
624
+ x.each_with_index do |y,i0|
625
+ case y
626
+ when String
627
+ unless struct[-1] =~/=\{/
628
+ struct << ' ;' + "\n "
629
+ end
630
+ struct << y
631
+ if x[i0+1].class == Hash \
632
+ and x[i0+1][:sub].length > 0
633
+ struct << ' :' + "\n "
634
+ end
635
+ when Hash
636
+ if y[:plus].to_i > 0
637
+ struct << '+' + y[:plus].to_s
638
+ end
639
+ if y[:sub].length > 0
640
+ y[:sub].each_with_index do |z,i1|
641
+ z.each_with_index do |a,i2|
642
+ if z.length > 0
643
+ struct << a[0]
644
+ if a[1][:plus].to_i > 0
645
+ struct << '+' + a[1][:plus].to_s
646
+ end
647
+ if (i1 + 1) < y[:sub].length
648
+ struct << '|'
649
+ end
650
+ end
651
+ end
652
+ end
653
+ end
654
+ end
655
+ end
656
+ end
657
+ struct << "\n" + '}'
658
+ #puts struct.join
659
+ struct.join
660
+ end
661
+ def idx(dob_src='') #% used for book index but broken as original markup lost, already abstracted, fix
662
+ orig=pot_structure.idx_markup(dob_src.idx) #'={' + dob_src.idx + '}'
663
+ util=pot_structure_wrap(orig,'')
664
+ unwrapped=util.no_line_wrap_block
665
+ if @pot[:body][-1] == "\n"
666
+ @pot[:body][-1] = unwrapped #<< br
667
+ @pot[:body] << br
668
+ else # expect to catch all above, problem if wraps, must =~/^=\{/
669
+ @pot[:body] << unwrapped << br # places idx in separate object
670
+ end
671
+ end
672
+ self
673
+ end
674
+ def compare_structure_src_trn(data_src,data_trn,todo)
675
+ #@endnotes,@copen,@pot_contents_close=Array.new(3){[]}
676
+ a_l= data_src.length
677
+ s,t=0,0
678
+ 0.upto(a_l-1) do |i|
679
+ if todo==:compare
680
+ unless data_src[s] \
681
+ and data_trn[t]
682
+ break
683
+ end
684
+ if data_src[s].of == :comment \
685
+ and data_trn[t].of == :comment \
686
+ and (data_src[s].is == data_trn[t].is)
687
+ s+=1;t+=1
688
+ next
689
+ end
690
+ if ((data_src[s].is == :comment) \
691
+ || (data_trn[t].is == :comment)) \
692
+ and (data_src[s].is != data_trn[t].is)
693
+ if data_src[s].is == :comment
694
+ if @md.opt.act[:maintenance][:set]==:on
695
+ puts "src (comment):\n\t" \
696
+ + data_src[s].obj
697
+ end
698
+ s+=1
699
+ #next if data_src[s].is == :comment
700
+ elsif data_trn[t].is == :comment
701
+ if @md.opt.act[:maintenance][:set]==:on
702
+ puts "trans (comment):\n\t" \
703
+ + data_trn[t].obj
704
+ end
705
+ t+=1
706
+ #next if data_trn[t].is == :comment
707
+ end
708
+ end
709
+ if ((defined? data_src[s].ocn) \
710
+ && (data_src[s].ocn.is_a?(Fixnum))) \
711
+ and ((defined? data_trn[t].ocn) \
712
+ && (data_trn[t].ocn.is_a?(Fixnum))) \
713
+ and (data_src[s].ocn == data_trn[t].ocn)
714
+ @m_s,@m_t=s,t
715
+ elsif ((defined? data_src[s].ocn) \
716
+ && (data_src[s].ocn.is_a?(Fixnum))) \
717
+ and ((defined? data_trn[t].ocn) \
718
+ && (data_trn[t].ocn.is_a?(Fixnum))) \
719
+ and (data_src[s].ocn != data_trn[t].ocn)
720
+ p '--- OCN ---'
721
+ p 'mis-match'
722
+ p data_src[s].ocn if defined? data_src[s].ocn
723
+ p data_src[s].obj if defined? data_src[s].obj
724
+ p data_trn[t].ocn if defined? data_trn[t].ocn
725
+ p data_trn[t].obj if defined? data_trn[t].obj
726
+ p '---'
727
+ p 'previous match'
728
+ p data_src[@m_s].ocn if defined? data_src[@m_s].ocn
729
+ p data_src[@m_s].obj if defined? data_src[@m_s].obj
730
+ p data_trn[@m_t].ocn if defined? data_trn[@m_t].ocn
731
+ p data_trn[@m_t].obj if defined? data_trn[@m_s].obj
732
+ exit
733
+ elsif (((defined? data_src[s].ocn) \
734
+ && (defined? data_trn[t].ocn)) \
735
+ and data_src[s].ocn.class != data_trn[t].ocn.class)
736
+ p '--- OCN class ---'
737
+ p 'mis-match'
738
+ p data_src[s].ocn if defined? data_src[s].ocn
739
+ p data_src[s].obj if defined? data_src[s].obj
740
+ p data_trn[t].ocn if defined? data_trn[t].ocn
741
+ p data_trn[t].obj if defined? data_trn[t].obj
742
+ #p '---'
743
+ #p 'previous match'
744
+ #p data_src[@m_s].ocn
745
+ #p data_src[@m_s].obj
746
+ #p data_trn[@m_t].ocn
747
+ #p data_trn[@m_t].obj
748
+ #elsif (defined? data_src[s].ocn != defined? data_trn[t].ocn) \
749
+ #and (data_src[s].ocn.nil? != data_trn[t].ocn.nil?)
750
+ # p '--- missing OCN? ---'
751
+ # p 'mis-match'
752
+ # p data_src[s].ocn if defined? data_src[s].ocn
753
+ # p data_src[s].obj
754
+ # p data_trn[t].ocn if defined? data_trn[t].ocn
755
+ # p data_trn[t].obj
756
+ else
757
+ end
758
+ end
759
+ notes_s=''
760
+ data_src[s],notes_s=markup(data_src[s])
761
+ data_src[s],nul=pot_data(data_src[s],notes_s)
762
+ s+=1;t+=1
763
+ end
764
+ @pot #watch
765
+ end
766
+ def pot_data(dob_src='',notes_s)
767
+ if dob_src.obj !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/
768
+ if defined? dob_src.ocn \
769
+ and dob_src.ocn.to_s =~/\d+/
770
+ paranum=dob_src.ocn.to_s
771
+ @p_num=SiSU_Po4aUtils::ParagraphNumber.new(paranum)
772
+ end
773
+ case dob_src.is
774
+ when :heading
775
+ pot_structure.heading(dob_src,notes_s)
776
+ when :para
777
+ pot_structure.para(dob_src,notes_s)
778
+ when :group
779
+ pot_structure.group(dob_src,notes_s)
780
+ when :block
781
+ pot_structure.block(dob_src,notes_s)
782
+ when :verse
783
+ pot_structure.verse(dob_src,notes_s)
784
+ when :code
785
+ pot_structure.code(dob_src,notes_s)
786
+ when :table
787
+ pot_structure.table(dob_src,notes_s)
788
+ end
789
+ if defined? dob_src.idx \
790
+ and not dob_src.idx.nil? \
791
+ and not dob_src.idx.empty?
792
+ pot_structure.idx(dob_src)
793
+ end
794
+ #if dob_src ## Clean Prepared Text
795
+ # dob_src.obj=dob_src.obj.gsub(/<!.+!>/,' ').
796
+ # gsub(/<:\S+>/,' ') if dob_src ## Clean Prepared Text
797
+ #end
798
+ end
799
+ #[dob_src,dob_trn]
800
+ end
801
+ def markup(dob)
802
+ dob,notes=objects.textface_marks_po4a(dob,:separate)
803
+ [dob,notes]
804
+ end
805
+ def publish(fn,pot)
806
+ content=[]
807
+ content << pot[:open]
808
+ content << pot[:head]
809
+ content << pot[:metadata]
810
+ content << pot[:body]
811
+ content << @@endnotes[:end] if @@endnotes_
812
+ Output.new(fn,content,@md,@process).po4a
813
+ @@endnotes={ para: [], end: [] }
814
+ end
815
+ end
816
+ class Output <Source
817
+ include SiSU_Param
818
+ include SiSU_Env
819
+ def initialize(fn,content,md,process=:complete)
820
+ @fn,@content,@md,@process=fn,content,md,process
821
+ @file=SiSU_Env::FileOp.new(md,fn)
822
+ end
823
+ def po4a #%pot output
824
+ file_pot=@file.write_file.po4a_sst
825
+ #file_pot=(@md.opt.f_pth[:lng] == @md.opt.lng_base) \
826
+ #? @file.write_file.pot
827
+ #: @file.write_file.po
828
+ @sisu=[]
829
+ emptyline=0
830
+ @content.each do |para| # this is a hack
831
+ if para.is_a?(Array) \
832
+ and para.length > 0
833
+ para.each do |line|
834
+ if line
835
+ line=line.gsub(/\s+$/m,'').
836
+ gsub(/^\A[ ]*\Z/m,'')
837
+ if line=~/^\A[ ]*\Z/m
838
+ emptyline+=1
839
+ else emptyline=0
840
+ end
841
+ file_pot.puts line if emptyline < 2 #remove extra line spaces (fix upstream)
842
+ end
843
+ end
844
+ else file_pot.puts para #unix plaintext # /^([*=-]|\.){5}/
845
+ end
846
+ end
847
+ file_pot.close
848
+ SiSU_Po4aUtils::PotNumber.new.reset
849
+ #po4a_git
850
+ end
851
+ def po4a_git
852
+ unless @md.opt.act[:maintenance][:set]==:on
853
+ require_relative 'git' # git.rb
854
+ git=SiSU_Git::Source.new(@md.opt,@process)
855
+ unless FileTest.directory?(@file.output_path.pot_git.dir)
856
+ git.create_file_structure_git
857
+ end
858
+ if @md.opt.f_pth[:lng] == @md.opt.lng_base
859
+ FileUtils::cp(
860
+ @file.place_file.pot.dir,
861
+ @file.output_path.pot_git.dir
862
+ )
863
+ else # naive, work on -->
864
+ FileUtils::cp(
865
+ @file.place_file.po.dir,
866
+ @file.output_path.po_git.dir
867
+ ) #unless FileTest.file?(@file.place_file.po_git.dir)
868
+ end
869
+ git.read
870
+ end
871
+ end
872
+ end
873
+ end
874
+ end
875
+ __END__
876
+ REMOVE
877
+ &#033;\|&#035;\|&&#042;\|&#045;\|&#047;\|&#095;\|&#123;\|&#125;\|&#126;\|&#
878
+
879
+ tables are problematic, difficult to reconstitute instruction, check
880
+
881
+ metadata, move to top? and work on
882
+
883
+ footnotes, different types, asterisk, also do you want to have separate
884
+ paragraphs, or breaks within one block?
885
+
886
+ where no ocn appropriately use ~# or -# or indeed 1~name-
887
+
888
+ comments in document, what to do about them, not sure they are currently
889
+ retained in dal, could be quite valuable to keep
890
+
891
+ Translate Shell
892
+ http://www.soimort.org/translate-shell/
893
+ translate.google.com