uniword 1.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 (1269) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +428 -0
  3. data/CONTRIBUTING.md +479 -0
  4. data/LICENSE.txt +25 -0
  5. data/README.adoc +2186 -0
  6. data/exe/uniword +6 -0
  7. data/lib/uniword/accessibility/accessibility_checker.rb +115 -0
  8. data/lib/uniword/accessibility/accessibility_profile.rb +133 -0
  9. data/lib/uniword/accessibility/accessibility_report.rb +212 -0
  10. data/lib/uniword/accessibility/accessibility_rule.rb +93 -0
  11. data/lib/uniword/accessibility/accessibility_violation.rb +80 -0
  12. data/lib/uniword/accessibility/rules/color_usage_rule.rb +30 -0
  13. data/lib/uniword/accessibility/rules/contrast_ratio_rule.rb +31 -0
  14. data/lib/uniword/accessibility/rules/descriptive_headings_rule.rb +99 -0
  15. data/lib/uniword/accessibility/rules/document_title_rule.rb +64 -0
  16. data/lib/uniword/accessibility/rules/heading_structure_rule.rb +127 -0
  17. data/lib/uniword/accessibility/rules/image_alt_text_rule.rb +89 -0
  18. data/lib/uniword/accessibility/rules/language_specification_rule.rb +55 -0
  19. data/lib/uniword/accessibility/rules/list_structure_rule.rb +33 -0
  20. data/lib/uniword/accessibility/rules/reading_order_rule.rb +30 -0
  21. data/lib/uniword/accessibility/rules/table_headers_rule.rb +61 -0
  22. data/lib/uniword/accessibility/rules.rb +18 -0
  23. data/lib/uniword/accessibility.rb +12 -0
  24. data/lib/uniword/assembly/assembly_manifest.rb +189 -0
  25. data/lib/uniword/assembly/component_registry.rb +260 -0
  26. data/lib/uniword/assembly/cross_reference_resolver.rb +241 -0
  27. data/lib/uniword/assembly/document_assembler.rb +296 -0
  28. data/lib/uniword/assembly/toc.rb +227 -0
  29. data/lib/uniword/assembly/toc_entry.rb +124 -0
  30. data/lib/uniword/assembly/toc_instruction.rb +92 -0
  31. data/lib/uniword/assembly/variable_substitutor.rb +238 -0
  32. data/lib/uniword/assembly.rb +14 -0
  33. data/lib/uniword/batch/batch_result.rb +244 -0
  34. data/lib/uniword/batch/document_processor.rb +339 -0
  35. data/lib/uniword/batch/processing_stage.rb +92 -0
  36. data/lib/uniword/batch/stages/compress_images_stage.rb +187 -0
  37. data/lib/uniword/batch/stages/convert_format_stage.rb +117 -0
  38. data/lib/uniword/batch/stages/normalize_styles_stage.rb +174 -0
  39. data/lib/uniword/batch/stages/quality_check_stage.rb +149 -0
  40. data/lib/uniword/batch/stages/update_metadata_stage.rb +103 -0
  41. data/lib/uniword/batch/stages/validate_links_stage.rb +203 -0
  42. data/lib/uniword/batch.rb +16 -0
  43. data/lib/uniword/bibliography/author.rb +80 -0
  44. data/lib/uniword/bibliography/city.rb +22 -0
  45. data/lib/uniword/bibliography/corporate.rb +22 -0
  46. data/lib/uniword/bibliography/day.rb +22 -0
  47. data/lib/uniword/bibliography/edition.rb +22 -0
  48. data/lib/uniword/bibliography/first.rb +22 -0
  49. data/lib/uniword/bibliography/first_name.rb +22 -0
  50. data/lib/uniword/bibliography/guid.rb +22 -0
  51. data/lib/uniword/bibliography/issue.rb +22 -0
  52. data/lib/uniword/bibliography/last.rb +22 -0
  53. data/lib/uniword/bibliography/last_name.rb +22 -0
  54. data/lib/uniword/bibliography/lcid.rb +22 -0
  55. data/lib/uniword/bibliography/locale_id.rb +22 -0
  56. data/lib/uniword/bibliography/month.rb +22 -0
  57. data/lib/uniword/bibliography/name_list.rb +23 -0
  58. data/lib/uniword/bibliography/pages.rb +22 -0
  59. data/lib/uniword/bibliography/person.rb +27 -0
  60. data/lib/uniword/bibliography/publisher.rb +22 -0
  61. data/lib/uniword/bibliography/ref_order.rb +22 -0
  62. data/lib/uniword/bibliography/source.rb +169 -0
  63. data/lib/uniword/bibliography/source_tag.rb +22 -0
  64. data/lib/uniword/bibliography/source_type.rb +22 -0
  65. data/lib/uniword/bibliography/sources.rb +29 -0
  66. data/lib/uniword/bibliography/tag.rb +22 -0
  67. data/lib/uniword/bibliography/title.rb +22 -0
  68. data/lib/uniword/bibliography/url.rb +22 -0
  69. data/lib/uniword/bibliography/volume_number.rb +22 -0
  70. data/lib/uniword/bibliography/year.rb +22 -0
  71. data/lib/uniword/bibliography.rb +45 -0
  72. data/lib/uniword/bookmark.rb +103 -0
  73. data/lib/uniword/builder/bibliography_builder.rb +188 -0
  74. data/lib/uniword/builder/chart_builder.rb +365 -0
  75. data/lib/uniword/builder/comment_builder.rb +54 -0
  76. data/lib/uniword/builder/document_builder.rb +548 -0
  77. data/lib/uniword/builder/footnote_builder.rb +102 -0
  78. data/lib/uniword/builder/header_footer_builder.rb +79 -0
  79. data/lib/uniword/builder/image_builder.rb +316 -0
  80. data/lib/uniword/builder/list_builder.rb +51 -0
  81. data/lib/uniword/builder/numbering_builder.rb +42 -0
  82. data/lib/uniword/builder/paragraph_builder.rb +228 -0
  83. data/lib/uniword/builder/run_builder.rb +285 -0
  84. data/lib/uniword/builder/sdt_builder.rb +205 -0
  85. data/lib/uniword/builder/section_builder.rb +170 -0
  86. data/lib/uniword/builder/style_builder.rb +129 -0
  87. data/lib/uniword/builder/table_builder.rb +111 -0
  88. data/lib/uniword/builder/table_cell_builder.rb +138 -0
  89. data/lib/uniword/builder/table_row_builder.rb +65 -0
  90. data/lib/uniword/builder/theme_builder.rb +98 -0
  91. data/lib/uniword/builder/toc_builder.rb +54 -0
  92. data/lib/uniword/builder/watermark_builder.rb +95 -0
  93. data/lib/uniword/builder.rb +232 -0
  94. data/lib/uniword/chart/area3_d_chart.rb +35 -0
  95. data/lib/uniword/chart/area_chart.rb +33 -0
  96. data/lib/uniword/chart/auto_title_deleted.rb +22 -0
  97. data/lib/uniword/chart/axis_id.rb +22 -0
  98. data/lib/uniword/chart/axis_position.rb +22 -0
  99. data/lib/uniword/chart/bar3_d_chart.rb +39 -0
  100. data/lib/uniword/chart/bar_chart.rb +37 -0
  101. data/lib/uniword/chart/bubble_chart.rb +37 -0
  102. data/lib/uniword/chart/bubble_size.rb +25 -0
  103. data/lib/uniword/chart/cat_ax.rb +45 -0
  104. data/lib/uniword/chart/category_axis_data.rb +29 -0
  105. data/lib/uniword/chart/chart.rb +33 -0
  106. data/lib/uniword/chart/chart_reference.rb +24 -0
  107. data/lib/uniword/chart/chart_space.rb +35 -0
  108. data/lib/uniword/chart/color_map_override.rb +22 -0
  109. data/lib/uniword/chart/data_label.rb +35 -0
  110. data/lib/uniword/chart/data_labels.rb +41 -0
  111. data/lib/uniword/chart/date_ax.rb +45 -0
  112. data/lib/uniword/chart/diagram_reference.rb +24 -0
  113. data/lib/uniword/chart/doughnut_chart.rb +31 -0
  114. data/lib/uniword/chart/drop_lines.rb +23 -0
  115. data/lib/uniword/chart/error_bar_type.rb +22 -0
  116. data/lib/uniword/chart/error_bars.rb +37 -0
  117. data/lib/uniword/chart/error_direction.rb +22 -0
  118. data/lib/uniword/chart/explosion.rb +22 -0
  119. data/lib/uniword/chart/gap_width.rb +22 -0
  120. data/lib/uniword/chart/hi_low_lines.rb +23 -0
  121. data/lib/uniword/chart/index.rb +22 -0
  122. data/lib/uniword/chart/layout.rb +23 -0
  123. data/lib/uniword/chart/legend.rb +33 -0
  124. data/lib/uniword/chart/legend_entry.rb +27 -0
  125. data/lib/uniword/chart/legend_position.rb +22 -0
  126. data/lib/uniword/chart/line3_d_chart.rb +35 -0
  127. data/lib/uniword/chart/line_chart.rb +41 -0
  128. data/lib/uniword/chart/major_gridlines.rb +23 -0
  129. data/lib/uniword/chart/marker.rb +27 -0
  130. data/lib/uniword/chart/marker_size.rb +22 -0
  131. data/lib/uniword/chart/marker_style.rb +22 -0
  132. data/lib/uniword/chart/minor_gridlines.rb +23 -0
  133. data/lib/uniword/chart/number_reference.rb +25 -0
  134. data/lib/uniword/chart/numbering_format.rb +24 -0
  135. data/lib/uniword/chart/order.rb +22 -0
  136. data/lib/uniword/chart/orientation.rb +22 -0
  137. data/lib/uniword/chart/pie3_d_chart.rb +27 -0
  138. data/lib/uniword/chart/pie_chart.rb +29 -0
  139. data/lib/uniword/chart/plot_area.rb +35 -0
  140. data/lib/uniword/chart/plot_vis_only.rb +22 -0
  141. data/lib/uniword/chart/radar_chart.rb +31 -0
  142. data/lib/uniword/chart/scaling.rb +29 -0
  143. data/lib/uniword/chart/scatter_chart.rb +31 -0
  144. data/lib/uniword/chart/ser_ax.rb +43 -0
  145. data/lib/uniword/chart/series.rb +29 -0
  146. data/lib/uniword/chart/series_text.rb +25 -0
  147. data/lib/uniword/chart/shape_properties.rb +22 -0
  148. data/lib/uniword/chart/show_category_name.rb +22 -0
  149. data/lib/uniword/chart/show_legend_key.rb +22 -0
  150. data/lib/uniword/chart/show_value.rb +22 -0
  151. data/lib/uniword/chart/smooth.rb +22 -0
  152. data/lib/uniword/chart/stock_chart.rb +33 -0
  153. data/lib/uniword/chart/style.rb +22 -0
  154. data/lib/uniword/chart/surface3_d_chart.rb +29 -0
  155. data/lib/uniword/chart/surface_chart.rb +29 -0
  156. data/lib/uniword/chart/text_properties.rb +22 -0
  157. data/lib/uniword/chart/tick_label_position.rb +22 -0
  158. data/lib/uniword/chart/title.rb +31 -0
  159. data/lib/uniword/chart/trendline.rb +35 -0
  160. data/lib/uniword/chart/trendline_type.rb +22 -0
  161. data/lib/uniword/chart/up_down_bars.rb +27 -0
  162. data/lib/uniword/chart/val_ax.rb +49 -0
  163. data/lib/uniword/chart/values.rb +25 -0
  164. data/lib/uniword/chart/x_values.rb +25 -0
  165. data/lib/uniword/chart/y_values.rb +25 -0
  166. data/lib/uniword/chart.rb +105 -0
  167. data/lib/uniword/cli.rb +737 -0
  168. data/lib/uniword/column_configuration.rb +111 -0
  169. data/lib/uniword/comment.rb +147 -0
  170. data/lib/uniword/comment_range.rb +122 -0
  171. data/lib/uniword/comments_part.rb +130 -0
  172. data/lib/uniword/configuration/configuration_loader.rb +168 -0
  173. data/lib/uniword/configuration.rb +7 -0
  174. data/lib/uniword/content_types/default.rb +24 -0
  175. data/lib/uniword/content_types/override.rb +24 -0
  176. data/lib/uniword/content_types/types.rb +26 -0
  177. data/lib/uniword/content_types.rb +76 -0
  178. data/lib/uniword/customxml/custom_xml.rb +29 -0
  179. data/lib/uniword/customxml/custom_xml_attribute.rb +26 -0
  180. data/lib/uniword/customxml/custom_xml_block.rb +29 -0
  181. data/lib/uniword/customxml/custom_xml_cell.rb +29 -0
  182. data/lib/uniword/customxml/custom_xml_del_range_start.rb +26 -0
  183. data/lib/uniword/customxml/custom_xml_ins_range_end.rb +22 -0
  184. data/lib/uniword/customxml/custom_xml_ins_range_start.rb +26 -0
  185. data/lib/uniword/customxml/custom_xml_move_from_range_end.rb +22 -0
  186. data/lib/uniword/customxml/custom_xml_move_from_range_start.rb +26 -0
  187. data/lib/uniword/customxml/custom_xml_move_to_range_end.rb +22 -0
  188. data/lib/uniword/customxml/custom_xml_move_to_range_start.rb +26 -0
  189. data/lib/uniword/customxml/custom_xml_properties.rb +27 -0
  190. data/lib/uniword/customxml/custom_xml_row.rb +29 -0
  191. data/lib/uniword/customxml/custom_xml_run.rb +29 -0
  192. data/lib/uniword/customxml/data_binding.rb +26 -0
  193. data/lib/uniword/customxml/data_store_item.rb +24 -0
  194. data/lib/uniword/customxml/element_name.rb +22 -0
  195. data/lib/uniword/customxml/name.rb +22 -0
  196. data/lib/uniword/customxml/namespace_uri.rb +22 -0
  197. data/lib/uniword/customxml/placeholder.rb +22 -0
  198. data/lib/uniword/customxml/placeholder_text.rb +22 -0
  199. data/lib/uniword/customxml/prefix_mappings.rb +22 -0
  200. data/lib/uniword/customxml/schema_reference.rb +41 -0
  201. data/lib/uniword/customxml/showing_placeholder.rb +24 -0
  202. data/lib/uniword/customxml/showing_placeholder_header.rb +22 -0
  203. data/lib/uniword/customxml/smart_tag.rb +29 -0
  204. data/lib/uniword/customxml/smart_tag_attribute.rb +24 -0
  205. data/lib/uniword/customxml/smart_tag_element.rb +22 -0
  206. data/lib/uniword/customxml/smart_tag_name.rb +22 -0
  207. data/lib/uniword/customxml/smart_tag_properties.rb +23 -0
  208. data/lib/uniword/customxml/smart_tag_type.rb +26 -0
  209. data/lib/uniword/customxml/smart_tag_uri.rb +22 -0
  210. data/lib/uniword/customxml/store_item_id.rb +22 -0
  211. data/lib/uniword/customxml/x_path.rb +22 -0
  212. data/lib/uniword/customxml/x_path_expression.rb +22 -0
  213. data/lib/uniword/customxml.rb +53 -0
  214. data/lib/uniword/document_factory.rb +214 -0
  215. data/lib/uniword/document_properties/app_version.rb +22 -0
  216. data/lib/uniword/document_properties/application.rb +22 -0
  217. data/lib/uniword/document_properties/bool_value.rb +22 -0
  218. data/lib/uniword/document_properties/company.rb +22 -0
  219. data/lib/uniword/document_properties/custom_properties.rb +23 -0
  220. data/lib/uniword/document_properties/custom_property.rb +37 -0
  221. data/lib/uniword/document_properties/doc_security.rb +22 -0
  222. data/lib/uniword/document_properties/extended_properties.rb +41 -0
  223. data/lib/uniword/document_properties/file_time.rb +22 -0
  224. data/lib/uniword/document_properties/heading_pairs.rb +23 -0
  225. data/lib/uniword/document_properties/hyperlinks_changed.rb +22 -0
  226. data/lib/uniword/document_properties/i4.rb +22 -0
  227. data/lib/uniword/document_properties/links_up_to_date.rb +22 -0
  228. data/lib/uniword/document_properties/lpw_str.rb +22 -0
  229. data/lib/uniword/document_properties/manager.rb +22 -0
  230. data/lib/uniword/document_properties/scale_crop.rb +22 -0
  231. data/lib/uniword/document_properties/shared_doc.rb +22 -0
  232. data/lib/uniword/document_properties/titles_of_parts.rb +23 -0
  233. data/lib/uniword/document_properties/variant.rb +25 -0
  234. data/lib/uniword/document_properties/vector.rb +27 -0
  235. data/lib/uniword/document_properties.rb +32 -0
  236. data/lib/uniword/document_variables/data_type.rb +22 -0
  237. data/lib/uniword/document_variables/default_value.rb +22 -0
  238. data/lib/uniword/document_variables/doc_var.rb +24 -0
  239. data/lib/uniword/document_variables/doc_vars.rb +23 -0
  240. data/lib/uniword/document_variables/read_only.rb +24 -0
  241. data/lib/uniword/document_variables/variable_binding.rb +26 -0
  242. data/lib/uniword/document_variables/variable_collection.rb +25 -0
  243. data/lib/uniword/document_variables/variable_expression.rb +22 -0
  244. data/lib/uniword/document_variables/variable_format.rb +22 -0
  245. data/lib/uniword/document_variables/variable_scope.rb +22 -0
  246. data/lib/uniword/document_variables.rb +23 -0
  247. data/lib/uniword/document_writer.rb +157 -0
  248. data/lib/uniword/drawingml/adjust_value_list.rb +22 -0
  249. data/lib/uniword/drawingml/alpha.rb +22 -0
  250. data/lib/uniword/drawingml/alpha_bi_level.rb +22 -0
  251. data/lib/uniword/drawingml/alpha_modulation.rb +22 -0
  252. data/lib/uniword/drawingml/alpha_modulation_fixed.rb +22 -0
  253. data/lib/uniword/drawingml/alpha_offset.rb +22 -0
  254. data/lib/uniword/drawingml/arc_to.rb +28 -0
  255. data/lib/uniword/drawingml/background_color.rb +24 -0
  256. data/lib/uniword/drawingml/bevel_top.rb +26 -0
  257. data/lib/uniword/drawingml/bi_level.rb +22 -0
  258. data/lib/uniword/drawingml/blip.rb +30 -0
  259. data/lib/uniword/drawingml/blip_fill.rb +28 -0
  260. data/lib/uniword/drawingml/blue.rb +22 -0
  261. data/lib/uniword/drawingml/blur.rb +24 -0
  262. data/lib/uniword/drawingml/body_properties.rb +22 -0
  263. data/lib/uniword/drawingml/camera.rb +24 -0
  264. data/lib/uniword/drawingml/close_path.rb +18 -0
  265. data/lib/uniword/drawingml/color_scheme.rb +381 -0
  266. data/lib/uniword/drawingml/complex_script_font.rb +24 -0
  267. data/lib/uniword/drawingml/custom_dash.rb +22 -0
  268. data/lib/uniword/drawingml/custom_geometry.rb +24 -0
  269. data/lib/uniword/drawingml/dash_stop.rb +24 -0
  270. data/lib/uniword/drawingml/default_paragraph_properties.rb +24 -0
  271. data/lib/uniword/drawingml/duotone.rb +22 -0
  272. data/lib/uniword/drawingml/east_asian_font.rb +24 -0
  273. data/lib/uniword/drawingml/effect_container.rb +22 -0
  274. data/lib/uniword/drawingml/effect_list.rb +30 -0
  275. data/lib/uniword/drawingml/extension.rb +53 -0
  276. data/lib/uniword/drawingml/extension_list.rb +25 -0
  277. data/lib/uniword/drawingml/extents.rb +24 -0
  278. data/lib/uniword/drawingml/extra_color_scheme_list.rb +20 -0
  279. data/lib/uniword/drawingml/fill_overlay.rb +22 -0
  280. data/lib/uniword/drawingml/fill_to_rect.rb +28 -0
  281. data/lib/uniword/drawingml/font_reference.rb +23 -0
  282. data/lib/uniword/drawingml/font_scheme.rb +241 -0
  283. data/lib/uniword/drawingml/foreground_color.rb +24 -0
  284. data/lib/uniword/drawingml/format_scheme.rb +141 -0
  285. data/lib/uniword/drawingml/gamma.rb +18 -0
  286. data/lib/uniword/drawingml/geometry_guide.rb +24 -0
  287. data/lib/uniword/drawingml/glow.rb +26 -0
  288. data/lib/uniword/drawingml/gradient_fill.rb +29 -0
  289. data/lib/uniword/drawingml/gradient_stop.rb +26 -0
  290. data/lib/uniword/drawingml/gradient_stop_list.rb +23 -0
  291. data/lib/uniword/drawingml/graphic.rb +21 -0
  292. data/lib/uniword/drawingml/graphic_data.rb +27 -0
  293. data/lib/uniword/drawingml/grayscale.rb +18 -0
  294. data/lib/uniword/drawingml/green.rb +22 -0
  295. data/lib/uniword/drawingml/group_locking.rb +35 -0
  296. data/lib/uniword/drawingml/group_shape_properties.rb +21 -0
  297. data/lib/uniword/drawingml/gvml.rb +26 -0
  298. data/lib/uniword/drawingml/gvml_connector.rb +25 -0
  299. data/lib/uniword/drawingml/gvml_connector_non_visual.rb +23 -0
  300. data/lib/uniword/drawingml/gvml_graphic_frame_non_visual.rb +23 -0
  301. data/lib/uniword/drawingml/gvml_graphical_object_frame.rb +25 -0
  302. data/lib/uniword/drawingml/gvml_group_shape.rb +36 -0
  303. data/lib/uniword/drawingml/gvml_group_shape_non_visual.rb +23 -0
  304. data/lib/uniword/drawingml/gvml_picture.rb +27 -0
  305. data/lib/uniword/drawingml/gvml_picture_non_visual.rb +23 -0
  306. data/lib/uniword/drawingml/gvml_shape.rb +27 -0
  307. data/lib/uniword/drawingml/gvml_shape_non_visual.rb +23 -0
  308. data/lib/uniword/drawingml/gvml_text_shape.rb +25 -0
  309. data/lib/uniword/drawingml/gvml_use_shape_rectangle.rb +17 -0
  310. data/lib/uniword/drawingml/hue.rb +22 -0
  311. data/lib/uniword/drawingml/hue_modulation.rb +22 -0
  312. data/lib/uniword/drawingml/hue_offset.rb +22 -0
  313. data/lib/uniword/drawingml/inner_shadow.rb +30 -0
  314. data/lib/uniword/drawingml/inverse_gamma.rb +18 -0
  315. data/lib/uniword/drawingml/level1_paragraph_properties.rb +24 -0
  316. data/lib/uniword/drawingml/level2_paragraph_properties.rb +24 -0
  317. data/lib/uniword/drawingml/level3_paragraph_properties.rb +24 -0
  318. data/lib/uniword/drawingml/light_rig.rb +26 -0
  319. data/lib/uniword/drawingml/line_defaults.rb +27 -0
  320. data/lib/uniword/drawingml/line_join_miter.rb +22 -0
  321. data/lib/uniword/drawingml/line_join_round.rb +18 -0
  322. data/lib/uniword/drawingml/line_properties.rb +36 -0
  323. data/lib/uniword/drawingml/line_to.rb +22 -0
  324. data/lib/uniword/drawingml/linear_gradient.rb +24 -0
  325. data/lib/uniword/drawingml/list_style.rb +28 -0
  326. data/lib/uniword/drawingml/luminance.rb +22 -0
  327. data/lib/uniword/drawingml/luminance_modulation.rb +22 -0
  328. data/lib/uniword/drawingml/luminance_offset.rb +22 -0
  329. data/lib/uniword/drawingml/move_to.rb +22 -0
  330. data/lib/uniword/drawingml/no_fill.rb +18 -0
  331. data/lib/uniword/drawingml/non_visual_connector_properties.rb +21 -0
  332. data/lib/uniword/drawingml/non_visual_drawing_properties.rb +24 -0
  333. data/lib/uniword/drawingml/non_visual_graphic_frame_properties.rb +21 -0
  334. data/lib/uniword/drawingml/non_visual_group_drawing_shape_properties.rb +21 -0
  335. data/lib/uniword/drawingml/non_visual_picture_properties.rb +25 -0
  336. data/lib/uniword/drawingml/non_visual_shape_properties.rb +22 -0
  337. data/lib/uniword/drawingml/object_defaults.rb +23 -0
  338. data/lib/uniword/drawingml/office_art_extension.rb +21 -0
  339. data/lib/uniword/drawingml/office_art_extension_list.rb +21 -0
  340. data/lib/uniword/drawingml/offset.rb +24 -0
  341. data/lib/uniword/drawingml/outer_shadow.rb +38 -0
  342. data/lib/uniword/drawingml/path_gradient.rb +24 -0
  343. data/lib/uniword/drawingml/path_list.rb +22 -0
  344. data/lib/uniword/drawingml/pattern_fill.rb +26 -0
  345. data/lib/uniword/drawingml/picture_locking.rb +35 -0
  346. data/lib/uniword/drawingml/preset_dash.rb +22 -0
  347. data/lib/uniword/drawingml/preset_geometry.rb +24 -0
  348. data/lib/uniword/drawingml/preset_shadow.rb +26 -0
  349. data/lib/uniword/drawingml/red.rb +22 -0
  350. data/lib/uniword/drawingml/red_modulation.rb +22 -0
  351. data/lib/uniword/drawingml/red_offset.rb +22 -0
  352. data/lib/uniword/drawingml/reflection.rb +36 -0
  353. data/lib/uniword/drawingml/relative_rect.rb +27 -0
  354. data/lib/uniword/drawingml/rotation.rb +26 -0
  355. data/lib/uniword/drawingml/saturation.rb +22 -0
  356. data/lib/uniword/drawingml/saturation_modulation.rb +22 -0
  357. data/lib/uniword/drawingml/saturation_offset.rb +22 -0
  358. data/lib/uniword/drawingml/scene_3d.rb +24 -0
  359. data/lib/uniword/drawingml/scheme_color.rb +43 -0
  360. data/lib/uniword/drawingml/shade.rb +22 -0
  361. data/lib/uniword/drawingml/shape.rb +24 -0
  362. data/lib/uniword/drawingml/shape_3d.rb +28 -0
  363. data/lib/uniword/drawingml/shape_defaults.rb +27 -0
  364. data/lib/uniword/drawingml/shape_properties.rb +24 -0
  365. data/lib/uniword/drawingml/shape_style.rb +27 -0
  366. data/lib/uniword/drawingml/soft_edge.rb +22 -0
  367. data/lib/uniword/drawingml/solid_fill.rb +24 -0
  368. data/lib/uniword/drawingml/source_rect.rb +28 -0
  369. data/lib/uniword/drawingml/srgb_color.rb +43 -0
  370. data/lib/uniword/drawingml/stretch.rb +18 -0
  371. data/lib/uniword/drawingml/style_matrix.rb +27 -0
  372. data/lib/uniword/drawingml/style_matrix_reference.rb +25 -0
  373. data/lib/uniword/drawingml/style_reference.rb +23 -0
  374. data/lib/uniword/drawingml/text_body.rb +25 -0
  375. data/lib/uniword/drawingml/text_character_properties.rb +33 -0
  376. data/lib/uniword/drawingml/text_defaults.rb +27 -0
  377. data/lib/uniword/drawingml/text_font.rb +24 -0
  378. data/lib/uniword/drawingml/text_paragraph.rb +23 -0
  379. data/lib/uniword/drawingml/text_paragraph_properties.rb +26 -0
  380. data/lib/uniword/drawingml/text_run.rb +23 -0
  381. data/lib/uniword/drawingml/theme.rb +263 -0
  382. data/lib/uniword/drawingml/tile.rb +32 -0
  383. data/lib/uniword/drawingml/tile_rect.rb +28 -0
  384. data/lib/uniword/drawingml/tint.rb +22 -0
  385. data/lib/uniword/drawingml/transform2_d.rb +24 -0
  386. data/lib/uniword/drawingml.rb +190 -0
  387. data/lib/uniword/element.rb +52 -0
  388. data/lib/uniword/element_registry.rb +111 -0
  389. data/lib/uniword/endnote.rb +66 -0
  390. data/lib/uniword/errors.rb +140 -0
  391. data/lib/uniword/field.rb +76 -0
  392. data/lib/uniword/footer.rb +41 -0
  393. data/lib/uniword/footnote.rb +65 -0
  394. data/lib/uniword/format_converter.rb +350 -0
  395. data/lib/uniword/format_detector.rb +142 -0
  396. data/lib/uniword/glossary/auto_text.rb +24 -0
  397. data/lib/uniword/glossary/category_name.rb +22 -0
  398. data/lib/uniword/glossary/doc_part.rb +25 -0
  399. data/lib/uniword/glossary/doc_part_behavior.rb +22 -0
  400. data/lib/uniword/glossary/doc_part_behaviors.rb +23 -0
  401. data/lib/uniword/glossary/doc_part_body.rb +30 -0
  402. data/lib/uniword/glossary/doc_part_category.rb +25 -0
  403. data/lib/uniword/glossary/doc_part_description.rb +22 -0
  404. data/lib/uniword/glossary/doc_part_gallery.rb +22 -0
  405. data/lib/uniword/glossary/doc_part_id.rb +22 -0
  406. data/lib/uniword/glossary/doc_part_name.rb +22 -0
  407. data/lib/uniword/glossary/doc_part_properties.rb +35 -0
  408. data/lib/uniword/glossary/doc_part_type.rb +22 -0
  409. data/lib/uniword/glossary/doc_part_types.rb +25 -0
  410. data/lib/uniword/glossary/doc_parts.rb +22 -0
  411. data/lib/uniword/glossary/equation.rb +24 -0
  412. data/lib/uniword/glossary/glossary_document.rb +32 -0
  413. data/lib/uniword/glossary/style_id.rb +22 -0
  414. data/lib/uniword/glossary/text_box.rb +24 -0
  415. data/lib/uniword/glossary.rb +33 -0
  416. data/lib/uniword/header.rb +41 -0
  417. data/lib/uniword/html_importer.rb +55 -0
  418. data/lib/uniword/hyperlink.rb +76 -0
  419. data/lib/uniword/image.rb +244 -0
  420. data/lib/uniword/infrastructure/mime_packager.rb +155 -0
  421. data/lib/uniword/infrastructure/mime_parser.rb +195 -0
  422. data/lib/uniword/infrastructure/xml_namespace_normalizer.rb +105 -0
  423. data/lib/uniword/infrastructure/zip_extractor.rb +133 -0
  424. data/lib/uniword/infrastructure/zip_packager.rb +249 -0
  425. data/lib/uniword/infrastructure.rb +10 -0
  426. data/lib/uniword/lazy_loader.rb +118 -0
  427. data/lib/uniword/line_numbering.rb +129 -0
  428. data/lib/uniword/loggable.rb +57 -0
  429. data/lib/uniword/logger.rb +75 -0
  430. data/lib/uniword/math/accent.rb +25 -0
  431. data/lib/uniword/math/accent_properties.rb +25 -0
  432. data/lib/uniword/math/argument_properties.rb +22 -0
  433. data/lib/uniword/math/bar.rb +25 -0
  434. data/lib/uniword/math/bar_properties.rb +25 -0
  435. data/lib/uniword/math/begin_char.rb +22 -0
  436. data/lib/uniword/math/border_box.rb +25 -0
  437. data/lib/uniword/math/border_box_properties.rb +39 -0
  438. data/lib/uniword/math/box.rb +25 -0
  439. data/lib/uniword/math/box_properties.rb +33 -0
  440. data/lib/uniword/math/char.rb +22 -0
  441. data/lib/uniword/math/control_properties.rb +27 -0
  442. data/lib/uniword/math/degree.rb +26 -0
  443. data/lib/uniword/math/delimiter.rb +25 -0
  444. data/lib/uniword/math/delimiter_properties.rb +33 -0
  445. data/lib/uniword/math/denominator.rb +26 -0
  446. data/lib/uniword/math/element.rb +56 -0
  447. data/lib/uniword/math/end_char.rb +22 -0
  448. data/lib/uniword/math/equation_array.rb +25 -0
  449. data/lib/uniword/math/equation_array_properties.rb +33 -0
  450. data/lib/uniword/math/fraction.rb +27 -0
  451. data/lib/uniword/math/fraction_properties.rb +25 -0
  452. data/lib/uniword/math/function.rb +27 -0
  453. data/lib/uniword/math/function_name.rb +26 -0
  454. data/lib/uniword/math/function_properties.rb +23 -0
  455. data/lib/uniword/math/group_char.rb +25 -0
  456. data/lib/uniword/math/group_char_properties.rb +29 -0
  457. data/lib/uniword/math/lim.rb +26 -0
  458. data/lib/uniword/math/lower_limit.rb +27 -0
  459. data/lib/uniword/math/lower_limit_properties.rb +23 -0
  460. data/lib/uniword/math/math_break.rb +22 -0
  461. data/lib/uniword/math/math_font.rb +22 -0
  462. data/lib/uniword/math/math_properties.rb +53 -0
  463. data/lib/uniword/math/math_run.rb +42 -0
  464. data/lib/uniword/math/math_run_properties.rb +37 -0
  465. data/lib/uniword/math/math_simple_int_val.rb +24 -0
  466. data/lib/uniword/math/math_simple_val.rb +24 -0
  467. data/lib/uniword/math/math_style.rb +22 -0
  468. data/lib/uniword/math/math_text.rb +23 -0
  469. data/lib/uniword/math/matrix.rb +25 -0
  470. data/lib/uniword/math/matrix_column.rb +23 -0
  471. data/lib/uniword/math/matrix_column_properties.rb +24 -0
  472. data/lib/uniword/math/matrix_columns.rb +23 -0
  473. data/lib/uniword/math/matrix_properties.rb +37 -0
  474. data/lib/uniword/math/matrix_row.rb +23 -0
  475. data/lib/uniword/math/nary.rb +29 -0
  476. data/lib/uniword/math/nary_properties.rb +33 -0
  477. data/lib/uniword/math/numerator.rb +26 -0
  478. data/lib/uniword/math/o_math.rb +54 -0
  479. data/lib/uniword/math/o_math_para.rb +25 -0
  480. data/lib/uniword/math/o_math_para_properties.rb +22 -0
  481. data/lib/uniword/math/phantom.rb +25 -0
  482. data/lib/uniword/math/phantom_properties.rb +33 -0
  483. data/lib/uniword/math/plurimath_adapter.rb +289 -0
  484. data/lib/uniword/math/pre_sub_superscript.rb +29 -0
  485. data/lib/uniword/math/pre_sub_superscript_properties.rb +23 -0
  486. data/lib/uniword/math/radical.rb +27 -0
  487. data/lib/uniword/math/radical_properties.rb +25 -0
  488. data/lib/uniword/math/separator_char.rb +22 -0
  489. data/lib/uniword/math/sub.rb +26 -0
  490. data/lib/uniword/math/sub_superscript.rb +29 -0
  491. data/lib/uniword/math/sub_superscript_properties.rb +25 -0
  492. data/lib/uniword/math/subscript.rb +27 -0
  493. data/lib/uniword/math/subscript_properties.rb +23 -0
  494. data/lib/uniword/math/sup.rb +26 -0
  495. data/lib/uniword/math/superscript.rb +27 -0
  496. data/lib/uniword/math/superscript_properties.rb +23 -0
  497. data/lib/uniword/math/upper_limit.rb +27 -0
  498. data/lib/uniword/math/upper_limit_properties.rb +23 -0
  499. data/lib/uniword/math.rb +90 -0
  500. data/lib/uniword/math_equation.rb +158 -0
  501. data/lib/uniword/metadata/metadata.rb +345 -0
  502. data/lib/uniword/metadata/metadata_extractor.rb +403 -0
  503. data/lib/uniword/metadata/metadata_index.rb +455 -0
  504. data/lib/uniword/metadata/metadata_manager.rb +334 -0
  505. data/lib/uniword/metadata/metadata_updater.rb +243 -0
  506. data/lib/uniword/metadata/metadata_validator.rb +326 -0
  507. data/lib/uniword/metadata.rb +12 -0
  508. data/lib/uniword/mhtml/css_number_formatter.rb +127 -0
  509. data/lib/uniword/mhtml/document.rb +160 -0
  510. data/lib/uniword/mhtml/header_footer_part.rb +12 -0
  511. data/lib/uniword/mhtml/html_part.rb +108 -0
  512. data/lib/uniword/mhtml/image_part.rb +29 -0
  513. data/lib/uniword/mhtml/math_converter.rb +153 -0
  514. data/lib/uniword/mhtml/metadata/document_properties.rb +65 -0
  515. data/lib/uniword/mhtml/metadata/latent_styles.rb +33 -0
  516. data/lib/uniword/mhtml/metadata/office_document_settings.rb +22 -0
  517. data/lib/uniword/mhtml/metadata/word_document_settings.rb +47 -0
  518. data/lib/uniword/mhtml/metadata.rb +12 -0
  519. data/lib/uniword/mhtml/mhtml_package.rb +67 -0
  520. data/lib/uniword/mhtml/mime_part.rb +68 -0
  521. data/lib/uniword/mhtml/namespaces.rb +31 -0
  522. data/lib/uniword/mhtml/numbering_configuration.rb +49 -0
  523. data/lib/uniword/mhtml/styles_configuration.rb +57 -0
  524. data/lib/uniword/mhtml/theme.rb +50 -0
  525. data/lib/uniword/mhtml/theme_part.rb +19 -0
  526. data/lib/uniword/mhtml/word_css.rb +220 -0
  527. data/lib/uniword/mhtml/wordstyle.css +998 -0
  528. data/lib/uniword/mhtml/xml_part.rb +18 -0
  529. data/lib/uniword/mhtml.rb +31 -0
  530. data/lib/uniword/office/bottom.rb +22 -0
  531. data/lib/uniword/office/brightness.rb +22 -0
  532. data/lib/uniword/office/button.rb +26 -0
  533. data/lib/uniword/office/callout.rb +36 -0
  534. data/lib/uniword/office/callout_anchor.rb +22 -0
  535. data/lib/uniword/office/checkbox.rb +24 -0
  536. data/lib/uniword/office/color_menu.rb +24 -0
  537. data/lib/uniword/office/color_mru.rb +24 -0
  538. data/lib/uniword/office/complex.rb +22 -0
  539. data/lib/uniword/office/diagram.rb +36 -0
  540. data/lib/uniword/office/diffusity.rb +22 -0
  541. data/lib/uniword/office/document_protection.rb +26 -0
  542. data/lib/uniword/office/document_view.rb +22 -0
  543. data/lib/uniword/office/edge.rb +24 -0
  544. data/lib/uniword/office/extrusion.rb +54 -0
  545. data/lib/uniword/office/extrusion_color.rb +24 -0
  546. data/lib/uniword/office/extrusion_color_mode.rb +22 -0
  547. data/lib/uniword/office/extrusion_ok.rb +22 -0
  548. data/lib/uniword/office/field.rb +24 -0
  549. data/lib/uniword/office/forms.rb +22 -0
  550. data/lib/uniword/office/id_map.rb +24 -0
  551. data/lib/uniword/office/ink.rb +24 -0
  552. data/lib/uniword/office/ink_annotation.rb +24 -0
  553. data/lib/uniword/office/left.rb +22 -0
  554. data/lib/uniword/office/lock.rb +30 -0
  555. data/lib/uniword/office/metal.rb +22 -0
  556. data/lib/uniword/office/proof_state.rb +24 -0
  557. data/lib/uniword/office/regroup.rb +22 -0
  558. data/lib/uniword/office/regroup_table.rb +22 -0
  559. data/lib/uniword/office/relation_table.rb +22 -0
  560. data/lib/uniword/office/right.rb +22 -0
  561. data/lib/uniword/office/rules.rb +22 -0
  562. data/lib/uniword/office/shape_defaults.rb +29 -0
  563. data/lib/uniword/office/shape_layout.rb +25 -0
  564. data/lib/uniword/office/signature_line.rb +40 -0
  565. data/lib/uniword/office/skew.rb +28 -0
  566. data/lib/uniword/office/specularity.rb +22 -0
  567. data/lib/uniword/office/top.rb +22 -0
  568. data/lib/uniword/office/writing_style.rb +28 -0
  569. data/lib/uniword/office/zoom.rb +22 -0
  570. data/lib/uniword/office.rb +57 -0
  571. data/lib/uniword/ooxml/additional_characteristics.rb +43 -0
  572. data/lib/uniword/ooxml/app_properties.rb +130 -0
  573. data/lib/uniword/ooxml/core_properties.rb +69 -0
  574. data/lib/uniword/ooxml/custom_properties.rb +132 -0
  575. data/lib/uniword/ooxml/docx_package.rb +989 -0
  576. data/lib/uniword/ooxml/dotx_package.rb +247 -0
  577. data/lib/uniword/ooxml/namespaces.rb +363 -0
  578. data/lib/uniword/ooxml/package_file.rb +227 -0
  579. data/lib/uniword/ooxml/relationships/hyperlink_relationship.rb +24 -0
  580. data/lib/uniword/ooxml/relationships/image_relationship.rb +22 -0
  581. data/lib/uniword/ooxml/relationships/office_document_relationship.rb +24 -0
  582. data/lib/uniword/ooxml/relationships/package_relationship.rb +29 -0
  583. data/lib/uniword/ooxml/relationships/package_relationships.rb +51 -0
  584. data/lib/uniword/ooxml/relationships/relationship.rb +30 -0
  585. data/lib/uniword/ooxml/relationships/relationships.rb +43 -0
  586. data/lib/uniword/ooxml/relationships.rb +24 -0
  587. data/lib/uniword/ooxml/schema/attribute_definition.rb +159 -0
  588. data/lib/uniword/ooxml/schema/child_definition.rb +125 -0
  589. data/lib/uniword/ooxml/schema/element_definition.rb +155 -0
  590. data/lib/uniword/ooxml/schema/element_serializer.rb +319 -0
  591. data/lib/uniword/ooxml/schema/ooxml_schema.rb +226 -0
  592. data/lib/uniword/ooxml/schema.rb +16 -0
  593. data/lib/uniword/ooxml/schema_library.rb +38 -0
  594. data/lib/uniword/ooxml/styleset_package.rb +122 -0
  595. data/lib/uniword/ooxml/theme_package.rb +222 -0
  596. data/lib/uniword/ooxml/thmx_package.rb +127 -0
  597. data/lib/uniword/ooxml/types/cp_description_type.rb +17 -0
  598. data/lib/uniword/ooxml/types/cp_keywords_type.rb +17 -0
  599. data/lib/uniword/ooxml/types/cp_last_modified_by_type.rb +17 -0
  600. data/lib/uniword/ooxml/types/cp_revision_type.rb +17 -0
  601. data/lib/uniword/ooxml/types/dc_creator_type.rb +17 -0
  602. data/lib/uniword/ooxml/types/dc_subject_type.rb +17 -0
  603. data/lib/uniword/ooxml/types/dc_title_type.rb +17 -0
  604. data/lib/uniword/ooxml/types/dcterms_created_type.rb +24 -0
  605. data/lib/uniword/ooxml/types/dcterms_modified_type.rb +24 -0
  606. data/lib/uniword/ooxml/types/dcterms_w3cdtf_type.rb +49 -0
  607. data/lib/uniword/ooxml/types/mc_ignorable_type.rb +18 -0
  608. data/lib/uniword/ooxml/types/on_off_type.rb +64 -0
  609. data/lib/uniword/ooxml/types/ooxml_boolean.rb +49 -0
  610. data/lib/uniword/ooxml/types/ooxml_boolean_optional.rb +57 -0
  611. data/lib/uniword/ooxml/types/variant_types.rb +308 -0
  612. data/lib/uniword/ooxml/types.rb +76 -0
  613. data/lib/uniword/ooxml.rb +40 -0
  614. data/lib/uniword/page_borders.rb +117 -0
  615. data/lib/uniword/paragraph_border.rb +113 -0
  616. data/lib/uniword/picture/fill_rect.rb +28 -0
  617. data/lib/uniword/picture/non_visual_picture_drawing_properties.rb +25 -0
  618. data/lib/uniword/picture/non_visual_picture_properties.rb +25 -0
  619. data/lib/uniword/picture/picture.rb +27 -0
  620. data/lib/uniword/picture/picture_blip_fill.rb +27 -0
  621. data/lib/uniword/picture/picture_locks.rb +24 -0
  622. data/lib/uniword/picture/picture_shape_properties.rb +27 -0
  623. data/lib/uniword/picture/picture_source_rect.rb +28 -0
  624. data/lib/uniword/picture/picture_stretch.rb +23 -0
  625. data/lib/uniword/picture/tile.rb +30 -0
  626. data/lib/uniword/picture.rb +25 -0
  627. data/lib/uniword/presentationml/audio.rb +26 -0
  628. data/lib/uniword/presentationml/body_properties.rb +30 -0
  629. data/lib/uniword/presentationml/break.rb +22 -0
  630. data/lib/uniword/presentationml/color_map.rb +28 -0
  631. data/lib/uniword/presentationml/common_slide_data.rb +27 -0
  632. data/lib/uniword/presentationml/common_time_node.rb +33 -0
  633. data/lib/uniword/presentationml/connection_shape.rb +25 -0
  634. data/lib/uniword/presentationml/embed.rb +22 -0
  635. data/lib/uniword/presentationml/embedded_font.rb +24 -0
  636. data/lib/uniword/presentationml/end_conditions_list.rb +23 -0
  637. data/lib/uniword/presentationml/end_paragraph_run_properties.rb +26 -0
  638. data/lib/uniword/presentationml/extension.rb +22 -0
  639. data/lib/uniword/presentationml/extension_list.rb +23 -0
  640. data/lib/uniword/presentationml/field.rb +31 -0
  641. data/lib/uniword/presentationml/graphic_frame.rb +27 -0
  642. data/lib/uniword/presentationml/group_shape.rb +29 -0
  643. data/lib/uniword/presentationml/handout_master.rb +25 -0
  644. data/lib/uniword/presentationml/handout_master_id_list.rb +22 -0
  645. data/lib/uniword/presentationml/list_style.rb +29 -0
  646. data/lib/uniword/presentationml/non_visual_shape_properties.rb +27 -0
  647. data/lib/uniword/presentationml/notes.rb +27 -0
  648. data/lib/uniword/presentationml/notes_master_id_list.rb +22 -0
  649. data/lib/uniword/presentationml/notes_size.rb +24 -0
  650. data/lib/uniword/presentationml/ole_object.rb +26 -0
  651. data/lib/uniword/presentationml/paragraph.rb +31 -0
  652. data/lib/uniword/presentationml/paragraph_properties.rb +30 -0
  653. data/lib/uniword/presentationml/parallel_time_node.rb +23 -0
  654. data/lib/uniword/presentationml/picture.rb +27 -0
  655. data/lib/uniword/presentationml/presentation.rb +39 -0
  656. data/lib/uniword/presentationml/run.rb +25 -0
  657. data/lib/uniword/presentationml/run_properties.rb +34 -0
  658. data/lib/uniword/presentationml/sequence_time_node.rb +27 -0
  659. data/lib/uniword/presentationml/shape.rb +27 -0
  660. data/lib/uniword/presentationml/shape_properties.rb +31 -0
  661. data/lib/uniword/presentationml/shape_tree.rb +35 -0
  662. data/lib/uniword/presentationml/slide.rb +33 -0
  663. data/lib/uniword/presentationml/slide_id.rb +24 -0
  664. data/lib/uniword/presentationml/slide_id_list.rb +23 -0
  665. data/lib/uniword/presentationml/slide_layout.rb +33 -0
  666. data/lib/uniword/presentationml/slide_master.rb +33 -0
  667. data/lib/uniword/presentationml/slide_master_id.rb +24 -0
  668. data/lib/uniword/presentationml/slide_master_id_list.rb +23 -0
  669. data/lib/uniword/presentationml/slide_size.rb +26 -0
  670. data/lib/uniword/presentationml/start_conditions_list.rb +23 -0
  671. data/lib/uniword/presentationml/text_body.rb +27 -0
  672. data/lib/uniword/presentationml/time_node_list.rb +25 -0
  673. data/lib/uniword/presentationml/timing.rb +25 -0
  674. data/lib/uniword/presentationml/transition.rb +33 -0
  675. data/lib/uniword/presentationml/video.rb +24 -0
  676. data/lib/uniword/presentationml.rb +67 -0
  677. data/lib/uniword/properties/alignment.rb +26 -0
  678. data/lib/uniword/properties/bold.rb +40 -0
  679. data/lib/uniword/properties/boolean_formatting.rb +214 -0
  680. data/lib/uniword/properties/border.rb +48 -0
  681. data/lib/uniword/properties/borders.rb +39 -0
  682. data/lib/uniword/properties/cell_vertical_align.rb +32 -0
  683. data/lib/uniword/properties/cell_width.rb +28 -0
  684. data/lib/uniword/properties/character_spacing.rb +34 -0
  685. data/lib/uniword/properties/color_value.rb +57 -0
  686. data/lib/uniword/properties/contextual_spacing.rb +32 -0
  687. data/lib/uniword/properties/emphasis_mark.rb +35 -0
  688. data/lib/uniword/properties/font_size.rb +26 -0
  689. data/lib/uniword/properties/highlight.rb +28 -0
  690. data/lib/uniword/properties/indentation.rb +28 -0
  691. data/lib/uniword/properties/italic.rb +40 -0
  692. data/lib/uniword/properties/kerning.rb +34 -0
  693. data/lib/uniword/properties/language.rb +39 -0
  694. data/lib/uniword/properties/margin.rb +22 -0
  695. data/lib/uniword/properties/numbering_id.rb +26 -0
  696. data/lib/uniword/properties/numbering_level.rb +26 -0
  697. data/lib/uniword/properties/numbering_properties.rb +25 -0
  698. data/lib/uniword/properties/outline.rb +33 -0
  699. data/lib/uniword/properties/outline_level.rb +26 -0
  700. data/lib/uniword/properties/position.rb +33 -0
  701. data/lib/uniword/properties/run_fonts.rb +38 -0
  702. data/lib/uniword/properties/shading.rb +41 -0
  703. data/lib/uniword/properties/spacing.rb +28 -0
  704. data/lib/uniword/properties/style_reference.rb +81 -0
  705. data/lib/uniword/properties/tab_stop.rb +45 -0
  706. data/lib/uniword/properties/table_cell_margin.rb +33 -0
  707. data/lib/uniword/properties/table_indent.rb +23 -0
  708. data/lib/uniword/properties/table_justification.rb +22 -0
  709. data/lib/uniword/properties/table_look.rb +36 -0
  710. data/lib/uniword/properties/table_width.rb +28 -0
  711. data/lib/uniword/properties/tabs.rb +64 -0
  712. data/lib/uniword/properties/text_fill.rb +38 -0
  713. data/lib/uniword/properties/text_outline.rb +34 -0
  714. data/lib/uniword/properties/underline.rb +32 -0
  715. data/lib/uniword/properties/vertical_align.rb +26 -0
  716. data/lib/uniword/properties/width_scale.rb +34 -0
  717. data/lib/uniword/properties.rb +71 -0
  718. data/lib/uniword/quality/document_checker.rb +150 -0
  719. data/lib/uniword/quality/quality_report.rb +317 -0
  720. data/lib/uniword/quality/quality_rule.rb +153 -0
  721. data/lib/uniword/quality/rules/heading_hierarchy_rule.rb +83 -0
  722. data/lib/uniword/quality/rules/image_alt_text_rule.rb +87 -0
  723. data/lib/uniword/quality/rules/link_validation_rule.rb +136 -0
  724. data/lib/uniword/quality/rules/paragraph_length_rule.rb +77 -0
  725. data/lib/uniword/quality/rules/style_consistency_rule.rb +116 -0
  726. data/lib/uniword/quality/rules/table_header_rule.rb +69 -0
  727. data/lib/uniword/quality.rb +16 -0
  728. data/lib/uniword/resource/cache.rb +82 -0
  729. data/lib/uniword/resource/cache_paths.rb +29 -0
  730. data/lib/uniword/resource/cache_version.rb +49 -0
  731. data/lib/uniword/resource/color_transformer.rb +134 -0
  732. data/lib/uniword/resource/font_substitutor.rb +60 -0
  733. data/lib/uniword/resource/importer.rb +114 -0
  734. data/lib/uniword/resource/resource_location.rb +35 -0
  735. data/lib/uniword/resource/resource_resolver.rb +100 -0
  736. data/lib/uniword/resource/theme_processor.rb +107 -0
  737. data/lib/uniword/resource.rb +19 -0
  738. data/lib/uniword/revision.rb +200 -0
  739. data/lib/uniword/schema/model_generator.rb +182 -0
  740. data/lib/uniword/schema/schema_loader.rb +90 -0
  741. data/lib/uniword/schema.rb +8 -0
  742. data/lib/uniword/section.rb +183 -0
  743. data/lib/uniword/section_properties.rb +180 -0
  744. data/lib/uniword/serialization/ooxml_serializer.rb +30 -0
  745. data/lib/uniword/shading.rb +109 -0
  746. data/lib/uniword/shared_types/angle.rb +22 -0
  747. data/lib/uniword/shared_types/boolean_value.rb +24 -0
  748. data/lib/uniword/shared_types/decimal_number.rb +22 -0
  749. data/lib/uniword/shared_types/emu_measure.rb +22 -0
  750. data/lib/uniword/shared_types/fixed_percentage.rb +22 -0
  751. data/lib/uniword/shared_types/hex_color.rb +22 -0
  752. data/lib/uniword/shared_types/on_off.rb +24 -0
  753. data/lib/uniword/shared_types/percent_value.rb +22 -0
  754. data/lib/uniword/shared_types/pixel_measure.rb +22 -0
  755. data/lib/uniword/shared_types/point_measure.rb +22 -0
  756. data/lib/uniword/shared_types/positive_percentage.rb +22 -0
  757. data/lib/uniword/shared_types/string_type.rb +22 -0
  758. data/lib/uniword/shared_types/text_alignment.rb +22 -0
  759. data/lib/uniword/shared_types/twips_measure.rb +22 -0
  760. data/lib/uniword/shared_types/vertical_alignment.rb +22 -0
  761. data/lib/uniword/shared_types.rb +31 -0
  762. data/lib/uniword/spreadsheetml/alignment.rb +32 -0
  763. data/lib/uniword/spreadsheetml/authors.rb +23 -0
  764. data/lib/uniword/spreadsheetml/auto_filter.rb +25 -0
  765. data/lib/uniword/spreadsheetml/bold.rb +22 -0
  766. data/lib/uniword/spreadsheetml/book_views.rb +23 -0
  767. data/lib/uniword/spreadsheetml/border.rb +31 -0
  768. data/lib/uniword/spreadsheetml/borders.rb +25 -0
  769. data/lib/uniword/spreadsheetml/calc_properties.rb +26 -0
  770. data/lib/uniword/spreadsheetml/cell.rb +31 -0
  771. data/lib/uniword/spreadsheetml/cell_format.rb +41 -0
  772. data/lib/uniword/spreadsheetml/cell_formats.rb +25 -0
  773. data/lib/uniword/spreadsheetml/cell_formula.rb +28 -0
  774. data/lib/uniword/spreadsheetml/cell_style.rb +31 -0
  775. data/lib/uniword/spreadsheetml/cell_style_xfs.rb +23 -0
  776. data/lib/uniword/spreadsheetml/cell_styles.rb +23 -0
  777. data/lib/uniword/spreadsheetml/cell_value.rb +22 -0
  778. data/lib/uniword/spreadsheetml/chartsheet.rb +25 -0
  779. data/lib/uniword/spreadsheetml/col.rb +32 -0
  780. data/lib/uniword/spreadsheetml/col_breaks.rb +25 -0
  781. data/lib/uniword/spreadsheetml/color.rb +28 -0
  782. data/lib/uniword/spreadsheetml/color_filter.rb +23 -0
  783. data/lib/uniword/spreadsheetml/colors.rb +21 -0
  784. data/lib/uniword/spreadsheetml/cols.rb +23 -0
  785. data/lib/uniword/spreadsheetml/comment.rb +27 -0
  786. data/lib/uniword/spreadsheetml/comment_list.rb +23 -0
  787. data/lib/uniword/spreadsheetml/comments.rb +25 -0
  788. data/lib/uniword/spreadsheetml/conditional_formatting.rb +25 -0
  789. data/lib/uniword/spreadsheetml/conditional_formatting_rule.rb +27 -0
  790. data/lib/uniword/spreadsheetml/custom_filter.rb +23 -0
  791. data/lib/uniword/spreadsheetml/custom_filters.rb +23 -0
  792. data/lib/uniword/spreadsheetml/custom_workbook_views.rb +23 -0
  793. data/lib/uniword/spreadsheetml/data_validation.rb +43 -0
  794. data/lib/uniword/spreadsheetml/data_validations.rb +25 -0
  795. data/lib/uniword/spreadsheetml/date_group_item.rb +33 -0
  796. data/lib/uniword/spreadsheetml/defined_name.rb +28 -0
  797. data/lib/uniword/spreadsheetml/defined_names.rb +23 -0
  798. data/lib/uniword/spreadsheetml/dimension.rb +22 -0
  799. data/lib/uniword/spreadsheetml/drawing.rb +22 -0
  800. data/lib/uniword/spreadsheetml/dynamic_filter.rb +25 -0
  801. data/lib/uniword/spreadsheetml/external_reference.rb +21 -0
  802. data/lib/uniword/spreadsheetml/external_references.rb +23 -0
  803. data/lib/uniword/spreadsheetml/file_sharing.rb +22 -0
  804. data/lib/uniword/spreadsheetml/file_version.rb +24 -0
  805. data/lib/uniword/spreadsheetml/fill.rb +23 -0
  806. data/lib/uniword/spreadsheetml/fills.rb +25 -0
  807. data/lib/uniword/spreadsheetml/filter.rb +21 -0
  808. data/lib/uniword/spreadsheetml/filter_column.rb +37 -0
  809. data/lib/uniword/spreadsheetml/filters.rb +27 -0
  810. data/lib/uniword/spreadsheetml/font.rb +31 -0
  811. data/lib/uniword/spreadsheetml/font_name.rb +22 -0
  812. data/lib/uniword/spreadsheetml/font_size.rb +22 -0
  813. data/lib/uniword/spreadsheetml/fonts.rb +25 -0
  814. data/lib/uniword/spreadsheetml/hyperlink.rb +30 -0
  815. data/lib/uniword/spreadsheetml/hyperlinks.rb +23 -0
  816. data/lib/uniword/spreadsheetml/icon_filter.rb +23 -0
  817. data/lib/uniword/spreadsheetml/italic.rb +22 -0
  818. data/lib/uniword/spreadsheetml/legacy_drawing.rb +22 -0
  819. data/lib/uniword/spreadsheetml/merge_cell.rb +22 -0
  820. data/lib/uniword/spreadsheetml/merge_cells.rb +25 -0
  821. data/lib/uniword/spreadsheetml/number_format.rb +24 -0
  822. data/lib/uniword/spreadsheetml/number_formats.rb +25 -0
  823. data/lib/uniword/spreadsheetml/ole_object.rb +24 -0
  824. data/lib/uniword/spreadsheetml/ole_objects.rb +23 -0
  825. data/lib/uniword/spreadsheetml/ole_size.rb +21 -0
  826. data/lib/uniword/spreadsheetml/pattern_fill.rb +27 -0
  827. data/lib/uniword/spreadsheetml/phonetic_pr.rb +35 -0
  828. data/lib/uniword/spreadsheetml/phonetic_properties.rb +24 -0
  829. data/lib/uniword/spreadsheetml/pivot_caches.rb +23 -0
  830. data/lib/uniword/spreadsheetml/pivot_table.rb +24 -0
  831. data/lib/uniword/spreadsheetml/pivot_table_definition.rb +26 -0
  832. data/lib/uniword/spreadsheetml/protected_ranges.rb +23 -0
  833. data/lib/uniword/spreadsheetml/query_table.rb +24 -0
  834. data/lib/uniword/spreadsheetml/rich_text_run.rb +25 -0
  835. data/lib/uniword/spreadsheetml/row.rb +33 -0
  836. data/lib/uniword/spreadsheetml/row_breaks.rb +25 -0
  837. data/lib/uniword/spreadsheetml/run_properties.rb +29 -0
  838. data/lib/uniword/spreadsheetml/scenarios.rb +27 -0
  839. data/lib/uniword/spreadsheetml/shared_string_table.rb +27 -0
  840. data/lib/uniword/spreadsheetml/sheet.rb +28 -0
  841. data/lib/uniword/spreadsheetml/sheet_data.rb +23 -0
  842. data/lib/uniword/spreadsheetml/sheet_format_pr.rb +33 -0
  843. data/lib/uniword/spreadsheetml/sheet_protection.rb +28 -0
  844. data/lib/uniword/spreadsheetml/sheet_view.rb +30 -0
  845. data/lib/uniword/spreadsheetml/sheet_views.rb +23 -0
  846. data/lib/uniword/spreadsheetml/sheets.rb +23 -0
  847. data/lib/uniword/spreadsheetml/sort_condition.rb +33 -0
  848. data/lib/uniword/spreadsheetml/sort_state.rb +23 -0
  849. data/lib/uniword/spreadsheetml/sparkline_group.rb +24 -0
  850. data/lib/uniword/spreadsheetml/sparkline_groups.rb +23 -0
  851. data/lib/uniword/spreadsheetml/string_item.rb +27 -0
  852. data/lib/uniword/spreadsheetml/table.rb +35 -0
  853. data/lib/uniword/spreadsheetml/table_column.rb +24 -0
  854. data/lib/uniword/spreadsheetml/table_columns.rb +25 -0
  855. data/lib/uniword/spreadsheetml/table_formula.rb +23 -0
  856. data/lib/uniword/spreadsheetml/table_parts.rb +23 -0
  857. data/lib/uniword/spreadsheetml/table_style_info.rb +30 -0
  858. data/lib/uniword/spreadsheetml/table_styles.rb +23 -0
  859. data/lib/uniword/spreadsheetml/text.rb +24 -0
  860. data/lib/uniword/spreadsheetml/top10.rb +27 -0
  861. data/lib/uniword/spreadsheetml/workbook.rb +31 -0
  862. data/lib/uniword/spreadsheetml/workbook_properties.rb +26 -0
  863. data/lib/uniword/spreadsheetml/workbook_protection.rb +24 -0
  864. data/lib/uniword/spreadsheetml/workbook_view.rb +26 -0
  865. data/lib/uniword/spreadsheetml/worksheet/sheet_format_pr.rb +35 -0
  866. data/lib/uniword/spreadsheetml/worksheet.rb +33 -0
  867. data/lib/uniword/spreadsheetml.rb +121 -0
  868. data/lib/uniword/streaming_parser.rb +277 -0
  869. data/lib/uniword/styles.rb +14 -0
  870. data/lib/uniword/styleset.rb +166 -0
  871. data/lib/uniword/stylesets/package.rb +107 -0
  872. data/lib/uniword/stylesets/styleset_importer.rb +96 -0
  873. data/lib/uniword/stylesets/yaml_styleset_loader.rb +58 -0
  874. data/lib/uniword/stylesets.rb +9 -0
  875. data/lib/uniword/tab_stop.rb +85 -0
  876. data/lib/uniword/table_border.rb +87 -0
  877. data/lib/uniword/template/helpers/conditional_helper.rb +107 -0
  878. data/lib/uniword/template/helpers/filter_helper.rb +124 -0
  879. data/lib/uniword/template/helpers/loop_helper.rb +119 -0
  880. data/lib/uniword/template/helpers/variable_helper.rb +85 -0
  881. data/lib/uniword/template/helpers.rb +12 -0
  882. data/lib/uniword/template/template.rb +147 -0
  883. data/lib/uniword/template/template_context.rb +103 -0
  884. data/lib/uniword/template/template_marker.rb +121 -0
  885. data/lib/uniword/template/template_parser.rb +186 -0
  886. data/lib/uniword/template/template_renderer.rb +204 -0
  887. data/lib/uniword/template/template_validator.rb +202 -0
  888. data/lib/uniword/template/variable_resolver.rb +195 -0
  889. data/lib/uniword/template.rb +14 -0
  890. data/lib/uniword/text_box.rb +55 -0
  891. data/lib/uniword/text_frame.rb +168 -0
  892. data/lib/uniword/theme/media_file.rb +128 -0
  893. data/lib/uniword/theme/theme_applicator.rb +141 -0
  894. data/lib/uniword/theme/theme_loader.rb +107 -0
  895. data/lib/uniword/theme/theme_package_reader.rb +102 -0
  896. data/lib/uniword/theme/theme_variant.rb +87 -0
  897. data/lib/uniword/theme/theme_xml_parser.rb +239 -0
  898. data/lib/uniword/theme_writer.rb +58 -0
  899. data/lib/uniword/themes/theme.rb +159 -0
  900. data/lib/uniword/themes/theme_importer.rb +138 -0
  901. data/lib/uniword/themes/theme_transformation.rb +202 -0
  902. data/lib/uniword/themes.rb +23 -0
  903. data/lib/uniword/tracked_changes.rb +231 -0
  904. data/lib/uniword/transformation/html_to_ooxml_converter.rb +541 -0
  905. data/lib/uniword/transformation/hyperlink_transformation_rule.rb +72 -0
  906. data/lib/uniword/transformation/image_transformation_rule.rb +69 -0
  907. data/lib/uniword/transformation/ooxml_to_html_converter.rb +172 -0
  908. data/lib/uniword/transformation/ooxml_to_mhtml_converter.rb +1406 -0
  909. data/lib/uniword/transformation/paragraph_transformation_rule.rb +166 -0
  910. data/lib/uniword/transformation/run_transformation_rule.rb +76 -0
  911. data/lib/uniword/transformation/table_transformation_rule.rb +120 -0
  912. data/lib/uniword/transformation/transformation_rule.rb +91 -0
  913. data/lib/uniword/transformation/transformation_rule_registry.rb +133 -0
  914. data/lib/uniword/transformation/transformer.rb +386 -0
  915. data/lib/uniword/transformation.rb +18 -0
  916. data/lib/uniword/validation/checkers/external_link_checker.rb +200 -0
  917. data/lib/uniword/validation/checkers/file_reference_checker.rb +196 -0
  918. data/lib/uniword/validation/checkers/footnote_reference_checker.rb +178 -0
  919. data/lib/uniword/validation/checkers/internal_link_checker.rb +181 -0
  920. data/lib/uniword/validation/checkers.rb +12 -0
  921. data/lib/uniword/validation/document_validator.rb +272 -0
  922. data/lib/uniword/validation/layer_validation_result.rb +157 -0
  923. data/lib/uniword/validation/layer_validator.rb +104 -0
  924. data/lib/uniword/validation/link_checker.rb +94 -0
  925. data/lib/uniword/validation/link_validator.rb +318 -0
  926. data/lib/uniword/validation/validation_report.rb +409 -0
  927. data/lib/uniword/validation/validation_result.rb +215 -0
  928. data/lib/uniword/validation/validators/content_type_validator.rb +159 -0
  929. data/lib/uniword/validation/validators/document_semantics_validator.rb +152 -0
  930. data/lib/uniword/validation/validators/file_structure_validator.rb +101 -0
  931. data/lib/uniword/validation/validators/ooxml_part_validator.rb +128 -0
  932. data/lib/uniword/validation/validators/relationship_validator.rb +146 -0
  933. data/lib/uniword/validation/validators/xml_schema_validator.rb +120 -0
  934. data/lib/uniword/validation/validators/zip_integrity_validator.rb +110 -0
  935. data/lib/uniword/validation/validators.rb +15 -0
  936. data/lib/uniword/validation.rb +15 -0
  937. data/lib/uniword/validators/element_validator.rb +97 -0
  938. data/lib/uniword/validators/paragraph_validator.rb +122 -0
  939. data/lib/uniword/validators/table_validator.rb +140 -0
  940. data/lib/uniword/validators.rb +9 -0
  941. data/lib/uniword/version.rb +5 -0
  942. data/lib/uniword/visitor/base_visitor.rb +81 -0
  943. data/lib/uniword/visitor/text_extractor.rb +119 -0
  944. data/lib/uniword/visitor.rb +8 -0
  945. data/lib/uniword/vml/arc.rb +41 -0
  946. data/lib/uniword/vml/background.rb +33 -0
  947. data/lib/uniword/vml/curve.rb +36 -0
  948. data/lib/uniword/vml/fill.rb +32 -0
  949. data/lib/uniword/vml/formula.rb +23 -0
  950. data/lib/uniword/vml/formulas.rb +24 -0
  951. data/lib/uniword/vml/group.rb +30 -0
  952. data/lib/uniword/vml/handle.rb +39 -0
  953. data/lib/uniword/vml/handles.rb +24 -0
  954. data/lib/uniword/vml/image.rb +47 -0
  955. data/lib/uniword/vml/imagedata.rb +34 -0
  956. data/lib/uniword/vml/line.rb +34 -0
  957. data/lib/uniword/vml/oval.rb +34 -0
  958. data/lib/uniword/vml/path.rb +28 -0
  959. data/lib/uniword/vml/polyline.rb +32 -0
  960. data/lib/uniword/vml/rect.rb +34 -0
  961. data/lib/uniword/vml/roundrect.rb +39 -0
  962. data/lib/uniword/vml/shadow.rb +33 -0
  963. data/lib/uniword/vml/shape.rb +73 -0
  964. data/lib/uniword/vml/shapetype.rb +32 -0
  965. data/lib/uniword/vml/stroke.rb +34 -0
  966. data/lib/uniword/vml/textbox.rb +28 -0
  967. data/lib/uniword/vml/textpath.rb +25 -0
  968. data/lib/uniword/vml/wrap.rb +24 -0
  969. data/lib/uniword/vml.rb +39 -0
  970. data/lib/uniword/vml_office/vml_anchor_lock.rb +22 -0
  971. data/lib/uniword/vml_office/vml_bottom.rb +24 -0
  972. data/lib/uniword/vml_office/vml_callout.rb +35 -0
  973. data/lib/uniword/vml_office/vml_clip_path.rb +24 -0
  974. data/lib/uniword/vml_office/vml_color_mru.rb +24 -0
  975. data/lib/uniword/vml_office/vml_column.rb +24 -0
  976. data/lib/uniword/vml_office/vml_complex.rb +22 -0
  977. data/lib/uniword/vml_office/vml_complex_extension.rb +24 -0
  978. data/lib/uniword/vml_office/vml_diagram.rb +32 -0
  979. data/lib/uniword/vml_office/vml_entry.rb +24 -0
  980. data/lib/uniword/vml_office/vml_extrusion.rb +43 -0
  981. data/lib/uniword/vml_office/vml_id_map.rb +24 -0
  982. data/lib/uniword/vml_office/vml_ink.rb +26 -0
  983. data/lib/uniword/vml_office/vml_left.rb +24 -0
  984. data/lib/uniword/vml_office/vml_lock.rb +37 -0
  985. data/lib/uniword/vml_office/vml_office_fill.rb +32 -0
  986. data/lib/uniword/vml_office/vml_proxy.rb +28 -0
  987. data/lib/uniword/vml_office/vml_regroup.rb +22 -0
  988. data/lib/uniword/vml_office/vml_relation_table.rb +24 -0
  989. data/lib/uniword/vml_office/vml_right.rb +24 -0
  990. data/lib/uniword/vml_office/vml_rule.rb +26 -0
  991. data/lib/uniword/vml_office/vml_rules.rb +24 -0
  992. data/lib/uniword/vml_office/vml_shape_defaults.rb +53 -0
  993. data/lib/uniword/vml_office/vml_shape_layout.rb +70 -0
  994. data/lib/uniword/vml_office/vml_signature_line.rb +38 -0
  995. data/lib/uniword/vml_office/vml_skew.rb +29 -0
  996. data/lib/uniword/vml_office/vml_top.rb +24 -0
  997. data/lib/uniword/vml_office/vml_wrap_block.rb +24 -0
  998. data/lib/uniword/vml_office/vml_wrap_coords.rb +22 -0
  999. data/lib/uniword/vml_office.rb +47 -0
  1000. data/lib/uniword/vml_word/border_bottom.rb +29 -0
  1001. data/lib/uniword/vml_word/border_left.rb +29 -0
  1002. data/lib/uniword/vml_word/border_right.rb +29 -0
  1003. data/lib/uniword/vml_word/border_top.rb +29 -0
  1004. data/lib/uniword/vml_word.rb +17 -0
  1005. data/lib/uniword/warnings/warning.rb +130 -0
  1006. data/lib/uniword/warnings/warning_collector.rb +229 -0
  1007. data/lib/uniword/warnings/warning_report.rb +159 -0
  1008. data/lib/uniword/warnings.rb +9 -0
  1009. data/lib/uniword/word2010_ext/wrap.rb +26 -0
  1010. data/lib/uniword/word2010_ext.rb +14 -0
  1011. data/lib/uniword/word_implementation.rb +58 -0
  1012. data/lib/uniword/word_implementation_factory.rb +15 -0
  1013. data/lib/uniword/word_implementation_linux.rb +42 -0
  1014. data/lib/uniword/word_implementation_macos.rb +41 -0
  1015. data/lib/uniword/word_implementation_null.rb +34 -0
  1016. data/lib/uniword/word_implementation_windows.rb +75 -0
  1017. data/lib/uniword/wordprocessing_group.rb +29 -0
  1018. data/lib/uniword/wordprocessing_shape.rb +48 -0
  1019. data/lib/uniword/wordprocessingml/abstract_num.rb +27 -0
  1020. data/lib/uniword/wordprocessingml/abstract_num_id.rb +22 -0
  1021. data/lib/uniword/wordprocessingml/alternate_content.rb +24 -0
  1022. data/lib/uniword/wordprocessingml/anchor.rb +35 -0
  1023. data/lib/uniword/wordprocessingml/based_on.rb +22 -0
  1024. data/lib/uniword/wordprocessingml/body.rb +95 -0
  1025. data/lib/uniword/wordprocessingml/bookmark_end.rb +22 -0
  1026. data/lib/uniword/wordprocessingml/bookmark_start.rb +24 -0
  1027. data/lib/uniword/wordprocessingml/border.rb +30 -0
  1028. data/lib/uniword/wordprocessingml/break.rb +24 -0
  1029. data/lib/uniword/wordprocessingml/carriage_return.rb +17 -0
  1030. data/lib/uniword/wordprocessingml/character_style.rb +199 -0
  1031. data/lib/uniword/wordprocessingml/choice.rb +24 -0
  1032. data/lib/uniword/wordprocessingml/cnf_style.rb +52 -0
  1033. data/lib/uniword/wordprocessingml/columns.rb +26 -0
  1034. data/lib/uniword/wordprocessingml/comment_range_end.rb +22 -0
  1035. data/lib/uniword/wordprocessingml/comment_range_start.rb +22 -0
  1036. data/lib/uniword/wordprocessingml/comment_reference.rb +22 -0
  1037. data/lib/uniword/wordprocessingml/compat.rb +35 -0
  1038. data/lib/uniword/wordprocessingml/compat_setting.rb +26 -0
  1039. data/lib/uniword/wordprocessingml/deleted_text.rb +29 -0
  1040. data/lib/uniword/wordprocessingml/doc_defaults.rb +25 -0
  1041. data/lib/uniword/wordprocessingml/doc_grid.rb +25 -0
  1042. data/lib/uniword/wordprocessingml/doc_pr.rb +26 -0
  1043. data/lib/uniword/wordprocessingml/document_root.rb +251 -0
  1044. data/lib/uniword/wordprocessingml/drawing.rb +24 -0
  1045. data/lib/uniword/wordprocessingml/emboss.rb +24 -0
  1046. data/lib/uniword/wordprocessingml/endnote.rb +27 -0
  1047. data/lib/uniword/wordprocessingml/endnote_ref.rb +20 -0
  1048. data/lib/uniword/wordprocessingml/endnote_reference.rb +22 -0
  1049. data/lib/uniword/wordprocessingml/endnotes.rb +23 -0
  1050. data/lib/uniword/wordprocessingml/extent.rb +24 -0
  1051. data/lib/uniword/wordprocessingml/fallback.rb +24 -0
  1052. data/lib/uniword/wordprocessingml/field_char.rb +24 -0
  1053. data/lib/uniword/wordprocessingml/font.rb +110 -0
  1054. data/lib/uniword/wordprocessingml/font_table.rb +30 -0
  1055. data/lib/uniword/wordprocessingml/fonts.rb +23 -0
  1056. data/lib/uniword/wordprocessingml/footer.rb +25 -0
  1057. data/lib/uniword/wordprocessingml/footer_reference.rb +27 -0
  1058. data/lib/uniword/wordprocessingml/footnote.rb +27 -0
  1059. data/lib/uniword/wordprocessingml/footnote_ref.rb +20 -0
  1060. data/lib/uniword/wordprocessingml/footnote_reference.rb +22 -0
  1061. data/lib/uniword/wordprocessingml/footnotes.rb +23 -0
  1062. data/lib/uniword/wordprocessingml/graphic.rb +23 -0
  1063. data/lib/uniword/wordprocessingml/graphic_data.rb +22 -0
  1064. data/lib/uniword/wordprocessingml/grid_after.rb +17 -0
  1065. data/lib/uniword/wordprocessingml/grid_before.rb +17 -0
  1066. data/lib/uniword/wordprocessingml/grid_col.rb +22 -0
  1067. data/lib/uniword/wordprocessingml/header.rb +25 -0
  1068. data/lib/uniword/wordprocessingml/header_reference.rb +27 -0
  1069. data/lib/uniword/wordprocessingml/hyperlink.rb +73 -0
  1070. data/lib/uniword/wordprocessingml/imprint.rb +24 -0
  1071. data/lib/uniword/wordprocessingml/inline.rb +27 -0
  1072. data/lib/uniword/wordprocessingml/instr_text.rb +32 -0
  1073. data/lib/uniword/wordprocessingml/last_rendered_page_break.rb +16 -0
  1074. data/lib/uniword/wordprocessingml/latent_styles.rb +59 -0
  1075. data/lib/uniword/wordprocessingml/level.rb +103 -0
  1076. data/lib/uniword/wordprocessingml/link.rb +22 -0
  1077. data/lib/uniword/wordprocessingml/lvl_jc.rb +22 -0
  1078. data/lib/uniword/wordprocessingml/lvl_text.rb +22 -0
  1079. data/lib/uniword/wordprocessingml/mc_requires.rb +11 -0
  1080. data/lib/uniword/wordprocessingml/multi_level_type.rb +22 -0
  1081. data/lib/uniword/wordprocessingml/next.rb +22 -0
  1082. data/lib/uniword/wordprocessingml/no_break_hyphen.rb +17 -0
  1083. data/lib/uniword/wordprocessingml/no_wrap.rb +16 -0
  1084. data/lib/uniword/wordprocessingml/num.rb +25 -0
  1085. data/lib/uniword/wordprocessingml/num_fmt.rb +22 -0
  1086. data/lib/uniword/wordprocessingml/numbering.rb +25 -0
  1087. data/lib/uniword/wordprocessingml/numbering_configuration.rb +173 -0
  1088. data/lib/uniword/wordprocessingml/numbering_definition.rb +155 -0
  1089. data/lib/uniword/wordprocessingml/numbering_elements.rb +78 -0
  1090. data/lib/uniword/wordprocessingml/numbering_instance.rb +55 -0
  1091. data/lib/uniword/wordprocessingml/numbering_level.rb +90 -0
  1092. data/lib/uniword/wordprocessingml/object.rb +24 -0
  1093. data/lib/uniword/wordprocessingml/outline.rb +24 -0
  1094. data/lib/uniword/wordprocessingml/p_pr_default.rb +23 -0
  1095. data/lib/uniword/wordprocessingml/page_margins.rb +34 -0
  1096. data/lib/uniword/wordprocessingml/page_numbering.rb +24 -0
  1097. data/lib/uniword/wordprocessingml/page_size.rb +26 -0
  1098. data/lib/uniword/wordprocessingml/paragraph.rb +197 -0
  1099. data/lib/uniword/wordprocessingml/paragraph_borders.rb +58 -0
  1100. data/lib/uniword/wordprocessingml/paragraph_properties.rb +339 -0
  1101. data/lib/uniword/wordprocessingml/paragraph_style.rb +163 -0
  1102. data/lib/uniword/wordprocessingml/pict.rb +23 -0
  1103. data/lib/uniword/wordprocessingml/picture.rb +27 -0
  1104. data/lib/uniword/wordprocessingml/position_tab.rb +26 -0
  1105. data/lib/uniword/wordprocessingml/proof_err.rb +20 -0
  1106. data/lib/uniword/wordprocessingml/r_pr_default.rb +23 -0
  1107. data/lib/uniword/wordprocessingml/recipient_data.rb +25 -0
  1108. data/lib/uniword/wordprocessingml/recipients.rb +21 -0
  1109. data/lib/uniword/wordprocessingml/run.rb +254 -0
  1110. data/lib/uniword/wordprocessingml/run_properties.rb +701 -0
  1111. data/lib/uniword/wordprocessingml/section_properties.rb +55 -0
  1112. data/lib/uniword/wordprocessingml/semi_hidden.rb +27 -0
  1113. data/lib/uniword/wordprocessingml/settings.rb +606 -0
  1114. data/lib/uniword/wordprocessingml/shading.rb +30 -0
  1115. data/lib/uniword/wordprocessingml/shadow.rb +24 -0
  1116. data/lib/uniword/wordprocessingml/shape.rb +26 -0
  1117. data/lib/uniword/wordprocessingml/simple_field.rb +27 -0
  1118. data/lib/uniword/wordprocessingml/simple_pos.rb +24 -0
  1119. data/lib/uniword/wordprocessingml/soft_hyphen.rb +17 -0
  1120. data/lib/uniword/wordprocessingml/start.rb +22 -0
  1121. data/lib/uniword/wordprocessingml/structured_document_tag/alias.rb +21 -0
  1122. data/lib/uniword/wordprocessingml/structured_document_tag/appearance.rb +22 -0
  1123. data/lib/uniword/wordprocessingml/structured_document_tag/bibliography.rb +18 -0
  1124. data/lib/uniword/wordprocessingml/structured_document_tag/content.rb +32 -0
  1125. data/lib/uniword/wordprocessingml/structured_document_tag/data_binding.rb +27 -0
  1126. data/lib/uniword/wordprocessingml/structured_document_tag/date.rb +75 -0
  1127. data/lib/uniword/wordprocessingml/structured_document_tag/doc_part_obj.rb +57 -0
  1128. data/lib/uniword/wordprocessingml/structured_document_tag/end_properties.rb +24 -0
  1129. data/lib/uniword/wordprocessingml/structured_document_tag/id.rb +21 -0
  1130. data/lib/uniword/wordprocessingml/structured_document_tag/placeholder.rb +33 -0
  1131. data/lib/uniword/wordprocessingml/structured_document_tag/run_properties.rb +83 -0
  1132. data/lib/uniword/wordprocessingml/structured_document_tag/showing_placeholder_header.rb +18 -0
  1133. data/lib/uniword/wordprocessingml/structured_document_tag/tag.rb +21 -0
  1134. data/lib/uniword/wordprocessingml/structured_document_tag/temporary.rb +19 -0
  1135. data/lib/uniword/wordprocessingml/structured_document_tag/text.rb +18 -0
  1136. data/lib/uniword/wordprocessingml/structured_document_tag.rb +62 -0
  1137. data/lib/uniword/wordprocessingml/structured_document_tag_properties.rb +53 -0
  1138. data/lib/uniword/wordprocessingml/style.rb +383 -0
  1139. data/lib/uniword/wordprocessingml/style_name.rb +45 -0
  1140. data/lib/uniword/wordprocessingml/styles/character_style_definition.rb +45 -0
  1141. data/lib/uniword/wordprocessingml/styles/list_style_definition.rb +74 -0
  1142. data/lib/uniword/wordprocessingml/styles/paragraph_style_definition.rb +54 -0
  1143. data/lib/uniword/wordprocessingml/styles/semantic_style.rb +58 -0
  1144. data/lib/uniword/wordprocessingml/styles/style_definition.rb +61 -0
  1145. data/lib/uniword/wordprocessingml/styles/style_library.rb +207 -0
  1146. data/lib/uniword/wordprocessingml/styles/table_style_definition.rb +60 -0
  1147. data/lib/uniword/wordprocessingml/styles.rb +13 -0
  1148. data/lib/uniword/wordprocessingml/styles_configuration.rb +352 -0
  1149. data/lib/uniword/wordprocessingml/symbol.rb +24 -0
  1150. data/lib/uniword/wordprocessingml/tab.rb +23 -0
  1151. data/lib/uniword/wordprocessingml/tab_stop.rb +58 -0
  1152. data/lib/uniword/wordprocessingml/table.rb +72 -0
  1153. data/lib/uniword/wordprocessingml/table_borders.rb +33 -0
  1154. data/lib/uniword/wordprocessingml/table_cell.rb +80 -0
  1155. data/lib/uniword/wordprocessingml/table_cell_borders.rb +29 -0
  1156. data/lib/uniword/wordprocessingml/table_cell_margin.rb +29 -0
  1157. data/lib/uniword/wordprocessingml/table_cell_properties.rb +60 -0
  1158. data/lib/uniword/wordprocessingml/table_grid.rb +23 -0
  1159. data/lib/uniword/wordprocessingml/table_properties.rb +352 -0
  1160. data/lib/uniword/wordprocessingml/table_row.rb +79 -0
  1161. data/lib/uniword/wordprocessingml/table_row_properties.rb +58 -0
  1162. data/lib/uniword/wordprocessingml/table_style.rb +20 -0
  1163. data/lib/uniword/wordprocessingml/text.rb +81 -0
  1164. data/lib/uniword/wordprocessingml/text_box_content.rb +27 -0
  1165. data/lib/uniword/wordprocessingml/text_direction.rb +19 -0
  1166. data/lib/uniword/wordprocessingml/tr_height.rb +21 -0
  1167. data/lib/uniword/wordprocessingml/ui_priority.rb +22 -0
  1168. data/lib/uniword/wordprocessingml/val_int.rb +18 -0
  1169. data/lib/uniword/wordprocessingml/w14_attributes.rb +47 -0
  1170. data/lib/uniword/wordprocessingml/web_settings.rb +43 -0
  1171. data/lib/uniword/wordprocessingml/width_after.rb +19 -0
  1172. data/lib/uniword/wordprocessingml/width_before.rb +19 -0
  1173. data/lib/uniword/wordprocessingml/zoom.rb +22 -0
  1174. data/lib/uniword/wordprocessingml.rb +237 -0
  1175. data/lib/uniword/wordprocessingml_2010/checkbox.rb +27 -0
  1176. data/lib/uniword/wordprocessingml_2010/checked_state.rb +24 -0
  1177. data/lib/uniword/wordprocessingml_2010/conditional_format_style.rb +30 -0
  1178. data/lib/uniword/wordprocessingml_2010/conflict_deletion.rb +26 -0
  1179. data/lib/uniword/wordprocessingml_2010/conflict_insertion.rb +26 -0
  1180. data/lib/uniword/wordprocessingml_2010/conflict_mode.rb +22 -0
  1181. data/lib/uniword/wordprocessingml_2010/custom_xml_conflict_insertion.rb +24 -0
  1182. data/lib/uniword/wordprocessingml_2010/doc_id.rb +22 -0
  1183. data/lib/uniword/wordprocessingml_2010/doc_part_gallery.rb +22 -0
  1184. data/lib/uniword/wordprocessingml_2010/doc_part_obj.rb +27 -0
  1185. data/lib/uniword/wordprocessingml_2010/entity_picker.rb +22 -0
  1186. data/lib/uniword/wordprocessingml_2010/ligatures.rb +22 -0
  1187. data/lib/uniword/wordprocessingml_2010/number_form.rb +22 -0
  1188. data/lib/uniword/wordprocessingml_2010/para_id.rb +22 -0
  1189. data/lib/uniword/wordprocessingml_2010/props3d.rb +26 -0
  1190. data/lib/uniword/wordprocessingml_2010/sdt_content.rb +23 -0
  1191. data/lib/uniword/wordprocessingml_2010/sdt_properties.rb +27 -0
  1192. data/lib/uniword/wordprocessingml_2010/structured_document_tag.rb +25 -0
  1193. data/lib/uniword/wordprocessingml_2010/text_fill.rb +27 -0
  1194. data/lib/uniword/wordprocessingml_2010/text_glow.rb +25 -0
  1195. data/lib/uniword/wordprocessingml_2010/text_id.rb +22 -0
  1196. data/lib/uniword/wordprocessingml_2010/text_outline.rb +28 -0
  1197. data/lib/uniword/wordprocessingml_2010/text_reflection.rb +28 -0
  1198. data/lib/uniword/wordprocessingml_2010/text_shadow.rb +28 -0
  1199. data/lib/uniword/wordprocessingml_2010/unchecked_state.rb +24 -0
  1200. data/lib/uniword/wordprocessingml_2010.rb +44 -0
  1201. data/lib/uniword/wordprocessingml_2013/chart_props.rb +25 -0
  1202. data/lib/uniword/wordprocessingml_2013/chart_tracking_ref_based.rb +22 -0
  1203. data/lib/uniword/wordprocessingml_2013/comment_author.rb +26 -0
  1204. data/lib/uniword/wordprocessingml_2013/comment_collapsed.rb +22 -0
  1205. data/lib/uniword/wordprocessingml_2013/comment_done.rb +22 -0
  1206. data/lib/uniword/wordprocessingml_2013/comment_ex.rb +26 -0
  1207. data/lib/uniword/wordprocessingml_2013/comments_ids.rb +23 -0
  1208. data/lib/uniword/wordprocessingml_2013/doc_part_anchor.rb +22 -0
  1209. data/lib/uniword/wordprocessingml_2013/document_part.rb +22 -0
  1210. data/lib/uniword/wordprocessingml_2013/footnote_columns.rb +22 -0
  1211. data/lib/uniword/wordprocessingml_2013/people_group.rb +25 -0
  1212. data/lib/uniword/wordprocessingml_2013/person.rb +26 -0
  1213. data/lib/uniword/wordprocessingml_2013/presence_info.rb +24 -0
  1214. data/lib/uniword/wordprocessingml_2013/repeating_section.rb +25 -0
  1215. data/lib/uniword/wordprocessingml_2013/repeating_section_item.rb +22 -0
  1216. data/lib/uniword/wordprocessingml_2013/sdt_appearance.rb +22 -0
  1217. data/lib/uniword/wordprocessingml_2013/sdt_color.rb +22 -0
  1218. data/lib/uniword/wordprocessingml_2013/sdt_data_binding.rb +24 -0
  1219. data/lib/uniword/wordprocessingml_2013/web_extension.rb +22 -0
  1220. data/lib/uniword/wordprocessingml_2013/web_extension_linked.rb +22 -0
  1221. data/lib/uniword/wordprocessingml_2013.rb +38 -0
  1222. data/lib/uniword/wordprocessingml_2016/cell_rsid.rb +22 -0
  1223. data/lib/uniword/wordprocessingml_2016/chart_color_style.rb +22 -0
  1224. data/lib/uniword/wordprocessingml_2016/chart_style2016.rb +22 -0
  1225. data/lib/uniword/wordprocessingml_2016/comments_ext.rb +24 -0
  1226. data/lib/uniword/wordprocessingml_2016/conflict_mode2016.rb +22 -0
  1227. data/lib/uniword/wordprocessingml_2016/content_id.rb +22 -0
  1228. data/lib/uniword/wordprocessingml_2016/data_binding2016.rb +26 -0
  1229. data/lib/uniword/wordprocessingml_2016/extension.rb +25 -0
  1230. data/lib/uniword/wordprocessingml_2016/extension_list.rb +23 -0
  1231. data/lib/uniword/wordprocessingml_2016/persistent_document_id.rb +22 -0
  1232. data/lib/uniword/wordprocessingml_2016/row_rsid.rb +22 -0
  1233. data/lib/uniword/wordprocessingml_2016/sdt_appearance2016.rb +22 -0
  1234. data/lib/uniword/wordprocessingml_2016/separator_extension.rb +22 -0
  1235. data/lib/uniword/wordprocessingml_2016/table_rsid.rb +22 -0
  1236. data/lib/uniword/wordprocessingml_2016/web_video_property.rb +24 -0
  1237. data/lib/uniword/wordprocessingml_2016.rb +33 -0
  1238. data/lib/uniword/wp_drawing/align.rb +22 -0
  1239. data/lib/uniword/wp_drawing/allow_overlap.rb +22 -0
  1240. data/lib/uniword/wp_drawing/anchor.rb +80 -0
  1241. data/lib/uniword/wp_drawing/behind_doc.rb +22 -0
  1242. data/lib/uniword/wp_drawing/c_nv_graphic_frame_pr.rb +23 -0
  1243. data/lib/uniword/wp_drawing/doc_pr.rb +30 -0
  1244. data/lib/uniword/wp_drawing/doc_properties.rb +27 -0
  1245. data/lib/uniword/wp_drawing/effect_extent.rb +28 -0
  1246. data/lib/uniword/wp_drawing/extent.rb +24 -0
  1247. data/lib/uniword/wp_drawing/hidden.rb +22 -0
  1248. data/lib/uniword/wp_drawing/inline.rb +38 -0
  1249. data/lib/uniword/wp_drawing/layout_in_cell.rb +22 -0
  1250. data/lib/uniword/wp_drawing/line_to.rb +24 -0
  1251. data/lib/uniword/wp_drawing/locked.rb +22 -0
  1252. data/lib/uniword/wp_drawing/non_visual_drawing_props.rb +20 -0
  1253. data/lib/uniword/wp_drawing/pos_offset.rb +22 -0
  1254. data/lib/uniword/wp_drawing/position_h.rb +27 -0
  1255. data/lib/uniword/wp_drawing/position_v.rb +27 -0
  1256. data/lib/uniword/wp_drawing/relative_height.rb +22 -0
  1257. data/lib/uniword/wp_drawing/simple_pos.rb +24 -0
  1258. data/lib/uniword/wp_drawing/size_rel_h.rb +25 -0
  1259. data/lib/uniword/wp_drawing/size_rel_v.rb +25 -0
  1260. data/lib/uniword/wp_drawing/start.rb +24 -0
  1261. data/lib/uniword/wp_drawing/wrap_none.rb +18 -0
  1262. data/lib/uniword/wp_drawing/wrap_polygon.rb +27 -0
  1263. data/lib/uniword/wp_drawing/wrap_square.rb +33 -0
  1264. data/lib/uniword/wp_drawing/wrap_through.rb +29 -0
  1265. data/lib/uniword/wp_drawing/wrap_tight.rb +29 -0
  1266. data/lib/uniword/wp_drawing/wrap_top_and_bottom.rb +27 -0
  1267. data/lib/uniword/wp_drawing.rb +55 -0
  1268. data/lib/uniword.rb +295 -0
  1269. metadata +1386 -0
