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,1217 @@
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_shelf.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_Po4a
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_shelf_set' # src_po4a_shelf_set.rb
64
+ include SiSU_Param
65
+ require_relative 'object_munge' # object_munge.rb
66
+ require_relative 'utils_composite' # utils_composite.rb
67
+ class Source
68
+ include SiSU_Object_Munge
69
+ @@opt_src,@@opt_trn,@@opt_src_,@@opt_trn_,@@md_src,@@md_trn=
70
+ nil, nil, nil, nil, nil, nil
71
+ @@auto_translation_ = :go
72
+ def initialize(opt,fn=nil)
73
+ @opt,@fn=opt,fn
74
+ #unless @opt.fns =~/(.+?\.(?:-|ssm\.)?sst)$/
75
+ # puts "#{@opt.fns} not a processed file type"
76
+ #end
77
+ file_arr=SiSU_Info_Env::InfoEnv.new.source_file_processing_array(@opt.fns)
78
+ SiSU_Param::Parameters::Instructions.new(file_arr,@opt).extract
79
+ r=Px[:lng_lst_rgx].gsub(/\|en\|/,'|')
80
+ @lang_regx=%r{(?:#{r})}
81
+ if opt.fns =~/\S+?~#{@lang_regx}\.ss[mti]/ \
82
+ and opt.f_pth[:lng]!=@opt.lng_base
83
+ @@opt_src_=false
84
+ @@opt_trn=opt
85
+ @@md_trn=SiSU_Param::Parameters.new(opt).get
86
+ else
87
+ @@opt_src_=true
88
+ @@opt_src=opt
89
+ @@md_src=SiSU_Param::Parameters.new(opt).get
90
+ end
91
+ end
92
+ def wrap_width_set(md,env)
93
+ if defined? md.make.plaintext_wrap \
94
+ and md.make.plaintext_wrap
95
+ md.make.plaintext_wrap
96
+ elsif defined? env.plaintext_wrap \
97
+ and env.plaintext_wrap
98
+ env.plaintext_wrap
99
+ else 78
100
+ end
101
+ end
102
+ def process_file(md,env,file,wrap_width,fn)
103
+ unless @opt.act[:quiet][:set]==:on
104
+ tool=(@opt.act[:verbose][:set]==:on \
105
+ || @opt.act[:verbose_plus][:set]==:on \
106
+ || @opt.act[:maintenance][:set]==:on) \
107
+ ? "#{env.program.text_editor} #{file.output_path.pot.dir}/"
108
+ : @opt.fns
109
+ (@opt.act[:verbose][:set]==:on \
110
+ || @opt.act[:verbose_plus][:set]==:on \
111
+ || @opt.act[:maintenance][:set]==:on) \
112
+ ? SiSU_Screen::Ansi.new(
113
+ @opt.act[:color_state][:set],
114
+ 'Pot po4a',
115
+ tool
116
+ ).green_hi_blue
117
+ : SiSU_Screen::Ansi.new(
118
+ @opt.act[:color_state][:set],
119
+ 'Pot po4a',
120
+ tool
121
+ ).green_title_hi
122
+ if (@opt.act[:verbose][:set]==:on \
123
+ || @opt.act[:verbose_plus][:set]==:on \
124
+ || @opt.act[:maintenance][:set]==:on)
125
+ SiSU_Screen::Ansi.new(
126
+ @opt.act[:color_state][:set],
127
+ @opt.fns,
128
+ file.output_path.pot.dir
129
+ ).flow
130
+ end
131
+ end
132
+ if @opt.fns =~/\S+?~#{@lang_regx}\.ss[mti]/ \
133
+ or @opt.f_pth[:lng] !=@opt.lng_base
134
+ opt_lang_trn_fn=fn
135
+ @ao_arr_lang_trans=
136
+ SiSU_AO::Source.new(@opt,opt_lang_trn_fn,:po4a).get # ao file drawn here
137
+ opt_lang_src_fn=(fn =~/\S+?~\S{2}(?:_\S{2})?\.ss[mti]/) \
138
+ ? (fn.gsub(/(\S+?)~\S{2}(?:_\S{2})?(\.ss[mti])/,'\1\2')) #check i
139
+ : fn
140
+ transdir,srcdir=Dir.pwd,Dir.pwd
141
+ if Dir.pwd.to_s =~/\/#{@lang_regx}$/
142
+ transdir=Dir.pwd
143
+ srcdir=transdir.
144
+ gsub(/\/#{@lang_regx}$/,
145
+ "/#{@opt.lng_base}")
146
+ if FileTest.directory?(srcdir)
147
+ Dir.chdir(srcdir)
148
+ end
149
+ else nil
150
+ end
151
+ if FileTest.file?("#{srcdir}/#{opt_lang_src_fn}")
152
+ @ao_arr_lang_src=
153
+ SiSU_AO::Source.new(
154
+ @@opt_src,
155
+ opt_lang_src_fn,
156
+ :po4a
157
+ ).get # ao file drawn here
158
+ else
159
+ puts "no identified source document"
160
+ exit
161
+ end
162
+ Dir.chdir(transdir) if transdir
163
+ else
164
+ @ao_arr_lang_src=
165
+ SiSU_AO::Source.new(
166
+ @opt,
167
+ fn,
168
+ :po4a
169
+ ).get # ao file drawn here
170
+ @ao_arr_lang_trans=nil
171
+ end
172
+ SiSU_Po4a::Source::Scroll.new(
173
+ fn,
174
+ @ao_arr_lang_src,
175
+ @ao_arr_lang_trans,
176
+ @@md_src,
177
+ @@md_trn,
178
+ wrap_width
179
+ ).songsheet
180
+ end
181
+ def read
182
+ begin
183
+ src={}
184
+ src[:pth]=@opt.f_pth[:pth]
185
+ src[:files]=if @opt.fns =~ /\.(?:(?:-|ssm\.)sst|ssm)$/
186
+ @opt.fns=@opt.fns.gsub(/\.ssm\.sst$/,'.ssm')
187
+ SiSU_Assemble::CompositeFileList.new(@opt).read
188
+ else
189
+ [@opt.fns]
190
+ end
191
+ md=SiSU_Param::Parameters.new(@opt).get
192
+ env=SiSU_Env::InfoEnv.new(@opt.fns)
193
+ file=SiSU_Env::FileOp.new(md)
194
+ Po4aCfg.new(@opt,file).po4a_cfg
195
+ wrap_width=wrap_width_set(md,env)
196
+ src[:files].each do |fn|
197
+ process_file(md,env,file,wrap_width,fn)
198
+ end
199
+ rescue
200
+ SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do
201
+ __LINE__.to_s + ':' + __FILE__
202
+ end
203
+ ensure
204
+ end
205
+ end
206
+ private
207
+ class Scroll <Source
208
+ include SiSU_Po4aUtils
209
+ @@endnotes={ para: [], end: [] }
210
+ def initialize(fn,data_src,data_trn,md_src,md_trn,wrap_width)
211
+ @fn,@data_src,@data_trn,@md_src,@md_trn,@wrap_width=
212
+ fn, data_src, data_trn, md_src, md_trn, wrap_width
213
+ @md=(md_trn.nil?) \
214
+ ? md_src
215
+ : md_trn
216
+ @tab="\t"
217
+ @@endnotes_=(@md.opt.selections.str =~/--endnote/) \
218
+ ? true
219
+ : false # --footnote
220
+ @pot={
221
+ body: [],
222
+ open: [],
223
+ close: [],
224
+ head: [],
225
+ metadata: [],
226
+ tail: []
227
+ }
228
+ end
229
+ def br
230
+ (@md.opt.selections.str =~/--dos/) ? "\r\n" : "\n" # --unix
231
+ end
232
+ def songsheet
233
+ fn=@fn
234
+ pot=pot_markup(@data_src,@data_trn)
235
+ publish(fn,pot)
236
+ end
237
+ def pot_structure_wrap(desc,orig,trans,indent=0,hang=0)
238
+ SiSU_Po4aUtils::Wrap.new(
239
+ @md,
240
+ orig,
241
+ trans,
242
+ desc,
243
+ @wrap_width,
244
+ indent,
245
+ hang
246
+ )
247
+ end
248
+ def wrap_endnotes(orig_notes='',trn_notes='')
249
+ nt=@@endnotes_ ? 'endnote' : 'footnote'
250
+ @fn=0
251
+ a_l=orig_notes.length
252
+ 0.upto(a_l-1) do |i|
253
+ @fn=if orig_notes[i].to_s =~/^\^~([\d*+]+)/ # provides endnote number within paragraph
254
+ @fn += 1
255
+ else @fn
256
+ end
257
+ d="#{nt} #{@fn}"
258
+ mark="^~ "
259
+ instruct=s_mark=''
260
+ if @md.opt.act[:maintenance][:set]==:on
261
+ instruct=%{\n# footnotes, the preferred sisu markup for a footnote is~{this is a footnote}~ } \
262
+ + %{however, for translation a footnote reference marker in the text~^ } \
263
+ + %{with a set of notes following the paragraph starting on a newline with "^~ this is a footnote", } \
264
+ + %{is easier to deal with, if possible these should be converted back to~{inline notes}~}
265
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
266
+ end
267
+ desc="#{d}#{s_mark}#{instruct}"
268
+ orig=(orig_notes[i].to_s =~/^\^~[\d*+]+/) \
269
+ ? (orig_notes[i].to_s.gsub(/^\^~[\d*+]+/,'^~'))
270
+ : orig_notes[i].to_s
271
+ trans=if trn_notes.is_a?(Array) \
272
+ and trn_notes.length==orig_notes.length
273
+ (trn_notes[i].to_s =~/^\^~[\d*+]+/) \
274
+ ? (trn_notes[i].to_s.gsub(/^\^~[\d*+]+/,'^~'))
275
+ : trn_notes[i].to_s
276
+ else ''
277
+ end
278
+ util=pot_structure_wrap(desc,orig,trans)
279
+ wrap=util.line_wrap
280
+ wrap=if wrap =~ /^\s*\^~[\d*+]+\s+.+?\s*\Z/m
281
+ wrap.gsub(/^\s*(\^~[\d*+]+)\s+(.+?)\s*\Z/m, <<GSUB
282
+ \\1 \\2
283
+ GSUB
284
+ )
285
+ else
286
+ wrap.gsub(/^(.+)\Z/m, <<GSUB
287
+ \\1
288
+ GSUB
289
+ )
290
+ end
291
+ @@endnotes[:para] << wrap
292
+ @@endnotes[:end] << '' << wrap
293
+ end
294
+ @@endnotes[:para].each {|e| @pot[:body] << e << br}
295
+ @@endnotes[:para]=[]
296
+ @@endnotes
297
+ end
298
+ def pot_metadata_src
299
+ @po4a_identify_type='type: SiSU doc' #'type: Plain text'
300
+ meta_src=SiSU_Metadata::Summary.new(@md_src)
301
+ w=[]
302
+ w << [
303
+ "#. #{@po4a_identify_type} - metadata: title",
304
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
305
+ 'msgid ""',
306
+ meta_src.metadata_tags.title.main,
307
+ meta_src.metadata_tags.title.sub,
308
+ meta_src.metadata_tags.title.edition,
309
+ meta_src.metadata_tags.title.note,
310
+ meta_src.metadata_tags.title.short,
311
+ meta_src.metadata_tags.title.language,
312
+ meta_src.metadata_tags.title.language_char,
313
+ 'msgstr ""',
314
+ ]
315
+ w << [
316
+ "#. #{@po4a_identify_type} - metadata: creator",
317
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
318
+ 'msgid ""',
319
+ meta_src.metadata_tags.creator.head,
320
+ meta_src.metadata_tags.creator.author,
321
+ meta_src.metadata_tags.creator.contributor,
322
+ meta_src.metadata_tags.creator.illustrator,
323
+ meta_src.metadata_tags.creator.photographer,
324
+ meta_src.metadata_tags.creator.translator,
325
+ meta_src.metadata_tags.creator.audio,
326
+ meta_src.metadata_tags.creator.digitized_by,
327
+ meta_src.metadata_tags.creator.prepared_by,
328
+ 'msgstr ""',
329
+ ]
330
+ w << [
331
+ "#. #{@po4a_identify_type} - metadata: rights",
332
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
333
+ 'msgid ""',
334
+ meta_src.metadata_tags.rights.head,
335
+ meta_src.metadata_tags.rights.copyright.text,
336
+ meta_src.metadata_tags.rights.copyright.translation,
337
+ meta_src.metadata_tags.rights.copyright.illustrations,
338
+ meta_src.metadata_tags.rights.copyright.photographs,
339
+ meta_src.metadata_tags.rights.copyright.digitization,
340
+ meta_src.metadata_tags.rights.copyright.audio,
341
+ meta_src.metadata_tags.rights.license,
342
+ 'msgstr ""',
343
+ ]
344
+ w << [
345
+ "#. #{@po4a_identify_type} - metadata: classify",
346
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
347
+ 'msgid ""',
348
+ meta_src.metadata_tags.classify.head,
349
+ meta_src.metadata_tags.classify.subject,
350
+ meta_src.metadata_tags.classify.topic_register,
351
+ meta_src.metadata_tags.classify.loc,
352
+ meta_src.metadata_tags.classify.dewey,
353
+ #meta_src.metadata_tags.notes.relation,
354
+ #meta_src.metadata_tags.notes.type,
355
+ #meta_src.metadata_tags.identifier.oclc,
356
+ #meta_src.metadata_tags.identifier.isbn,
357
+ 'msgstr ""',
358
+ ]
359
+ w << [
360
+ "#. #{@po4a_identify_type} - metadata: date",
361
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
362
+ 'msgid ""',
363
+ meta_src.metadata_tags.date.head,
364
+ meta_src.metadata_tags.date.added_to_site,
365
+ meta_src.metadata_tags.date.available,
366
+ meta_src.metadata_tags.date.created,
367
+ meta_src.metadata_tags.date.issued,
368
+ meta_src.metadata_tags.date.modified,
369
+ meta_src.metadata_tags.date.published,
370
+ meta_src.metadata_tags.date.valid,
371
+ 'msgstr ""',
372
+ ]
373
+ w << [
374
+ "#. #{@po4a_identify_type} - processing, make instruction",
375
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
376
+ 'msgid ""',
377
+ meta_src.processing_tags.make.language,
378
+ meta_src.processing_tags.make.headings,
379
+ meta_src.processing_tags.make.num_top,
380
+ meta_src.processing_tags.make.breaks,
381
+ meta_src.processing_tags.make.emphasis,
382
+ meta_src.processing_tags.make.bold,
383
+ meta_src.processing_tags.make.italics,
384
+ meta_src.processing_tags.make.texpdf_font,
385
+ 'msgstr ""',
386
+ ]
387
+ w.each do |y|
388
+ z=''
389
+ y.each do |x|
390
+ if x
391
+ z += x + "\n" if x =~/^#|^msg(?:id|str)/
392
+ z += %{"#{x}"\n} if x =~/^@\S+?:(?: |$)/
393
+ z += %{"#{x}"\n} if x =~/^\s+:\S+?: /
394
+ end
395
+ end
396
+ @pot[:metadata] << z << br
397
+ #puts z unless z.empty?
398
+ end
399
+ end
400
+ def pot_metadata_src_trn
401
+ @po4a_identify_type='type: SiSU doc'
402
+ #@po4a_identify_type='type: Plain text'
403
+ meta_src=SiSU_Metadata::Summary.new(@md_src)
404
+ meta_trn=SiSU_Metadata::Summary.new(@md_trn)
405
+ w=[]
406
+ w << [
407
+ "#. #{@po4a_identify_type} - metadata: title",
408
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
409
+ 'msgid ""',
410
+ meta_src.metadata_tags.title.main,
411
+ meta_src.metadata_tags.title.sub,
412
+ meta_src.metadata_tags.title.edition,
413
+ meta_src.metadata_tags.title.note,
414
+ meta_src.metadata_tags.title.short,
415
+ meta_src.metadata_tags.title.language,
416
+ meta_src.metadata_tags.title.language_char,
417
+ 'msgstr ""',
418
+ meta_trn.metadata_tags.title.main,
419
+ meta_trn.metadata_tags.title.sub,
420
+ meta_trn.metadata_tags.title.edition,
421
+ meta_trn.metadata_tags.title.note,
422
+ meta_trn.metadata_tags.title.short,
423
+ meta_trn.metadata_tags.title.language,
424
+ meta_trn.metadata_tags.title.language_char,
425
+ ]
426
+ w << [
427
+ "#. #{@po4a_identify_type} - metadata: creator",
428
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
429
+ 'msgid ""',
430
+ meta_src.metadata_tags.creator.head,
431
+ meta_src.metadata_tags.creator.author,
432
+ meta_src.metadata_tags.creator.contributor,
433
+ meta_src.metadata_tags.creator.illustrator,
434
+ meta_src.metadata_tags.creator.photographer,
435
+ meta_src.metadata_tags.creator.translator,
436
+ meta_src.metadata_tags.creator.audio,
437
+ meta_src.metadata_tags.creator.digitized_by,
438
+ meta_src.metadata_tags.creator.prepared_by,
439
+ 'msgstr ""',
440
+ meta_trn.metadata_tags.creator.head,
441
+ meta_trn.metadata_tags.creator.author,
442
+ meta_trn.metadata_tags.creator.contributor,
443
+ meta_trn.metadata_tags.creator.illustrator,
444
+ meta_trn.metadata_tags.creator.photographer,
445
+ meta_trn.metadata_tags.creator.translator,
446
+ meta_trn.metadata_tags.creator.audio,
447
+ meta_trn.metadata_tags.creator.digitized_by,
448
+ meta_trn.metadata_tags.creator.prepared_by,
449
+ ]
450
+ w << [
451
+ "#. #{@po4a_identify_type} - metadata: rights",
452
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
453
+ 'msgid ""',
454
+ meta_src.metadata_tags.rights.head,
455
+ meta_src.metadata_tags.rights.copyright.text,
456
+ meta_src.metadata_tags.rights.copyright.translation,
457
+ meta_src.metadata_tags.rights.copyright.illustrations,
458
+ meta_src.metadata_tags.rights.copyright.photographs,
459
+ meta_src.metadata_tags.rights.copyright.digitization,
460
+ meta_src.metadata_tags.rights.copyright.audio,
461
+ meta_src.metadata_tags.rights.license,
462
+ 'msgstr ""',
463
+ meta_trn.metadata_tags.rights.head,
464
+ meta_trn.metadata_tags.rights.copyright.text,
465
+ meta_trn.metadata_tags.rights.copyright.translation,
466
+ meta_trn.metadata_tags.rights.copyright.illustrations,
467
+ meta_trn.metadata_tags.rights.copyright.photographs,
468
+ meta_trn.metadata_tags.rights.copyright.digitization,
469
+ meta_trn.metadata_tags.rights.copyright.audio,
470
+ meta_trn.metadata_tags.rights.license,
471
+ ]
472
+ w << [
473
+ "#. #{@po4a_identify_type} - metadata: classify",
474
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
475
+ 'msgid ""',
476
+ meta_src.metadata_tags.classify.head,
477
+ meta_src.metadata_tags.classify.subject,
478
+ meta_src.metadata_tags.classify.topic_register,
479
+ meta_src.metadata_tags.classify.loc,
480
+ meta_src.metadata_tags.classify.dewey,
481
+ #meta_src.metadata_tags.notes.relation,
482
+ #meta_src.metadata_tags.notes.type,
483
+ #meta_src.metadata_tags.identifier.oclc,
484
+ #meta_src.metadata_tags.identifier.isbn,
485
+ 'msgstr ""',
486
+ meta_trn.metadata_tags.classify.head,
487
+ meta_trn.metadata_tags.classify.subject,
488
+ meta_trn.metadata_tags.classify.topic_register,
489
+ meta_trn.metadata_tags.classify.loc,
490
+ meta_trn.metadata_tags.classify.dewey,
491
+ #meta_trn.metadata_tags.notes.relation,
492
+ #meta_trn.metadata_tags.notes.type,
493
+ #meta_trn.metadata_tags.identifier.oclc,
494
+ #meta_trn.metadata_tags.identifier.isbn,
495
+ ]
496
+ w << [
497
+ "#. #{@po4a_identify_type} - metadata: date",
498
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
499
+ 'msgid ""',
500
+ meta_src.metadata_tags.date.head,
501
+ meta_src.metadata_tags.date.added_to_site,
502
+ meta_src.metadata_tags.date.available,
503
+ meta_src.metadata_tags.date.created,
504
+ meta_src.metadata_tags.date.issued,
505
+ meta_src.metadata_tags.date.modified,
506
+ meta_src.metadata_tags.date.published,
507
+ meta_src.metadata_tags.date.valid,
508
+ 'msgstr ""',
509
+ meta_trn.metadata_tags.date.head,
510
+ meta_trn.metadata_tags.date.added_to_site,
511
+ meta_trn.metadata_tags.date.available,
512
+ meta_trn.metadata_tags.date.created,
513
+ meta_trn.metadata_tags.date.issued,
514
+ meta_trn.metadata_tags.date.modified,
515
+ meta_trn.metadata_tags.date.published,
516
+ meta_trn.metadata_tags.date.valid,
517
+ ]
518
+ w << [
519
+ "#. #{@po4a_identify_type} - processing, make instruction",
520
+ "#: en/#{@md.fns}:#{SiSU_Po4aUtils::PotNumber.new.num}",
521
+ 'msgid ""',
522
+ meta_src.processing_tags.make.language,
523
+ meta_src.processing_tags.make.headings,
524
+ meta_src.processing_tags.make.num_top,
525
+ meta_src.processing_tags.make.breaks,
526
+ meta_src.processing_tags.make.emphasis,
527
+ meta_src.processing_tags.make.bold,
528
+ meta_src.processing_tags.make.italics,
529
+ meta_src.processing_tags.make.texpdf_font,
530
+ 'msgstr ""',
531
+ meta_trn.processing_tags.make.language,
532
+ meta_trn.processing_tags.make.headings,
533
+ meta_trn.processing_tags.make.num_top,
534
+ meta_trn.processing_tags.make.breaks,
535
+ meta_trn.processing_tags.make.emphasis,
536
+ meta_trn.processing_tags.make.bold,
537
+ meta_trn.processing_tags.make.italics,
538
+ meta_trn.processing_tags.make.texpdf_font,
539
+ ]
540
+ w.each do |y|
541
+ z=''
542
+ y.each do |x|
543
+ if x
544
+ z += x + "\n" if x =~/^#|^msg(?:id|str)/
545
+ z += %{"#{x}"\n} if x =~/^@\S+?:(?: |$)/
546
+ z += %{"#{x}"\n} if x =~/^\s+:\S+?: /
547
+ end
548
+ end
549
+ @pot[:metadata] << z << br
550
+ #puts z unless z.empty?
551
+ end
552
+ end
553
+ def auto_translate?(set_to=nil)
554
+ @@auto_translation_=
555
+ if @md.opt.act[:po4a_lang_trans][:set]==:on
556
+ set_to \
557
+ ? set_to
558
+ : @@auto_translation_
559
+ else :skip
560
+ end
561
+ end
562
+ def auto_translation(src_txt,markup=:src) # check for an appropriate request flag
563
+ auto_translate?(:skip)
564
+ begin
565
+ src_txt_clean=clean_text(src_txt,markup)
566
+ src_txt_clean=src_txt_clean.
567
+ gsub(/\n/,' ').
568
+ gsub(/"/,'\"').
569
+ gsub(/([()])/,'\\\\\1')
570
+ trans=''
571
+ unless auto_translate? == :skip
572
+ require 'timeout'
573
+ Timeout::timeout(60) {
574
+ trans=`trans -b -no-ansi en:#{@md.opt.f_pth[:lng_is]} #{src_txt_clean}`.strip
575
+ unless trans.empty?
576
+ trans + ' {[G.Tr]}http://translate.google.com'
577
+ end
578
+ }
579
+ end
580
+ trans
581
+ rescue
582
+ auto_translate?(:skip)
583
+ p 'timeout issues with translation, skip remaining'
584
+ end
585
+ end
586
+ def pot_structure
587
+ def heading(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
588
+ lv=n=n3=nil
589
+ lv=dob_src.ln
590
+ n=lv - 1
591
+ n3=lv + 2
592
+ util=nil
593
+ fn=(dob_src.name=~/[a-z\d]/i) ? dob_src.name : ''
594
+ mark="#{dob_src.lv}~#{fn} "
595
+ d="#{dob_src.is.to_s} (level #{dob_src.lv})"
596
+ instruct=s_mark=''
597
+ if @md.opt.act[:maintenance][:set]==:on
598
+ instruct=%{\n# markup for headings is marker at the start of the line/object, } \
599
+ + %{indicating the heading level, and if provided an associated name tag, } \
600
+ + %{this heading is "#{mark}"}
601
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
602
+ end
603
+ desc="#{d}#{s_mark}#{instruct}"
604
+ orig="#{s_mark}#{dob_src.obj}"
605
+ trans=((dob_trn=='') \
606
+ || (dob_src.obj == dob_trn.obj)) \
607
+ ? ''
608
+ : "#{s_mark}#{dob_trn.obj}"
609
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
610
+ and trans.empty? \
611
+ and auto_translate?
612
+ trans=auto_translation(dob_src.obj,:src)
613
+ end
614
+ util=pot_structure_wrap(desc,orig,trans)
615
+ wrapped=util.line_wrap
616
+ @pot[:body] << wrapped << br # main text, contents, body KEEP
617
+ if @@endnotes[:para] \
618
+ and notes_s.length > 0 \
619
+ and not @@endnotes_
620
+ @pot[:body] << br
621
+ wrap_endnotes(notes_s,notes_t)
622
+ elsif @@endnotes[:para] \
623
+ and @@endnotes_
624
+ @pot[:body] << br*2
625
+ end
626
+ end
627
+ def para(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
628
+ util=nil
629
+ wrapped=if dob_src.indent =~/[1-9]/ \
630
+ and dob_src.indent == dob_src.hang
631
+ s_mark=desc=orig=trans=''
632
+ if dob_src.bullet_
633
+ mark="_#{dob_src.indent}* "
634
+ d="#{dob_src.is.to_s}: indent #{dob_src.indent}, bullet"
635
+ instruct=s_mark=''
636
+ if @md.opt.act[:maintenance][:set]==:on
637
+ instruct=%{\n# markup for indented bullet text is at the start of the line/object, } \
638
+ + %{an underscore followed by the indent level and an asterisk "#{mark}"}
639
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
640
+ end
641
+ desc="#{d}#{s_mark}#{instruct}"
642
+ else
643
+ mark="_#{dob_src.indent} "
644
+ d="#{dob_src.is.to_s}: indent #{dob_src.indent}"
645
+ instruct=s_mark=''
646
+ if @md.opt.act[:maintenance][:set]==:on
647
+ instruct=%{\n# markup for indented text is at the start of the line/object, } \
648
+ + %{an underscore followed by the indent level "#{mark}"}
649
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
650
+ end
651
+ desc="#{d}#{s_mark}#{instruct}"
652
+ end
653
+ orig="#{s_mark}#{dob_src.obj}"
654
+ trans=((dob_trn=='') \
655
+ || (dob_src.obj == dob_trn.obj)) \
656
+ ? ''
657
+ : "#{s_mark}#{dob_trn.obj}"
658
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
659
+ and trans.empty? \
660
+ and auto_translate?
661
+ trans=auto_translation(dob_src.obj,:src)
662
+ end
663
+ util=pot_structure_wrap(desc,orig,trans)
664
+ elsif dob_src.hang =~/[0-9]/ \
665
+ and dob_src.indent != dob_src.hang
666
+ s_mark=desc=orig=trans=''
667
+ mark="_#{dob_src.hang}_#{dob_src.indent} "
668
+ d="#{dob_src.is.to_s}: hang #{dob_src.hang} indent #{dob_src.indent}"
669
+ instruct=s_mark=''
670
+ if @md.opt.act[:maintenance][:set]==:on
671
+ instruct=%{\n# markup for indented text with a first line indented } \
672
+ + %{to a different level from the rest of the paragraph, } \
673
+ + %{is at the start of the line/object, } \
674
+ + %{an underscore and the first indent level } \
675
+ + %{a second underscore and the indent level for the rest of the paragraph, "#{mark1}"}
676
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
677
+ end
678
+ desc="#{d}#{s_mark}#{instruct}"
679
+ orig="#{s_mark}#{dob_src.obj}"
680
+ trans=((dob_trn=='') \
681
+ || (dob_src.obj == dob_trn.obj)) \
682
+ ? ''
683
+ : "#{s_mark}#{dob_trn.obj}"
684
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
685
+ and trans.empty? \
686
+ and auto_translate?
687
+ trans=auto_translation(dob_src.obj,:src)
688
+ end
689
+ util=pot_structure_wrap(desc,orig,trans)
690
+ else
691
+ s_mark=desc=orig=trans=''
692
+ if dob_src.bullet_
693
+ mark='_* '
694
+ d="#{dob_src.is.to_s}: bullet"
695
+ instruct=s_mark=''
696
+ if @md.opt.act[:maintenance][:set]==:on
697
+ instruct=%{\n# markup for indented text is at the start of the line/object, } \
698
+ + %{an underscore followed by an asterisk "#{mark}"}
699
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
700
+ end
701
+ desc="#{d}#{s_mark}#{instruct}"
702
+ orig="#{s_mark}#{dob_src.obj}"
703
+ trans=((dob_trn=='') \
704
+ || (dob_src.obj == dob_trn.obj)) \
705
+ ? ''
706
+ : "#{s_mark}#{dob_trn.obj}"
707
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
708
+ and trans.empty? \
709
+ and auto_translate?
710
+ trans=auto_translation(dob_src.obj,:src)
711
+ end
712
+ else
713
+ mark=''
714
+ d=dob_src.is.to_s
715
+ instruct=%{\n# regular paragraph, no special markup}
716
+ if @md.opt.act[:maintenance][:set]==:on
717
+ instruct="\n# "
718
+ s_mark="\n# " + %{"\\n\\n#{mark}...\\n\\n"}
719
+ end
720
+ desc="#{d}#{s_mark}#{instruct}"
721
+ orig=dob_src.obj
722
+ trans=((dob_trn=='') \
723
+ || (dob_src.obj == dob_trn.obj)) \
724
+ ? ''
725
+ : "#{s_mark}#{dob_trn.obj}"
726
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
727
+ and trans.empty? \
728
+ and auto_translate?
729
+ trans=auto_translation(dob_src.obj,:src)
730
+ end
731
+ end
732
+ util=pot_structure_wrap(desc,orig,trans)
733
+ end
734
+ wrapped=util.line_wrap
735
+ @pot[:body] << wrapped << br # main text, contents, body KEEP
736
+ if @@endnotes[:para] \
737
+ and notes_s.length > 0 \
738
+ and not @@endnotes_
739
+ @pot[:body] << br
740
+ wrap_endnotes(notes_s,notes_t)
741
+ elsif @@endnotes[:para] \
742
+ and @@endnotes_
743
+ @pot[:body] << br*2
744
+ end
745
+ end
746
+ def block(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
747
+ mark="block{\\n\\n...\\n\\n}block"
748
+ d=dob_src.is.to_s
749
+ instruct=s_mark=''
750
+ if @md.opt.act[:maintenance][:set]==:on
751
+ instruct=%{\n# block text is a text block with an opening and closing marker, } \
752
+ + %{the content of which may be wrapped}
753
+ s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
754
+ end
755
+ desc="#{d}#{s_mark}#{instruct}"
756
+ orig=dob_src.obj
757
+ trans=((dob_trn=='') \
758
+ || (dob_src.obj == dob_trn.obj)) \
759
+ ? ''
760
+ : "#{s_mark}#{dob_trn.obj}"
761
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
762
+ and trans.empty? \
763
+ and auto_translate?
764
+ trans=auto_translation(dob_src.obj,:src)
765
+ end
766
+ util=pot_structure_wrap(desc,orig,trans)
767
+ unwrapped=util.no_line_wrap_block
768
+ @pot[:body] << unwrapped << br
769
+ end
770
+ def group(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
771
+ mark="group{\\n\\n...\\n\\n}group"
772
+ d=dob_src.is.to_s
773
+ instruct=s_mark=''
774
+ if @md.opt.act[:maintenance][:set]==:on
775
+ instruct=%{\n# group text is a text block with an opening and closing marker, } \
776
+ + %{the content of which may be wrapped}
777
+ s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
778
+ end
779
+ desc="#{d}#{s_mark}#{instruct}"
780
+ orig=dob_src.obj
781
+ trans=((dob_trn=='') \
782
+ || (dob_src.obj == dob_trn.obj)) \
783
+ ? ''
784
+ : "#{s_mark}#{dob_trn.obj}"
785
+ if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
786
+ and trans.empty? \
787
+ and auto_translate?
788
+ trans=auto_translation(dob_src.obj,:src)
789
+ end
790
+ util=pot_structure_wrap(desc,orig,trans)
791
+ unwrapped=util.no_line_wrap_block
792
+ @pot[:body] << unwrapped << br
793
+ end
794
+ def verse(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
795
+ mark="poem{\n\nverse\n\nverse\n\n...\n\n}poem"
796
+ d=dob_src.is.to_s
797
+ instruct=s_mark=''
798
+ if @md.opt.act[:maintenance][:set]==:on
799
+ instruct=%{\n# verse are part of the text block described as a poem, } \
800
+ + %{the first verse is preceeded by an opening marker, } \
801
+ + %{and the last verse by a closing marker, } \
802
+ + %{the content of which should remain unwrapped}
803
+ s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
804
+ end
805
+ desc="#{d}#{s_mark}#{instruct}"
806
+ orig=dob_src.obj
807
+ trans=(dob_trn=='') ? '' : dob_trn.obj
808
+ util=pot_structure_wrap(desc,orig,trans)
809
+ unwrapped=util.no_line_wrap_block
810
+ @pot[:body] << unwrapped << br
811
+ end
812
+ def code(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
813
+ mark="code{\\n\\n...\\n\\n}code"
814
+ d=dob_src.is.to_s
815
+ instruct=s_mark=''
816
+ if @md.opt.act[:maintenance][:set]==:on
817
+ instruct=%{\n# codeblocks are a text block with an opening and closing marker, } \
818
+ + %{the content of which should remain unwrapped}
819
+ s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
820
+ end
821
+ desc="#{d}#{s_mark}#{instruct}"
822
+ orig=dob_src.obj
823
+ trans=(dob_trn=='') ? '' : dob_trn.obj
824
+ util=pot_structure_wrap(desc,orig,trans)
825
+ unwrapped=util.no_line_wrap_block
826
+ @pot[:body] << unwrapped << br
827
+ end
828
+ def table(dob_src='',notes_s='',dob_trn='',notes_t='') #% used to extract the structure of a document
829
+ mark="table{\\n\\n...\\n\\n}table"
830
+ d=dob_src.is.to_s
831
+ instruct=s_mark=''
832
+ if @md.opt.act[:maintenance][:set]==:on
833
+ instruct=%{\n# tables are a text block with an opening and closing marker, } \
834
+ + %{the content of which should remain unwrapped}
835
+ s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
836
+ end
837
+ desc="#{d}#{s_mark}#{instruct}"
838
+ orig=dob_src.obj
839
+ orig=orig.gsub(/#{Mx[:tc_c]}/,"\n")
840
+ trans=(dob_trn=='') ? '' : dob_trn.obj
841
+ trans=trans.gsub(/#{Mx[:tc_c]}/,"\n")
842
+ util=pot_structure_wrap(desc,orig,trans)
843
+ unwrapped=util.no_line_wrap_block
844
+ @pot[:body] << unwrapped << br
845
+ end
846
+ def idx_markup(idx)
847
+ struct=['={']
848
+ idx.sort.each do |x|
849
+ x.each_with_index do |y,i0|
850
+ case y
851
+ when String
852
+ struct << ';' unless struct[-1] =~/=\{/
853
+ struct << y
854
+ if x[i0+1].class == Hash \
855
+ and x[i0+1][:sub].length > 0
856
+ struct << ':'
857
+ end
858
+ when Hash
859
+ if y[:plus].to_i > 0
860
+ struct << '+' + y[:plus].to_s
861
+ end
862
+ if y[:sub].length > 0
863
+ y[:sub].each_with_index do |z,i1|
864
+ z.each_with_index do |a,i2|
865
+ #p a
866
+ if z.length > 0
867
+ struct << a[0]
868
+ if a[1][:plus].to_i > 0
869
+ struct << '+' + a[1][:plus].to_s
870
+ end
871
+ if (i1 + 1) < y[:sub].length
872
+ struct << '|'
873
+ end
874
+ end
875
+ end
876
+ end
877
+ end
878
+ end
879
+ end
880
+ end
881
+ struct << '}'
882
+ #puts struct.join
883
+ struct.join
884
+ end
885
+ def idx(dob_src='',dob_trn='') #% used for book index but broken as original markup lost, already abstracted, fix
886
+ mark="={ ... }"
887
+ instruct=s_mark=''
888
+ if @md.opt.act[:maintenance][:set]==:on
889
+ instruct=%{\n# the book index should be attached unwrapped to the preceding text block } \
890
+ + %{(there should be a new line, but no empty line)}
891
+ s_mark="\n# " + %{"\\n#{mark}\\n\\n"}
892
+ end
893
+ d='book-idx'
894
+ desc="#{d}#{s_mark}#{instruct}"
895
+ orig=pot_structure.idx_markup(dob_src.idx) #'={' + dob_src.idx + '}'
896
+ trans=if defined? dob_trn.idx \
897
+ and not dob_trn.idx.nil? \
898
+ and not dob_trn.idx.empty?
899
+ pot_structure.idx_markup(dob_trn.idx) #'={' + dob_trn.idx + '}'
900
+ else ''
901
+ end
902
+ util=pot_structure_wrap(desc,orig,trans)
903
+ unwrapped=util.no_line_wrap_block
904
+ @pot[:body] << unwrapped << br
905
+ end
906
+ self
907
+ end
908
+ def pot_markup(data_src,data_trn)
909
+ #@endnotes,@copen,@pot_contents_close=Array.new(3){[]}
910
+ a_l=if data_trn
911
+ a_l=(data_src.length >= data_trn.length) \
912
+ ? data_src.length
913
+ : data_trn.length
914
+ else
915
+ data_src.length
916
+ end
917
+ s,t=0,0
918
+ if @md.fns =~ /\.(?:(?:-|ssm\.)?sst|ssm)$/
919
+ (data_trn.nil?) \
920
+ ? pot_metadata_src
921
+ : pot_metadata_src_trn
922
+ end
923
+ 0.upto(a_l-1) do |i|
924
+ if data_trn
925
+ unless data_src[s] \
926
+ and data_trn[t]
927
+ break
928
+ end
929
+ if data_src[s].of == :comment \
930
+ and data_trn[t].of == :comment \
931
+ and (data_src[s].is == data_trn[t].is)
932
+ s+=1;t+=1
933
+ next
934
+ end
935
+ if ((data_src[s].is == :comment) \
936
+ || (data_trn[t].is == :comment)) \
937
+ and (data_src[s].is != data_trn[t].is)
938
+ if data_src[s].is == :comment
939
+ if @md.opt.act[:maintenance][:set]==:on
940
+ puts "src (comment):\n\t" \
941
+ + data_src[s].obj
942
+ end
943
+ s+=1
944
+ #next if data_src[s].is == :comment
945
+ elsif data_trn[t].is == :comment
946
+ if @md.opt.act[:maintenance][:set]==:on
947
+ puts "trans (comment):\n\t" \
948
+ + data_trn[t].obj
949
+ end
950
+ t+=1
951
+ #next if data_trn[t].is == :comment
952
+ end
953
+ end
954
+ if ((defined? data_src[s].ocn) \
955
+ && (data_src[s].ocn.is_a?(Fixnum))) \
956
+ and ((defined? data_trn[t].ocn) \
957
+ && (data_trn[t].ocn.is_a?(Fixnum))) \
958
+ and (data_src[s].ocn == data_trn[t].ocn)
959
+ @m_s,@m_t=s,t
960
+ elsif ((defined? data_src[s].ocn) \
961
+ && (data_src[s].ocn.is_a?(Fixnum))) \
962
+ and ((defined? data_trn[t].ocn) \
963
+ && (data_trn[t].ocn.is_a?(Fixnum))) \
964
+ and (data_src[s].ocn != data_trn[t].ocn)
965
+ p '--- OCN ---'
966
+ p 'mis-match'
967
+ p data_src[s].ocn
968
+ p data_src[s].obj
969
+ p data_trn[t].ocn
970
+ p data_trn[t].obj
971
+ p '---'
972
+ p 'previous match'
973
+ p data_src[@m_s].ocn
974
+ p data_src[@m_s].obj
975
+ p data_trn[@m_t].ocn
976
+ p data_trn[@m_t].obj
977
+ exit
978
+ elsif (((defined? data_src[s].ocn) \
979
+ && (defined? data_trn[t].ocn)) \
980
+ and data_src[s].ocn.class != data_trn[t].ocn.class)
981
+ p '--- OCN class ---'
982
+ p 'mis-match'
983
+ p data_src[s].ocn if defined? data_src[s].ocn
984
+ p data_src[s].obj
985
+ p data_trn[t].ocn if defined? data_trn[t].ocn
986
+ p data_trn[t].obj
987
+ #p '---'
988
+ #p 'previous match'
989
+ #p data_src[@m_s].ocn
990
+ #p data_src[@m_s].obj
991
+ #p data_trn[@m_t].ocn
992
+ #p data_trn[@m_t].obj
993
+ #elsif (defined? data_src[s].ocn != defined? data_trn[t].ocn) \
994
+ #and (data_src[s].ocn.nil? != data_trn[t].ocn.nil?)
995
+ # p '--- missing OCN? ---'
996
+ # p 'mis-match'
997
+ # p data_src[s].ocn if defined? data_src[s].ocn
998
+ # p data_src[s].obj
999
+ # p data_trn[t].ocn if defined? data_trn[t].ocn
1000
+ # p data_trn[t].obj
1001
+ else
1002
+ end
1003
+ end
1004
+ notes_s,notes_t='',''
1005
+ data_src[s],notes_s=markup(data_src[s])
1006
+ if data_trn
1007
+ data_trn[t],notes_t=markup(data_trn[t])
1008
+ #data_src[s],data_trn[t]=pot_data(data_src[s],notes_s,data_trn[t],notes_t)
1009
+ pot_data(data_src[s],notes_s,data_trn[t],notes_t)
1010
+ else
1011
+ #data_src[s],nul=pot_data(data_src[s],notes_s)
1012
+ pot_data(data_src[s],notes_s)
1013
+ end
1014
+ s+=1;t+=1
1015
+ end
1016
+ @pot #watch
1017
+ end
1018
+ def pot_data(dob_src='',notes_s='',dob_trn='',notes_t='')
1019
+ if dob_src.obj !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/
1020
+ if defined? dob_src.ocn \
1021
+ and dob_src.ocn.to_s =~/\d+/
1022
+ paranum=dob_src.ocn.to_s
1023
+ @p_num=SiSU_Po4aUtils::ParagraphNumber.new(paranum)
1024
+ end
1025
+ case dob_src.is
1026
+ when :heading
1027
+ pot_structure.heading(dob_src,notes_s,dob_trn,notes_t)
1028
+ when :para
1029
+ pot_structure.para(dob_src,notes_s,dob_trn,notes_t)
1030
+ when :group
1031
+ pot_structure.group(dob_src,notes_s,dob_trn,notes_t)
1032
+ when :block
1033
+ pot_structure.block(dob_src,notes_s,dob_trn,notes_t)
1034
+ when :verse
1035
+ pot_structure.verse(dob_src,notes_s,dob_trn,notes_t)
1036
+ when :code
1037
+ pot_structure.code(dob_src,notes_s,dob_trn,notes_t)
1038
+ when :table
1039
+ pot_structure.table(dob_src,notes_s,dob_trn,notes_t)
1040
+ end
1041
+ if defined? dob_src.idx \
1042
+ and not dob_src.idx.nil? \
1043
+ and not dob_src.idx.empty?
1044
+ pot_structure.idx(dob_src,dob_trn)
1045
+ end
1046
+ dob_src='' if (dob_src.obj =~/<a name="n\d+">/ \
1047
+ and dob_src.obj =~/^(-\{{2}~\d+|<!e[:_]\d+!>)/) # -endnote
1048
+ if dob_src ## Clean Prepared Text
1049
+ dob_src.obj=dob_src.obj.gsub(/<!.+!>/,' ').
1050
+ gsub(/<:\S+>/,' ') if dob_src ## Clean Prepared Text
1051
+ end
1052
+ end
1053
+ #[dob_src,dob_trn]
1054
+ end
1055
+ def markup(dob)
1056
+ dob,notes=objects.textface_marks_po4a(dob,:separate)
1057
+ [dob,notes]
1058
+ end
1059
+ def publish(fn,pot)
1060
+ content=[]
1061
+ content << pot[:open]
1062
+ content << pot[:head]
1063
+ content << pot[:metadata]
1064
+ content << pot[:body]
1065
+ content << @@endnotes[:end] if @@endnotes_
1066
+ Output.new(fn,content,@md,@process).po4a
1067
+ @@endnotes={ para: [], end: [] }
1068
+ end
1069
+ end
1070
+ class Po4aCfg
1071
+ include SiSU_Composite_Doc_Utils # composite doc, .ssm, extract all related insert files, array of filenames test
1072
+ def initialize(opt,file)
1073
+ @opt,@file=opt,file
1074
+ end
1075
+ def po4a_cfg_filename
1076
+ 'po4a.cfg'
1077
+ end
1078
+ def dir
1079
+ def pwd
1080
+ Dir.pwd
1081
+ end
1082
+ def po4a_
1083
+ 'po4a/' # ''
1084
+ end
1085
+ def pot
1086
+ po4a_ + 'pot'
1087
+ end
1088
+ def po
1089
+ po4a_ + 'po'
1090
+ end
1091
+ self
1092
+ end
1093
+ def po4a_cfg_file
1094
+ File.open("#{Dir.pwd}/#{po4a_cfg_filename}",'w')
1095
+ end
1096
+ def language
1097
+ def sisu_languages_available
1098
+ Px[:lng_lst]
1099
+ end
1100
+ def translation_languages_selected
1101
+ @opt.act[:po4a_lang_trans][:trn] \
1102
+ ? @opt.act[:po4a_lang_trans][:trn]
1103
+ : []
1104
+ end
1105
+ def translation_languages_selected_that_are_available
1106
+ translation_languages_selected & sisu_languages_available
1107
+ end
1108
+ def source_language_selected_str
1109
+ @opt.act[:po4a_lang_trans][:src] \
1110
+ ? @opt.act[:po4a_lang_trans][:src]
1111
+ : 'en'
1112
+ end
1113
+ def translation_languages_selected_that_are_available_str
1114
+ translation_languages_selected_that_are_available.join(' ')
1115
+ end
1116
+ def translation_languages_selected_str
1117
+ @opt.act[:po4a_lang_trans][:trn].join(' ')
1118
+ end
1119
+ self
1120
+ end
1121
+ def po4a_cfg
1122
+ doc_import_list=composite_and_imported_filenames_array(@opt.fno)
1123
+ po4a_cfg_arr=[]
1124
+ po4a_cfg_arr \
1125
+ << "[po4a_langs] #{language.translation_languages_selected_that_are_available_str}"
1126
+ po4a_cfg_arr \
1127
+ << "[po4a_paths] #{dir.pot}/$master.pot $lang:#{dir.po}/$lang/$master.po"
1128
+ doc_import_list.each do |file_src|
1129
+ file_src_fn=
1130
+ file_src.gsub(/#{language.source_language_selected_str}\//,'')
1131
+ po4a_cfg_arr \
1132
+ << "[type: text] #{file_src} $lang:$lang/#{file_src_fn}"
1133
+ end
1134
+ file=@file.write_file.po4a_cfg
1135
+ po4a_cfg_arr.each do |txt|
1136
+ puts txt
1137
+ file << txt << "\n"
1138
+ end
1139
+ file.close
1140
+ end
1141
+ end
1142
+ class Output <Source
1143
+ include SiSU_Param
1144
+ include SiSU_Env
1145
+ def initialize(fn,content,md,process=:complete)
1146
+ @fn,@content,@md,@process=fn,content,md,process
1147
+ @file=SiSU_Env::FileOp.new(md,fn)
1148
+ end
1149
+ def po4a #%pot output
1150
+ file_pot=(@md.opt.f_pth[:lng] == @md.opt.lng_base) \
1151
+ ? @file.write_file.pot
1152
+ : @file.write_file.po
1153
+ @sisu=[]
1154
+ emptyline=0
1155
+ @content.each do |para| # this is a hack
1156
+ if para.is_a?(Array) \
1157
+ and para.length > 0
1158
+ para.each do |line|
1159
+ if line
1160
+ line=line.gsub(/\s+$/m,'').
1161
+ gsub(/^\A[ ]*\Z/m,'')
1162
+ if line=~/^\A[ ]*\Z/m
1163
+ emptyline+=1
1164
+ else emptyline=0
1165
+ end
1166
+ file_pot.puts line if emptyline < 2 #remove extra line spaces (fix upstream)
1167
+ end
1168
+ end
1169
+ else file_pot.puts para #unix plaintext # /^([*=-]|\.){5}/
1170
+ end
1171
+ end
1172
+ file_pot.close
1173
+ SiSU_Po4aUtils::PotNumber.new.reset
1174
+ po4a_git
1175
+ end
1176
+ def po4a_git
1177
+ unless @md.opt.act[:maintenance][:set]==:on
1178
+ require_relative 'git' # git.rb
1179
+ git=SiSU_Git::Source.new(@md.opt,@process)
1180
+ unless FileTest.directory?(@file.output_path.pot_git.dir)
1181
+ git.create_file_structure_git
1182
+ end
1183
+ if @md.opt.f_pth[:lng] == @md.opt.lng_base
1184
+ FileUtils::cp(
1185
+ @file.place_file.pot.dir,
1186
+ @file.output_path.pot_git.dir
1187
+ )
1188
+ else # naive, work on -->
1189
+ FileUtils::cp(
1190
+ @file.place_file.po.dir,
1191
+ @file.output_path.po_git.dir
1192
+ ) #unless FileTest.file?(@file.place_file.po_git.dir)
1193
+ end
1194
+ git.read
1195
+ end
1196
+ end
1197
+ end
1198
+ end
1199
+ end
1200
+ __END__
1201
+ &#033;\|&#035;\|&&#042;\|&#045;\|&#047;\|&#095;\|&#123;\|&#125;\|&#126;\|&#
1202
+
1203
+ tables are problematic, difficult to reconstitute instruction, check
1204
+
1205
+ metadata, move to top? and work on
1206
+
1207
+ footnotes, different types, asterisk, also do you want to have separate
1208
+ paragraphs, or breaks within one block?
1209
+
1210
+ where no ocn appropriately use ~# or -# or indeed 1~name-
1211
+
1212
+ comments in document, what to do about them, not sure they are currently
1213
+ retained in dal, could be quite valuable to keep
1214
+
1215
+ Translate Shell
1216
+ http://www.soimort.org/translate-shell/
1217
+ translate.google.com