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,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