@@ -0,0 +1,1406 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+
5
+ module Uniword
6
+ module Transformation
7
+ # Converts OOXML DocumentRoot to Mhtml::Document for full-fidelity MHT output.
8
+ #
9
+ # This is COMPLETELY SEPARATE from OoxmlToHtmlConverter which produces HTML5.
10
+ # This converter produces Word HTML4 with proper MIME multipart structure.
11
+ #
12
+ # @example Transform DOCX to MHT
13
+ # docx_doc = Uniword::Ooxml::DocxPackage.from_file("document.docx")
14
+ # mhtml_doc = OoxmlToMhtmlConverter.document_to_mht(docx_doc)
15
+ # output = Uniword::Infrastructure::MimePackager.new(mhtml_doc).build_mime_content
16
+ #
17
+ class OoxmlToMhtmlConverter
18
+ # Convert OOXML DocumentRoot to Mhtml::Document
19
+ #
20
+ # @param document [Uniword::Wordprocessingml::DocumentRoot] OOXML document
21
+ # @param core_properties [Uniword::Ooxml::CoreProperties] Optional core properties
22
+ # (if not provided, uses document.core_properties which may be lazily initialized)
23
+ # @param relationships [Uniword::Ooxml::Relationships::PackageRelationships] Optional relationships
24
+ # @param document_name [String] Optional document name (e.g., 'blank'). If not provided,
25
+ # extracts from relationships or defaults to 'document'
26
+ # @return [Uniword::Mhtml::Document] MHT document model
27
+ def self.document_to_mht(document, core_properties = nil, relationships = nil,
28
+ document_name = nil)
29
+ converter = new(document, core_properties, relationships, document_name)
30
+ converter.build_mhtml_document
31
+ end
32
+
33
+ # Convert OOXML DocumentRoot to HTML body content (for Mhtml::HtmlPart)
34
+ #
35
+ # @param document [Uniword::Wordprocessingml::DocumentRoot] OOXML document
36
+ # @param core_properties [Uniword::Ooxml::CoreProperties] Optional core properties
37
+ # @param relationships [Uniword::Ooxml::Relationships::PackageRelationships] Optional relationships
38
+ # @return [String] Word HTML4 body content
39
+ def self.document_to_html_body(document, core_properties = nil, relationships = nil)
40
+ converter = new(document, core_properties, relationships)
41
+ converter.build_html_body
42
+ end
43
+
44
+ def initialize(document, core_properties = nil, relationships = nil, document_name = nil)
45
+ @document = document
46
+ @relationships = relationships
47
+ @provided_document_name = document_name
48
+ # Use provided core_properties if given, otherwise use document's (which may be lazily initialized)
49
+ @core_properties = core_properties
50
+ end
51
+
52
+ # Get the core properties to use (provided or from document)
53
+ def core_properties
54
+ @core_properties || @document.core_properties
55
+ end
56
+
57
+ # Build the complete Mhtml::Document
58
+ def build_mhtml_document
59
+ mhtml_doc = Uniword::Mhtml::Document.new
60
+
61
+ # Build HTML content
62
+ html_content = build_html_body
63
+ html_part = Uniword::Mhtml::HtmlPart.new
64
+ html_part.content_type = 'text/html'
65
+ html_part.content_transfer_encoding = 'quoted-printable'
66
+ html_part.raw_content = html_content
67
+ html_part.content_location = "file:///C:/D057922B/#{document_name}.htm"
68
+
69
+ mhtml_doc.html_part = html_part
70
+ mhtml_doc.parts << html_part
71
+
72
+ # Build metadata
73
+ mhtml_doc.document_properties = build_document_properties
74
+
75
+ # Build filelist.xml
76
+ filelist_part = build_filelist_part
77
+ mhtml_doc.parts << filelist_part if filelist_part
78
+
79
+ # Build image parts from document.image_parts
80
+ image_parts = build_image_parts
81
+ image_parts.each do |image_part|
82
+ mhtml_doc.parts << image_part
83
+ end
84
+
85
+ # Generate deterministic boundary based on document name
86
+ # Word uses format: ----=_NextPart_XXXX.XXXX
87
+ hash = document_name.gsub(/[^a-zA-Z0-9]/, '').upcase[0..7] || 'DOC'
88
+ mhtml_doc.boundary = "----=_NextPart_01DC60F8.#{hash}"
89
+
90
+ mhtml_doc
91
+ end
92
+
93
+ # Build the HTML body content
94
+ def build_html_body
95
+ body = @document.body
96
+ return '' unless body
97
+
98
+ paragraphs_html = body.elements.map do |element|
99
+ element_to_html(element)
100
+ end.join("\n")
101
+
102
+ wrap_html_document(paragraphs_html)
103
+ end
104
+
105
+ private
106
+
107
+ # Build document properties from core properties
108
+ def build_document_properties
109
+ props = Uniword::Mhtml::Metadata::DocumentProperties.new
110
+ cp = core_properties
111
+
112
+ if cp
113
+ props.author = cp.creator.to_s if cp.respond_to?(:creator) && cp.creator
114
+ # Use .value for date types, not .to_s (which returns object inspect)
115
+ props.created = cp.created.value.to_s if cp.respond_to?(:created) && cp.created
116
+ if cp.respond_to?(:last_modified_by) && cp.last_modified_by
117
+ props.last_author = cp.last_modified_by.to_s
118
+ end
119
+ props.last_saved = cp.modified.value.to_s if cp.respond_to?(:modified) && cp.modified
120
+ props.pages = cp.pages.to_s if cp.respond_to?(:pages) && cp.pages
121
+ props.words = cp.words.to_s if cp.respond_to?(:words) && cp.words
122
+ props.characters = cp.characters.to_s if cp.respond_to?(:characters) && cp.characters
123
+ props.application = 'Microsoft Word'
124
+ end
125
+
126
+ props
127
+ end
128
+
129
+ # Build filelist.xml part
130
+ def build_filelist_part
131
+ # Build file list entries for images
132
+ image_entries = if @document.image_parts && !@document.image_parts.empty?
133
+ @document.image_parts.map do |_r_id, image_data|
134
+ %(<o:File HRef="#{image_data[:target]}"/>)
135
+ end.join("\n ")
136
+ else
137
+ ''
138
+ end
139
+
140
+ filelist_xml = <<~XML
141
+ <xml xmlns:o="urn:schemas-microsoft-com:office:office">
142
+ <o:MainFile HRef="../#{document_name}.htm"/>
143
+ <o:File HRef="filelist.xml"/>
144
+ #{image_entries}
145
+ </xml>
146
+ XML
147
+
148
+ part = Uniword::Mhtml::XmlPart.new
149
+ part.content_type = 'text/xml; charset="utf-8"'
150
+ part.content_transfer_encoding = 'quoted-printable'
151
+ part.raw_content = filelist_xml
152
+ part.content_location = "file:///C:/D057922B/#{document_name}.fld/filelist.xml"
153
+
154
+ part
155
+ end
156
+
157
+ # Build image parts from document.image_parts
158
+ #
159
+ # Each image in document.image_parts is a hash with:
160
+ # - data: binary image content
161
+ # - content_type: MIME type (e.g., 'image/png')
162
+ # - target: filename (e.g., 'image1.png')
163
+ #
164
+ # @return [Array<Uniword::Mhtml::ImagePart>] Array of image MIME parts
165
+ def build_image_parts
166
+ return [] unless @document.image_parts && !@document.image_parts.empty?
167
+
168
+ @document.image_parts.map do |_r_id, image_data|
169
+ part = Uniword::Mhtml::ImagePart.new
170
+ part.content_type = image_data[:content_type] || 'image/png'
171
+ part.content_transfer_encoding = 'base64'
172
+ part.raw_content = image_data[:data] # Binary data - MimePackager handles base64 encoding
173
+ # Use Content-Location matching the target filename in the MHT structure
174
+ part.content_location = "file:///C:/D057922B/#{document_name}.fld/#{image_data[:target]}"
175
+ part
176
+ end
177
+ end
178
+
179
+ # Wrap HTML content in full Word HTML document
180
+ def wrap_html_document(body_html)
181
+ metadata_comments = build_metadata_comments
182
+ meta_tags = build_meta_tags
183
+ link_tags = build_link_tags
184
+ style_block = build_style_block
185
+
186
+ <<~HTML
187
+ <html xmlns:o="urn:schemas-microsoft-com:office:office"
188
+ xmlns:w="urn:schemas-microsoft-com:office:word"
189
+ xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
190
+ xmlns="http://www.w3.org/TR/REC-html40">
191
+ <head>
192
+ #{meta_tags}
193
+ #{link_tags}
194
+ <!--[if gte mso 9]><xml>
195
+ <o:DocumentProperties xmlns:o="urn:schemas-microsoft-com:office:office">
196
+ #{metadata_comments}
197
+ </o:DocumentProperties>
198
+ #{build_custom_document_properties}
199
+ <o:OfficeDocumentSettings xmlns:o="urn:schemas-microsoft-com:office:office">
200
+ <o:AllowPNG/>
201
+ </o:OfficeDocumentSettings>
202
+ </xml><![endif]-->
203
+ <link rel=themeData href="#{document_name}.fld/themedata.thmx">
204
+ <link rel=colorSchemeMapping href="#{document_name}.fld/colorschememapping.xml">
205
+ <!--[if gte mso 9]><xml>
206
+ <w:WordDocument xmlns:w="urn:schemas-microsoft-com:office:word">
207
+ <w:TrackMoves>false</w:TrackMoves>
208
+ <w:TrackFormatting/>
209
+ <w:PunctuationKerning/>
210
+ <w:ValidateAgainstSchemas/>
211
+ <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
212
+ <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
213
+ <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
214
+ <w:DoNotPromoteQF/>
215
+ <w:LidThemeOther>en-US</w:LidThemeOther>
216
+ <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
217
+ <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
218
+ <w:Compatibility>
219
+ <w:BreakWrappedTables/>
220
+ <w:SnapToGridInCell/>
221
+ <w:WrapTextWithPunct/>
222
+ <w:UseAsianBreakRules/>
223
+ <w:DontGrowAutofit/>
224
+ <w:SplitPgBreakAndParaMark/>
225
+ <w:EnableOpenTypeKerning/>
226
+ <w:DontFlipMirrorIndents/>
227
+ <w:OverrideTableStyleHps/>
228
+ <w:UseFELayout/>
229
+ </w:Compatibility>
230
+ <w:MathPr>
231
+ <w:MathFont w:val="Cambria Math"/>
232
+ <w:brkBin w:val="before"/>
233
+ <w:brkBinSub w:val="&#45;-"/>
234
+ <w:smallFrac w:val="off"/>
235
+ <w:dispDef/>
236
+ <w:lMargin w:val="0"/>
237
+ <w:rMargin w:val="0"/>
238
+ <w:defJc w:val="centerGroup"/>
239
+ <w:wrapIndent w:val="1440"/>
240
+ <w:intLim w:val="subSup"/>
241
+ <w:naryLim w:val="undOvr"/>
242
+ </w:MathPr>
243
+ </w:WordDocument>
244
+ </xml><![endif]-->
245
+ <!--[if !mso]>
246
+ <style>
247
+ v:* {behavior:url(#default#VML);}
248
+ o:* {behavior:url(#default#VML);}
249
+ w:* {behavior:url(#default#VML);}
250
+ .shape {behavior:url(#default#VML);}
251
+ </style>
252
+ <![endif]-->
253
+ #{build_latent_styles}
254
+ #{style_block}
255
+ <!--[if gte mso 10]>
256
+ <style>
257
+ /* Style Definitions */
258
+ table.MsoNormalTable
259
+ {mso-style-name:"Table Normal";
260
+ mso-tstyle-rowband-size:0;
261
+ mso-tstyle-colband-size:0;
262
+ mso-style-noshow:yes;
263
+ mso-style-priority:99;
264
+ mso-style-parent:"";
265
+ mso-padding-alt:0in 5.4pt 0in 5.4pt;
266
+ mso-para-margin-top:0in;
267
+ mso-para-margin-right:0in;
268
+ mso-para-margin-bottom:8.0pt;
269
+ mso-para-margin-left:0in;
270
+ line-height:115%;
271
+ mso-pagination:widow-orphan;
272
+ font-size:12.0pt;
273
+ font-family:"Aptos",sans-serif;
274
+ mso-ascii-font-family:Aptos;
275
+ mso-ascii-theme-font:minor-latin;
276
+ mso-hansi-font-family:Aptos;
277
+ mso-hansi-theme-font:minor-latin;
278
+ mso-font-kerning:1.0pt;
279
+ mso-ligatures:standardcontextual;}
280
+ </style>
281
+ <![endif]-->
282
+ </head>
283
+ <body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'>
284
+
285
+ <div class=WordSection1>
286
+
287
+ #{body_html}
288
+
289
+ </div>
290
+
291
+ </body>
292
+ </html>
293
+ HTML
294
+ end
295
+
296
+ # Build the o:DocumentProperties content lines
297
+ def build_metadata_comments
298
+ props = core_properties
299
+ return '' unless props
300
+
301
+ author = props.respond_to?(:creator) ? props.creator : nil
302
+ last_author = props.respond_to?(:last_modified_by) ? props.last_modified_by : nil
303
+ revision = props.respond_to?(:revision) ? props.revision : nil
304
+ # created and modified are specialized types, use .value to get the actual date
305
+ created = props.respond_to?(:created) && props.created ? props.created.value : nil
306
+ last_saved = props.respond_to?(:modified) && props.modified ? props.modified.value : nil
307
+
308
+ # Calculate document statistics
309
+ stats = calculate_document_stats
310
+
311
+ doc_props = []
312
+ doc_props << " <o:Author>#{escape_xml(author)}</o:Author>" if author
313
+ doc_props << " <o:LastAuthor>#{escape_xml(last_author)}</o:LastAuthor>" if last_author
314
+ doc_props << " <o:Revision>#{escape_xml(revision)}</o:Revision>" if revision
315
+ doc_props << ' <o:TotalTime>0</o:TotalTime>'
316
+ doc_props << " <o:Created>#{escape_xml(created)}</o:Created>" if created
317
+ doc_props << " <o:LastSaved>#{escape_xml(last_saved)}</o:LastSaved>" if last_saved
318
+ doc_props << " <o:Pages>#{stats[:pages]}</o:Pages>"
319
+ doc_props << " <o:Words>#{stats[:words]}</o:Words>"
320
+ doc_props << " <o:Characters>#{stats[:characters]}</o:Characters>"
321
+ doc_props << " <o:Lines>#{stats[:lines]}</o:Lines>"
322
+ doc_props << " <o:Paragraphs>#{stats[:paragraphs]}</o:Paragraphs>"
323
+ doc_props << " <o:CharactersWithSpaces>#{stats[:characters_with_spaces]}</o:CharactersWithSpaces>"
324
+ doc_props << ' <o:Version>16.00</o:Version>'
325
+
326
+ doc_props.join("\n")
327
+ end
328
+
329
+ # Calculate document statistics from content
330
+ #
331
+ # @return [Hash] Statistics hash with :words, :characters, :paragraphs, :lines, :pages
332
+ def calculate_document_stats
333
+ words = 0
334
+ characters = 0
335
+ paragraphs = 0
336
+ lines = 0
337
+
338
+ body = @document.body
339
+ unless body
340
+ return { words: 0, characters: 0, paragraphs: 0, lines: 0, pages: 1,
341
+ characters_with_spaces: 0 }
342
+ end
343
+
344
+ body.elements.each do |element|
345
+ next unless element.is_a?(Uniword::Wordprocessingml::Paragraph)
346
+
347
+ paragraphs += 1
348
+ para_words = 0
349
+ para_chars = 0
350
+
351
+ element.runs.each do |run|
352
+ text = run.text.to_s
353
+ characters += text.length
354
+ para_chars += text.length
355
+ words += text.split.length
356
+ para_words += text.split.length
357
+ end
358
+
359
+ # Estimate lines from paragraph (rough: 12pt font, 6 lines per inch, 11 inch page)
360
+ para_lines = [1, (para_chars / 80.0).ceil].max
361
+ lines += para_lines
362
+ end
363
+
364
+ # Rough page estimate: ~500 words per page, 24 lines per page
365
+ pages = [1, (words / 500.0).ceil, (lines / 24.0).ceil].max
366
+
367
+ {
368
+ words: words,
369
+ characters: characters,
370
+ paragraphs: paragraphs,
371
+ lines: lines,
372
+ pages: pages,
373
+ characters_with_spaces: characters + paragraphs # rough estimate
374
+ }
375
+ end
376
+
377
+ # Build o:CustomDocumentProperties for AssetID and other custom fields
378
+ #
379
+ # @return [String] CustomDocumentProperties XML or empty string
380
+ def build_custom_document_properties
381
+ # Check if document has custom properties with AssetID
382
+ asset_id = custom_property('AssetID')
383
+ return '' unless asset_id
384
+
385
+ <<~XML
386
+ <o:CustomDocumentProperties xmlns:o="urn:schemas-microsoft-com:office:office">
387
+ <o:AssetID dt:dt="string">#{escape_xml(asset_id)}</o:AssetID>
388
+ </o:CustomDocumentProperties>
389
+ XML
390
+ end
391
+
392
+ # Get a custom document property by name
393
+ #
394
+ # @param name [String] Property name
395
+ # @return [String, nil] Property value or nil
396
+ def custom_property(name)
397
+ # Try to get from core_properties via custom_properties hash
398
+ if @document.respond_to?(:core_properties) && @document.core_properties
399
+ cp = @document.core_properties
400
+ if cp.respond_to?(:custom_properties) && cp.custom_properties
401
+ return cp.custom_properties[name]
402
+ end
403
+ end
404
+ nil
405
+ end
406
+
407
+ # Build meta tags for the head
408
+ def build_meta_tags
409
+ <<~META
410
+ <meta http-equiv=Content-Type content="text/html; charset=utf-8">
411
+ <meta name=ProgId content=Word.Document>
412
+ <meta name=Generator content="Microsoft Word 15">
413
+ <meta name=Originator content="Microsoft Word 15">
414
+ META
415
+ end
416
+
417
+ # Build link tags for the head
418
+ def build_link_tags
419
+ <<~LINK
420
+ <link rel=File-List href="#{document_name}.fld/filelist.xml">
421
+ LINK
422
+ end
423
+
424
+ # Get document name - use provided name, or extract from relationships, or default
425
+ def document_name
426
+ @document_name ||= @provided_document_name || begin
427
+ # Try package_rels (has the main document relationship)
428
+ if @relationships
429
+ rel = @relationships.relationships.find do |r|
430
+ r.target.to_s.include?('document.xml')
431
+ end
432
+ if rel
433
+ target = rel.target # e.g., "word/document.xml"
434
+ # Extract "document" from "word/document.xml"
435
+ parts = target.split('/')
436
+ return parts.last.sub(/\.xml$/, '') if parts.last
437
+ end
438
+ end
439
+ # Fallback to document_rels from document itself
440
+ location = @document.document_rels&.relationships&.first&.target || 'document'
441
+ File.basename(location, '.*')
442
+ rescue StandardError
443
+ 'document'
444
+ end
445
+ end
446
+
447
+ # Build the w:LatentStyles block with all 376 entries
448
+ def build_latent_styles
449
+ <<~LATENT
450
+ <!--[if gte mso 9]><xml>
451
+ <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
452
+ DefSemiHidden="false" DefQFormat="false" DefPriority="99"
453
+ LatentStyleCount="376">
454
+ <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
455
+ <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
456
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
457
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
458
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
459
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
460
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
461
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
462
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
463
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
464
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/>
465
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/>
466
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/>
467
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/>
468
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/>
469
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/>
470
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/>
471
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/>
472
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/>
473
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/>
474
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/>
475
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/>
476
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/>
477
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/>
478
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/>
479
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/>
480
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/>
481
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/>
482
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/>
483
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/>
484
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/>
485
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/>
486
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/>
487
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/>
488
+ <w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/>
489
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/>
490
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/>
491
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/>
492
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/>
493
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/>
494
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/>
495
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/>
496
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/>
497
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/>
498
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/>
499
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/>
500
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/>
501
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/>
502
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/>
503
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/>
504
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/>
505
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/>
506
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/>
507
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/>
508
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/>
509
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/>
510
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/>
511
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/>
512
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/>
513
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/>
514
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/>
515
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/>
516
+ <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
517
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/>
518
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/>
519
+ <w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/>
520
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/>
521
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/>
522
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/>
523
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/>
524
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/>
525
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/>
526
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/>
527
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/>
528
+ <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
529
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/>
530
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/>
531
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/>
532
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/>
533
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/>
534
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/>
535
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/>
536
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/>
537
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/>
538
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/>
539
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/>
540
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/>
541
+ <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
542
+ <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
543
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/>
544
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/>
545
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/>
546
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/>
547
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/>
548
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/>
549
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/>
550
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/>
551
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/>
552
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/>
553
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/>
554
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/>
555
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/>
556
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/>
557
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/>
558
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/>
559
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/>
560
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/>
561
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/>
562
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/>
563
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/>
564
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/>
565
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/>
566
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/>
567
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/>
568
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/>
569
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/>
570
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/>
571
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/>
572
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/>
573
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/>
574
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/>
575
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/>
576
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/>
577
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/>
578
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/>
579
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/>
580
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/>
581
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/>
582
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/>
583
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/>
584
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/>
585
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/>
586
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/>
587
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/>
588
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/>
589
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/>
590
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/>
591
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/>
592
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/>
593
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/>
594
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/>
595
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/>
596
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/>
597
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/>
598
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/>
599
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/>
600
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/>
601
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/>
602
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/>
603
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/>
604
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/>
605
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/>
606
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/>
607
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/>
608
+ <w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
609
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/>
610
+ <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
611
+ <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
612
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
613
+ <w:LsdException Locked="false" Priority="61" Name="Light List"/>
614
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
615
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
616
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
617
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
618
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
619
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
620
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
621
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
622
+ <w:LsdException Locked="false" Priority="70" Name="Dark List"/>
623
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
624
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
625
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
626
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
627
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
628
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
629
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
630
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
631
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
632
+ <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
633
+ <w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/>
634
+ <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
635
+ <w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/>
636
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
637
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
638
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
639
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
640
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
641
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
642
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
643
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
644
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
645
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
646
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
647
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
648
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
649
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
650
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
651
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
652
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
653
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
654
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
655
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
656
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
657
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
658
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
659
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
660
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
661
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
662
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
663
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
664
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
665
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
666
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
667
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
668
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
669
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
670
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
671
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
672
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
673
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
674
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
675
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
676
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
677
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
678
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
679
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
680
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
681
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
682
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
683
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
684
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
685
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
686
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
687
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
688
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
689
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
690
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
691
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
692
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
693
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
694
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
695
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
696
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
697
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
698
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
699
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
700
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
701
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
702
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
703
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
704
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
705
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
706
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
707
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
708
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
709
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
710
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
711
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
712
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
713
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
714
+ <w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/>
715
+ <w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/>
716
+ <w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/>
717
+ <w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/>
718
+ <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
719
+ <w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/>
720
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
721
+ <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
722
+ <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
723
+ <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
724
+ <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
725
+ <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
726
+ <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
727
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
728
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
729
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
730
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
731
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
732
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
733
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
734
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/>
735
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
736
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
737
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
738
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
739
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/>
740
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/>
741
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/>
742
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
743
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
744
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
745
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
746
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/>
747
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/>
748
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/>
749
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
750
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
751
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
752
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
753
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/>
754
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/>
755
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/>
756
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
757
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
758
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
759
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
760
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/>
761
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/>
762
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/>
763
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
764
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
765
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
766
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
767
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/>
768
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/>
769
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/>
770
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
771
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
772
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
773
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
774
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/>
775
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/>
776
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
777
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
778
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
779
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
780
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
781
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
782
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
783
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/>
784
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
785
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
786
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
787
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
788
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/>
789
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/>
790
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/>
791
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
792
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
793
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
794
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
795
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/>
796
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/>
797
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/>
798
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
799
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
800
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
801
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
802
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/>
803
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/>
804
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/>
805
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
806
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
807
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
808
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
809
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/>
810
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/>
811
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/>
812
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
813
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
814
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
815
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
816
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/>
817
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/>
818
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/>
819
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
820
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
821
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
822
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
823
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/>
824
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/>
825
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/>
826
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/>
827
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/>
828
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/>
829
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Link"/>
830
+ </w:LatentStyles>
831
+ </xml><![endif]-->
832
+ LATENT
833
+ end
834
+
835
+ # Build the CSS style block
836
+ def build_style_block
837
+ <<~STYLE
838
+ <style>
839
+ <!--
840
+ /* Font Definitions */
841
+ @font-face
842
+ {font-family:"Cambria Math";
843
+ panose-1:2 4 5 3 5 4 6 3 2 4;
844
+ mso-font-charset:0;
845
+ mso-generic-font-family:roman;
846
+ mso-font-pitch:variable;
847
+ mso-font-signature:-536870145 1107305727 0 0 415 0;}
848
+ @font-face
849
+ {font-family:DengXian;
850
+ panose-1:2 1 6 0 3 1 1 1 1 1;
851
+ mso-font-alt:等线;
852
+ mso-font-charset:134;
853
+ mso-generic-font-family:modern;
854
+ mso-font-pitch:fixed;
855
+ mso-font-signature:1 135135232 16 0 262144 0;}
856
+ @font-face
857
+ {font-family:Aptos;
858
+ panose-1:2 11 0 4 2 2 2 2 2 4;
859
+ mso-font-charset:0;
860
+ mso-generic-font-family:swiss;
861
+ mso-font-pitch:variable;
862
+ mso-font-signature:536871559 3 0 0 415 0;}
863
+ @font-face
864
+ {font-family:"\\@DengXian";
865
+ panose-1:2 1 6 0 3 1 1 1 1 1;
866
+ mso-font-charset:134;
867
+ mso-generic-font-family:auto;
868
+ mso-font-pitch:variable;
869
+ mso-font-signature:-1610612033 953122042 22 0 262159 0;}
870
+ /* Style Definitions */
871
+ p.MsoNormal, li.MsoNormal, div.MsoNormal
872
+ {mso-style-unhide:no;
873
+ mso-style-qformat:yes;
874
+ mso-style-parent:"";
875
+ margin-top:0in;
876
+ margin-right:0in;
877
+ margin-bottom:8.0pt;
878
+ margin-left:0in;
879
+ line-height:115%;
880
+ mso-pagination:widow-orphan;
881
+ font-size:12.0pt;
882
+ font-family:"Aptos",sans-serif;
883
+ mso-ascii-font-family:Aptos;
884
+ mso-ascii-theme-font:minor-latin;
885
+ mso-fareast-font-family:DengXian;
886
+ mso-fareast-theme-font:minor-fareast;
887
+ mso-hansi-font-family:Aptos;
888
+ mso-hansi-theme-font:minor-latin;
889
+ mso-bidi-font-family:"Times New Roman";
890
+ mso-bidi-theme-font:minor-bidi;
891
+ mso-font-kerning:1.0pt;
892
+ mso-ligatures:standardcontextual;}
893
+ h1
894
+ {mso-style-priority:9;
895
+ mso-style-unhide:no;
896
+ mso-style-qformat:yes;
897
+ mso-style-link:"Heading 1 Char";
898
+ mso-style-next:Normal;
899
+ margin-top:.25in;
900
+ margin-right:0in;
901
+ margin-bottom:4.0pt;
902
+ margin-left:0in;
903
+ line-height:115%;
904
+ mso-pagination:widow-orphan lines-together;
905
+ page-break-after:avoid;
906
+ mso-outline-level:1;
907
+ font-size:20.0pt;
908
+ font-family:"Aptos Display",sans-serif;
909
+ mso-ascii-font-family:"Aptos Display";
910
+ mso-ascii-theme-font:major-latin;
911
+ mso-fareast-font-family:"DengXian Light";
912
+ mso-fareast-theme-font:major-fareast;
913
+ mso-hansi-font-family:"Aptos Display";
914
+ mso-hansi-theme-font:major-latin;
915
+ mso-bidi-font-family:"Times New Roman";
916
+ mso-bidi-theme-font:major-bidi;
917
+ color:#0F4761;
918
+ mso-themecolor:accent1;
919
+ mso-themeshade:191;
920
+ mso-font-kerning:1.0pt;
921
+ mso-ligatures:standardcontextual;
922
+ font-weight:normal;}
923
+ h2
924
+ {mso-style-noshow:yes;
925
+ mso-style-priority:9;
926
+ mso-style-qformat:yes;
927
+ mso-style-link:"Heading 2 Char";
928
+ mso-style-next:Normal;
929
+ margin-top:8.0pt;
930
+ margin-right:0in;
931
+ margin-bottom:4.0pt;
932
+ margin-left:0in;
933
+ line-height:115%;
934
+ mso-pagination:widow-orphan lines-together;
935
+ page-break-after:avoid;
936
+ mso-outline-level:2;
937
+ font-size:16.0pt;
938
+ font-family:"Aptos Display",sans-serif;
939
+ mso-ascii-font-family:"Aptos Display";
940
+ mso-ascii-theme-font:major-latin;
941
+ mso-fareast-font-family:"DengXian Light";
942
+ mso-fareast-theme-font:major-fareast;
943
+ mso-hansi-font-family:"Aptos Display";
944
+ mso-hansi-theme-font:major-latin;
945
+ mso-bidi-font-family:"Times New Roman";
946
+ mso-bidi-theme-font:major-bidi;
947
+ color:#0F4761;
948
+ mso-themecolor:accent1;
949
+ mso-themeshade:191;
950
+ mso-font-kerning:1.0pt;
951
+ mso-ligatures:standardcontextual;
952
+ font-weight:normal;}
953
+ h3
954
+ {mso-style-noshow:yes;
955
+ mso-style-priority:9;
956
+ mso-style-qformat:yes;
957
+ mso-style-link:"Heading 3 Char";
958
+ mso-style-next:Normal;
959
+ margin-top:8.0pt;
960
+ margin-right:0in;
961
+ margin-bottom:4.0pt;
962
+ margin-left:0in;
963
+ line-height:115%;
964
+ mso-pagination:widow-orphan lines-together;
965
+ page-break-after:avoid;
966
+ mso-outline-level:3;
967
+ font-size:14.0pt;
968
+ font-family:"Aptos",sans-serif;
969
+ mso-ascii-font-family:Aptos;
970
+ mso-ascii-theme-font:minor-latin;
971
+ mso-fareast-font-family:"DengXian Light";
972
+ mso-fareast-theme-font:major-fareast;
973
+ mso-hansi-font-family:Aptos;
974
+ mso-hansi-theme-font:minor-latin;
975
+ mso-bidi-font-family:"Times New Roman";
976
+ mso-bidi-theme-font:major-bidi;
977
+ color:#0F4761;
978
+ mso-themecolor:accent1;
979
+ mso-themeshade:191;
980
+ mso-font-kerning:1.0pt;
981
+ mso-ligatures:standardcontextual;
982
+ font-weight:normal;}
983
+ h4
984
+ {mso-style-noshow:yes;
985
+ mso-style-priority:9;
986
+ mso-style-qformat:yes;
987
+ mso-style-link:"Heading 4 Char";
988
+ mso-style-next:Normal;
989
+ margin-top:4.0pt;
990
+ margin-right:0in;
991
+ margin-bottom:2.0pt;
992
+ margin-left:0in;
993
+ line-height:115%;
994
+ mso-pagination:widow-orphan lines-together;
995
+ page-break-after:avoid;
996
+ mso-outline-level:4;
997
+ font-size:12.0pt;
998
+ font-family:"Aptos",sans-serif;
999
+ mso-ascii-font-family:Aptos;
1000
+ mso-ascii-theme-font:minor-latin;
1001
+ mso-fareast-font-family:"DengXian Light";
1002
+ mso-fareast-theme-font:major-fareast;
1003
+ mso-hansi-font-family:Aptos;
1004
+ mso-hansi-theme-font:minor-latin;
1005
+ mso-bidi-font-family:"Times New Roman";
1006
+ mso-bidi-theme-font:major-bidi;
1007
+ color:#0F4761;
1008
+ mso-themecolor:accent1;
1009
+ mso-themeshade:191;
1010
+ mso-font-kerning:1.0pt;
1011
+ mso-ligatures:standardcontextual;
1012
+ font-weight:normal;
1013
+ font-style:italic;}
1014
+ h5
1015
+ {mso-style-noshow:yes;
1016
+ mso-style-priority:9;
1017
+ mso-style-qformat:yes;
1018
+ mso-style-link:"Heading 5 Char";
1019
+ mso-style-next:Normal;
1020
+ margin-top:4.0pt;
1021
+ margin-right:0in;
1022
+ margin-bottom:2.0pt;
1023
+ margin-left:0in;
1024
+ line-height:115%;
1025
+ mso-pagination:widow-orphan lines-together;
1026
+ page-break-after:avoid;
1027
+ mso-outline-level:5;
1028
+ font-size:12.0pt;
1029
+ font-family:"Aptos",sans-serif;
1030
+ mso-ascii-font-family:Aptos;
1031
+ mso-ascii-theme-font:minor-latin;
1032
+ mso-fareast-font-family:"DengXian Light";
1033
+ mso-fareast-theme-font:major-fareast;
1034
+ mso-hansi-font-family:Aptos;
1035
+ mso-hansi-theme-font:minor-latin;
1036
+ mso-bidi-font-family:"Times New Roman";
1037
+ mso-bidi-theme-font:major-bidi;
1038
+ color:#0F4761;
1039
+ mso-themecolor:accent1;
1040
+ mso-themeshade:191;
1041
+ mso-font-kerning:1.0pt;
1042
+ mso-ligatures:standardcontextual;
1043
+ font-weight:normal;}
1044
+ h6
1045
+ {mso-style-noshow:yes;
1046
+ mso-style-priority:9;
1047
+ mso-style-qformat:yes;
1048
+ mso-style-link:"Heading 6 Char";
1049
+ mso-style-next:Normal;
1050
+ margin-top:2.0pt;
1051
+ margin-right:0in;
1052
+ margin-bottom:0in;
1053
+ margin-left:0in;
1054
+ line-height:115%;
1055
+ mso-pagination:widow-orphan lines-together;
1056
+ page-break-after:avoid;
1057
+ mso-outline-level:6;
1058
+ font-size:12.0pt;
1059
+ font-family:"Aptos",sans-serif;
1060
+ mso-ascii-font-family:Aptos;
1061
+ mso-ascii-theme-font:minor-latin;
1062
+ mso-fareast-font-family:"DengXian Light";
1063
+ mso-fareast-theme-font:major-fareast;
1064
+ mso-hansi-font-family:Aptos;
1065
+ mso-hansi-theme-font:minor-latin;
1066
+ mso-bidi-font-family:"Times New Roman";
1067
+ mso-bidi-theme-font:major-bidi;
1068
+ color:#595959;
1069
+ mso-themecolor:text1;
1070
+ mso-themetint:166;
1071
+ mso-font-kerning:1.0pt;
1072
+ mso-ligatures:standardcontextual;
1073
+ font-weight:normal;
1074
+ font-style:italic;}
1075
+ p.MsoTitle, li.MsoTitle, div.MsoTitle
1076
+ {mso-style-priority:10;
1077
+ mso-style-unhide:no;
1078
+ mso-style-qformat:yes;
1079
+ mso-style-link:"Title Char";
1080
+ mso-style-next:Normal;
1081
+ margin-top:0in;
1082
+ margin-right:0in;
1083
+ margin-bottom:4.0pt;
1084
+ margin-left:0in;
1085
+ mso-add-space:auto;
1086
+ mso-pagination:widow-orphan;
1087
+ font-size:28.0pt;
1088
+ font-family:"Aptos Display",sans-serif;
1089
+ mso-ascii-font-family:"Aptos Display";
1090
+ mso-ascii-theme-font:major-latin;
1091
+ mso-fareast-font-family:"DengXian Light";
1092
+ mso-fareast-theme-font:major-fareast;
1093
+ mso-hansi-font-family:"Aptos Display";
1094
+ mso-hansi-theme-font:major-latin;
1095
+ mso-bidi-font-family:"Times New Roman";
1096
+ mso-bidi-theme-font:major-bidi;
1097
+ letter-spacing:-.5pt;
1098
+ mso-font-kerning:14.0pt;
1099
+ mso-ligatures:standardcontextual;}
1100
+ p.MsoSubtitle, li.MsoSubtitle, div.MsoSubtitle
1101
+ {mso-style-priority:11;
1102
+ mso-style-unhide:no;
1103
+ mso-style-qformat:yes;
1104
+ mso-style-link:"Subtitle Char";
1105
+ mso-style-next:Normal;
1106
+ margin-top:0in;
1107
+ margin-right:0in;
1108
+ margin-bottom:8.0pt;
1109
+ margin-left:0in;
1110
+ line-height:115%;
1111
+ mso-pagination:widow-orphan;
1112
+ font-size:14.0pt;
1113
+ font-family:"Aptos",sans-serif;
1114
+ mso-ascii-font-family:Aptos;
1115
+ mso-ascii-theme-font:minor-latin;
1116
+ mso-fareast-font-family:"DengXian Light";
1117
+ mso-fareast-theme-font:major-fareast;
1118
+ mso-hansi-font-family:"Aptos Display";
1119
+ mso-hansi-theme-font:major-latin;
1120
+ mso-bidi-font-family:"Times New Roman";
1121
+ mso-bidi-theme-font:major-bidi;
1122
+ color:#595959;
1123
+ mso-themecolor:text1;
1124
+ mso-themetint:166;
1125
+ letter-spacing:.75pt;
1126
+ mso-font-kerning:1.0pt;
1127
+ mso-ligatures:standardcontextual;}
1128
+ @page WordSection1
1129
+ {size:8.5in 11.0in;
1130
+ margin:1.0in 1.0in 1.0in 1.0in;
1131
+ mso-header-margin:.5in;
1132
+ mso-footer-margin:.5in;
1133
+ mso-paper-source:0;}
1134
+ div.WordSection1
1135
+ {page:WordSection1;}
1136
+ -->
1137
+ </style>
1138
+ STYLE
1139
+ end
1140
+
1141
+ # Convert an OOXML element to HTML
1142
+ def element_to_html(element)
1143
+ case element
1144
+ when Uniword::Wordprocessingml::Paragraph
1145
+ paragraph_to_html(element)
1146
+ when Uniword::Wordprocessingml::Table
1147
+ table_to_html(element)
1148
+ else
1149
+ ''
1150
+ end
1151
+ end
1152
+
1153
+ # Convert OOXML Paragraph to HTML
1154
+ def paragraph_to_html(paragraph)
1155
+ style_class = style_to_css_class(paragraph.style)
1156
+
1157
+ # Build paragraph content including SDTs inline
1158
+ content = paragraph_content_to_html(paragraph)
1159
+
1160
+ if content.strip.empty?
1161
+ %(<p#{style_class}><o:p>&nbsp;</o:p></p>)
1162
+ else
1163
+ %(<p#{style_class}>#{content}</p>)
1164
+ end
1165
+ end
1166
+
1167
+ # Get paragraph content including runs, hyperlinks, SDTs
1168
+ def paragraph_content_to_html(paragraph)
1169
+ # Process runs and hyperlinks in order
1170
+ parts = paragraph.runs.map do |run|
1171
+ # SDT elements can appear in runs collection when parsed from MHT
1172
+ if run.is_a?(Uniword::Wordprocessingml::StructuredDocumentTag)
1173
+ sdt_to_inline_html(run)
1174
+ else
1175
+ run_to_html(run)
1176
+ end
1177
+ end
1178
+
1179
+ paragraph.hyperlinks.each do |hyperlink|
1180
+ parts << hyperlink_to_html(hyperlink)
1181
+ end
1182
+
1183
+ # Process SDTs - in DOCX SDTs can be block elements, but in MHT they're inline
1184
+ paragraph.sdts.each do |sdt|
1185
+ parts << sdt_to_inline_html(sdt)
1186
+ end
1187
+
1188
+ parts.join
1189
+ end
1190
+
1191
+ # Convert OOXML Run to HTML
1192
+ def run_to_html(run)
1193
+ text = run.text.to_s
1194
+ return '' if text.empty?
1195
+
1196
+ # Escape raw text first, then apply formatting around it
1197
+ escaped = escape_html(text)
1198
+
1199
+ props = run.properties
1200
+ escaped = apply_run_formatting(escaped, props) if props
1201
+
1202
+ escaped
1203
+ end
1204
+
1205
+ # Apply run formatting (text must already be HTML-escaped)
1206
+ def apply_run_formatting(text, props)
1207
+ result = text
1208
+
1209
+ # Bold/Italic: element presence means true (value may be nil)
1210
+ result = "<strong>#{result}</strong>" if props.bold && props.bold.value != false
1211
+ result = "<em>#{result}</em>" if props.italic && props.italic.value != false
1212
+ result = "<u>#{result}</u>" if props.underline&.value
1213
+
1214
+ result = %(<span style="color:#{props.color.value}">#{result}</span>) if props.color&.value
1215
+
1216
+ if props.size&.value
1217
+ size_pt = props.size.value.to_f / 2
1218
+ result = %(<span style="font-size:#{size_pt}pt">#{result}</span>)
1219
+ end
1220
+
1221
+ if props.font.respond_to?(:ascii) && props.font.ascii
1222
+ result = %(<span style="font-family:'#{props.font.ascii}'">#{result}</span>)
1223
+ elsif props.font.is_a?(String) && !props.font.empty?
1224
+ result = %(<span style="font-family:'#{props.font}'">#{result}</span>)
1225
+ end
1226
+
1227
+ result
1228
+ end
1229
+
1230
+ # Convert OOXML Hyperlink to HTML
1231
+ def hyperlink_to_html(hyperlink)
1232
+ url = resolve_hyperlink_url(hyperlink)
1233
+ return '' unless url
1234
+
1235
+ # Get hyperlink text from runs
1236
+ text = hyperlink.runs.map { |r| r.text.to_s }.join
1237
+
1238
+ %(<a href="#{escape_html(url)}">#{escape_html(text)}</a>)
1239
+ end
1240
+
1241
+ # Resolve hyperlink URL from relationship or anchor
1242
+ def resolve_hyperlink_url(hyperlink)
1243
+ # Internal anchor link
1244
+ return "##{hyperlink.anchor}" if hyperlink.anchor
1245
+
1246
+ # External link via relationship ID
1247
+ if hyperlink.id && @relationships
1248
+ rel = @relationships.relationships.find { |r| r.id == hyperlink.id }
1249
+ return rel.target if rel && rel.target_mode == 'External'
1250
+ end
1251
+
1252
+ nil
1253
+ end
1254
+
1255
+ # Convert OOXML SDT block to inline MHT SDT
1256
+ def sdt_to_inline_html(sdt)
1257
+ return '' unless sdt.content
1258
+
1259
+ sdt_props = sdt.properties
1260
+ sdt_content = sdt.content
1261
+
1262
+ # Extract text content
1263
+ text = extract_sdt_text(sdt_content)
1264
+
1265
+ # Build inline SDT
1266
+ sdt_attrs = build_sdt_attrs(sdt_props)
1267
+
1268
+ if text.empty?
1269
+ %(<w:sdt#{sdt_attrs}><w:sdtPr></w:sdtPr></w:sdt>)
1270
+ else
1271
+ %(<w:sdt#{sdt_attrs}><w:sdtPr></w:sdtPr><w:sdtContent><span>#{escape_html(text)}</span></w:sdtContent></w:sdt>)
1272
+ end
1273
+ end
1274
+
1275
+ # Extract text from SDT content
1276
+ def extract_sdt_text(content)
1277
+ return '' unless content
1278
+
1279
+ # Content uses mixed_content - serialize back to XML and extract text
1280
+ xml = content.to_xml
1281
+ # Parse the XML to extract text content
1282
+ doc = Nokogiri::HTML(xml)
1283
+ doc.text.gsub(/\s+/, ' ').strip
1284
+ end
1285
+
1286
+ # Build SDT attribute string
1287
+ def build_sdt_attrs(props)
1288
+ return '' unless props
1289
+
1290
+ attrs = []
1291
+
1292
+ # ID attribute
1293
+ attrs << %(w:id="#{props.id.value}") if props.id.respond_to?(:value) && props.id.value
1294
+
1295
+ # ShowingPlcHdr attribute
1296
+ attrs << 'w:showingPlcHdr="t"' if props.showing_placeholder_header
1297
+
1298
+ # Temporary attribute
1299
+ attrs << 'w:temporary="t"' if props.temporary
1300
+
1301
+ # DocPart attribute (UUID from placeholder.doc_part)
1302
+ if props.placeholder&.doc_part
1303
+ doc_part = props.placeholder.doc_part
1304
+ if doc_part.respond_to?(:value) && doc_part.value
1305
+ attrs << %(w:docPart="#{doc_part.value}")
1306
+ end
1307
+ end
1308
+
1309
+ # Text attribute
1310
+ if props.text.respond_to?(:value) && props.text.value
1311
+ attrs << %(w:text="#{props.text.value}")
1312
+ end
1313
+
1314
+ # Tag attribute
1315
+ if props.tag.respond_to?(:value) && props.tag.value
1316
+ attrs << %(w:tag="#{escape_xml(props.tag.value)}")
1317
+ end
1318
+
1319
+ # Alias attribute
1320
+ if props.alias_name.respond_to?(:value) && props.alias_name.value
1321
+ attrs << %(w:alias="#{escape_xml(props.alias_name.value)}")
1322
+ end
1323
+
1324
+ attrs.empty? ? '' : " #{attrs.join(' ')}"
1325
+ end
1326
+
1327
+ # Convert OOXML Table to HTML
1328
+ def table_to_html(table)
1329
+ rows = table.rows || []
1330
+
1331
+ rows_html = rows.map do |row|
1332
+ cells = row.cells || []
1333
+ cells_html = cells.map { |cell| table_cell_to_html(cell) }.join
1334
+
1335
+ %(<tr>#{cells_html}</tr>)
1336
+ end.join("\n")
1337
+
1338
+ <<~HTML
1339
+ <table>
1340
+ #{rows_html}
1341
+ </table>
1342
+ HTML
1343
+ end
1344
+
1345
+ # Convert OOXML TableCell to HTML
1346
+ def table_cell_to_html(cell)
1347
+ paragraphs = cell.paragraphs || []
1348
+
1349
+ content = paragraphs.map do |para|
1350
+ paragraph_to_html(para)
1351
+ end.join("\n")
1352
+
1353
+ <<~HTML
1354
+ <td>
1355
+ #{content}
1356
+ </td>
1357
+ HTML
1358
+ end
1359
+
1360
+ # Map OOXML style to CSS class
1361
+ def style_to_css_class(style)
1362
+ return ' class=MsoNormal' unless style
1363
+
1364
+ # Handle StyleReference wrapper object or string
1365
+ style_value = style.is_a?(String) ? style : style.to_s
1366
+
1367
+ case style_value
1368
+ when 'Title' then ' class=MsoTitle'
1369
+ when 'Title2' then ' class=MsoTitle2'
1370
+ when 'Subtitle' then ' class=MsoSubtitle'
1371
+ when 'Heading1' then ' class=MsoHeading1'
1372
+ when 'Heading2' then ' class=MsoHeading2'
1373
+ when 'Heading3' then ' class=MsoHeading3'
1374
+ when 'Heading4' then ' class=MsoHeading4'
1375
+ when 'Heading5' then ' class=MsoHeading5'
1376
+ when 'Heading6' then ' class=MsoHeading6'
1377
+ when 'TOC1', 'TOC2', 'TOC3', 'TOC4', 'TOC5', 'TOC6', 'TOC7', 'TOC8', 'TOC9'
1378
+ ' class=MsoToc1'
1379
+ when 'SectionTitle' then ' class=SectionTitle'
1380
+ else
1381
+ ' class=MsoNormal'
1382
+ end
1383
+ end
1384
+
1385
+ # Escape HTML special characters
1386
+ def escape_html(text)
1387
+ text.to_s
1388
+ .gsub('&', '&amp;')
1389
+ .gsub('<', '&lt;')
1390
+ .gsub('>', '&gt;')
1391
+ .gsub('"', '&quot;')
1392
+ .gsub("'", '&#39;')
1393
+ end
1394
+
1395
+ # Escape XML special characters
1396
+ def escape_xml(text)
1397
+ text.to_s
1398
+ .gsub('&', '&amp;')
1399
+ .gsub('<', '&lt;')
1400
+ .gsub('>', '&gt;')
1401
+ .gsub('"', '&quot;')
1402
+ .gsub("'", '&apos;')
1403
+ end
1404
+ end
1405
+ end
1406
+ end