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