uniword 1.0.0 → 1.0.3

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 (1784) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/README.adoc +71 -2142
  4. data/config/accessibility_profiles.yml +145 -0
  5. data/config/font_metadata.yml +213 -0
  6. data/config/latent_styles.yml +962 -0
  7. data/config/link_validation_rules.yml +62 -0
  8. data/config/locale_profiles.yml +226 -0
  9. data/config/metadata_schema.yml +294 -0
  10. data/config/ooxml/schema_loader.yml +98 -0
  11. data/config/ooxml/schema_main.yml +524 -0
  12. data/config/ooxml/schemas/01_document_structure.yml +44 -0
  13. data/config/ooxml/schemas/02_paragraph.yml +282 -0
  14. data/config/ooxml/schemas/03_run.yml +276 -0
  15. data/config/ooxml/schemas/04_table.yml +184 -0
  16. data/config/ooxml/schemas/05_headers_footers.yml +82 -0
  17. data/config/ooxml/schemas/06_fields.yml +81 -0
  18. data/config/ooxml/schemas/07_footnotes.yml +92 -0
  19. data/config/ooxml/schemas/08_styles.yml +265 -0
  20. data/config/ooxml/schemas/09_numbering.yml +247 -0
  21. data/config/ooxml/schemas/10_sections.yml +250 -0
  22. data/config/ooxml/schemas/11_drawing.yml +381 -0
  23. data/config/ooxml/schemas/12_math.yml +349 -0
  24. data/config/ooxml/schemas/13_charts.yml +920 -0
  25. data/config/ooxml/schemas/bibliography.yml +351 -0
  26. data/config/ooxml/schemas/chart.yml +1472 -0
  27. data/config/ooxml/schemas/content_types.yml +93 -0
  28. data/config/ooxml/schemas/customxml.yml +493 -0
  29. data/config/ooxml/schemas/document_properties.yml +275 -0
  30. data/config/ooxml/schemas/document_variables.yml +135 -0
  31. data/config/ooxml/schemas/drawingml.yml +1368 -0
  32. data/config/ooxml/schemas/glossary.yml +235 -0
  33. data/config/ooxml/schemas/math.yml +1266 -0
  34. data/config/ooxml/schemas/office.yml +648 -0
  35. data/config/ooxml/schemas/picture.yml +213 -0
  36. data/config/ooxml/schemas/presentationml.yml +1003 -0
  37. data/config/ooxml/schemas/relationships.yml +91 -0
  38. data/config/ooxml/schemas/shared_types.yml +174 -0
  39. data/config/ooxml/schemas/spreadsheetml.yml +1534 -0
  40. data/config/ooxml/schemas/vml.yml +426 -0
  41. data/config/ooxml/schemas/vml_office.yml +415 -0
  42. data/config/ooxml/schemas/wordprocessingml.yml +1881 -0
  43. data/config/ooxml/schemas/wordprocessingml_2010.yml +428 -0
  44. data/config/ooxml/schemas/wordprocessingml_2013.yml +286 -0
  45. data/config/ooxml/schemas/wordprocessingml_2016.yml +205 -0
  46. data/config/ooxml/schemas/wp_drawing.yml +528 -0
  47. data/config/pipeline.yml +108 -0
  48. data/config/profiles.yml +49 -0
  49. data/config/quality_rules.yml +49 -0
  50. data/config/style_mappings/iso_publication.yml +30 -0
  51. data/config/styles/iso_standard.yml +229 -0
  52. data/config/styles/legal_document.yml +198 -0
  53. data/config/styles/minimal.yml +90 -0
  54. data/config/styles/technical_report.yml +233 -0
  55. data/config/system_profiles.yml +87 -0
  56. data/config/theme_mapping.yml +447 -0
  57. data/config/transformation_rules.yml +160 -0
  58. data/config/validation_rules.yml +60 -0
  59. data/config/warning_rules.yml +57 -0
  60. data/data/color_schemes/amber.yml +17 -0
  61. data/data/color_schemes/azure.yml +17 -0
  62. data/data/color_schemes/burgundy.yml +17 -0
  63. data/data/color_schemes/cerulean.yml +17 -0
  64. data/data/color_schemes/chartreuse.yml +17 -0
  65. data/data/color_schemes/classic.yml +17 -0
  66. data/data/color_schemes/cobalt.yml +17 -0
  67. data/data/color_schemes/coral.yml +17 -0
  68. data/data/color_schemes/crimson.yml +17 -0
  69. data/data/color_schemes/emerald.yml +17 -0
  70. data/data/color_schemes/horizon.yml +17 -0
  71. data/data/color_schemes/indigo.yml +17 -0
  72. data/data/color_schemes/lavender.yml +17 -0
  73. data/data/color_schemes/magenta.yml +17 -0
  74. data/data/color_schemes/modern.yml +17 -0
  75. data/data/color_schemes/monochrome.yml +17 -0
  76. data/data/color_schemes/parchment.yml +17 -0
  77. data/data/color_schemes/saffron.yml +17 -0
  78. data/data/color_schemes/sage.yml +17 -0
  79. data/data/color_schemes/scarlet.yml +17 -0
  80. data/data/color_schemes/solar.yml +17 -0
  81. data/data/color_schemes/teal.yml +17 -0
  82. data/data/color_schemes/terrain.yml +17 -0
  83. data/data/font_schemes/caladea.yml +45 -0
  84. data/data/font_schemes/carlito_caladea.yml +45 -0
  85. data/data/font_schemes/carlito_liberation.yml +45 -0
  86. data/data/font_schemes/carlito_sans.yml +45 -0
  87. data/data/font_schemes/classic_office.yml +45 -0
  88. data/data/font_schemes/eb_garamond.yml +45 -0
  89. data/data/font_schemes/eb_garamond_liberation.yml +45 -0
  90. data/data/font_schemes/gelasio.yml +45 -0
  91. data/data/font_schemes/league_gothic.yml +45 -0
  92. data/data/font_schemes/league_liberation.yml +45 -0
  93. data/data/font_schemes/liberation_bold_sans.yml +45 -0
  94. data/data/font_schemes/liberation_libre.yml +45 -0
  95. data/data/font_schemes/liberation_mono_sans.yml +45 -0
  96. data/data/font_schemes/liberation_pair.yml +45 -0
  97. data/data/font_schemes/liberation_reverse.yml +45 -0
  98. data/data/font_schemes/liberation_sans.yml +45 -0
  99. data/data/font_schemes/liberation_sans_trebuchet.yml +45 -0
  100. data/data/font_schemes/libre_bodoni.yml +45 -0
  101. data/data/font_schemes/libre_franklin.yml +45 -0
  102. data/data/font_schemes/modern_office.yml +45 -0
  103. data/data/font_schemes/ms_office_2007.yml +72 -0
  104. data/data/font_schemes/ms_office_2013.yml +106 -0
  105. data/data/font_schemes/ms_office_2024.yml +106 -0
  106. data/data/font_schemes/source_alfa_slab.yml +45 -0
  107. data/data/font_schemes/source_display.yml +45 -0
  108. data/data/font_schemes/source_modern.yml +45 -0
  109. data/data/font_schemes/source_sans.yml +45 -0
  110. data/data/font_schemes/source_sans_century.yml +45 -0
  111. data/data/resources/document_elements/ar/bibliographies.yml +13 -0
  112. data/data/resources/document_elements/ar/cover_pages.yml +26 -0
  113. data/data/resources/document_elements/ar/equations.yml +21 -0
  114. data/data/resources/document_elements/ar/footers.yml +31 -0
  115. data/data/resources/document_elements/ar/headers.yml +32 -0
  116. data/data/resources/document_elements/ar/table_of_contents.yml +21 -0
  117. data/data/resources/document_elements/ar/tables.yml +19 -0
  118. data/data/resources/document_elements/ar/watermarks.yml +25 -0
  119. data/data/resources/document_elements/cs/bibliographies.yml +13 -0
  120. data/data/resources/document_elements/cs/cover_pages.yml +26 -0
  121. data/data/resources/document_elements/cs/equations.yml +21 -0
  122. data/data/resources/document_elements/cs/footers.yml +31 -0
  123. data/data/resources/document_elements/cs/headers.yml +32 -0
  124. data/data/resources/document_elements/cs/table_of_contents.yml +21 -0
  125. data/data/resources/document_elements/cs/tables.yml +19 -0
  126. data/data/resources/document_elements/cs/watermarks.yml +25 -0
  127. data/data/resources/document_elements/da/bibliographies.yml +13 -0
  128. data/data/resources/document_elements/da/cover_pages.yml +26 -0
  129. data/data/resources/document_elements/da/equations.yml +21 -0
  130. data/data/resources/document_elements/da/footers.yml +31 -0
  131. data/data/resources/document_elements/da/headers.yml +32 -0
  132. data/data/resources/document_elements/da/table_of_contents.yml +21 -0
  133. data/data/resources/document_elements/da/tables.yml +19 -0
  134. data/data/resources/document_elements/da/watermarks.yml +25 -0
  135. data/data/resources/document_elements/de/bibliographies.yml +13 -0
  136. data/data/resources/document_elements/de/cover_pages.yml +26 -0
  137. data/data/resources/document_elements/de/equations.yml +21 -0
  138. data/data/resources/document_elements/de/footers.yml +31 -0
  139. data/data/resources/document_elements/de/headers.yml +32 -0
  140. data/data/resources/document_elements/de/table_of_contents.yml +21 -0
  141. data/data/resources/document_elements/de/tables.yml +19 -0
  142. data/data/resources/document_elements/de/watermarks.yml +25 -0
  143. data/data/resources/document_elements/el/bibliographies.yml +13 -0
  144. data/data/resources/document_elements/el/cover_pages.yml +26 -0
  145. data/data/resources/document_elements/el/equations.yml +21 -0
  146. data/data/resources/document_elements/el/footers.yml +31 -0
  147. data/data/resources/document_elements/el/headers.yml +32 -0
  148. data/data/resources/document_elements/el/table_of_contents.yml +21 -0
  149. data/data/resources/document_elements/el/tables.yml +19 -0
  150. data/data/resources/document_elements/el/watermarks.yml +25 -0
  151. data/data/resources/document_elements/en/bibliographies.yml +13 -0
  152. data/data/resources/document_elements/en/cover_pages.yml +26 -0
  153. data/data/resources/document_elements/en/equations.yml +21 -0
  154. data/data/resources/document_elements/en/footers.yml +31 -0
  155. data/data/resources/document_elements/en/headers.yml +32 -0
  156. data/data/resources/document_elements/en/table_of_contents.yml +21 -0
  157. data/data/resources/document_elements/en/tables.yml +19 -0
  158. data/data/resources/document_elements/en/watermarks.yml +25 -0
  159. data/data/resources/document_elements/en-GB/bibliographies.yml +13 -0
  160. data/data/resources/document_elements/en-GB/cover_pages.yml +26 -0
  161. data/data/resources/document_elements/en-GB/equations.yml +21 -0
  162. data/data/resources/document_elements/en-GB/footers.yml +31 -0
  163. data/data/resources/document_elements/en-GB/headers.yml +32 -0
  164. data/data/resources/document_elements/en-GB/table_of_contents.yml +21 -0
  165. data/data/resources/document_elements/en-GB/tables.yml +19 -0
  166. data/data/resources/document_elements/en-GB/watermarks.yml +25 -0
  167. data/data/resources/document_elements/es/bibliographies.yml +13 -0
  168. data/data/resources/document_elements/es/cover_pages.yml +26 -0
  169. data/data/resources/document_elements/es/equations.yml +21 -0
  170. data/data/resources/document_elements/es/footers.yml +31 -0
  171. data/data/resources/document_elements/es/headers.yml +32 -0
  172. data/data/resources/document_elements/es/table_of_contents.yml +21 -0
  173. data/data/resources/document_elements/es/tables.yml +19 -0
  174. data/data/resources/document_elements/es/watermarks.yml +25 -0
  175. data/data/resources/document_elements/es-MX/bibliographies.yml +13 -0
  176. data/data/resources/document_elements/es-MX/cover_pages.yml +26 -0
  177. data/data/resources/document_elements/es-MX/equations.yml +21 -0
  178. data/data/resources/document_elements/es-MX/footers.yml +31 -0
  179. data/data/resources/document_elements/es-MX/headers.yml +32 -0
  180. data/data/resources/document_elements/es-MX/table_of_contents.yml +21 -0
  181. data/data/resources/document_elements/es-MX/tables.yml +19 -0
  182. data/data/resources/document_elements/es-MX/watermarks.yml +25 -0
  183. data/data/resources/document_elements/fi/bibliographies.yml +13 -0
  184. data/data/resources/document_elements/fi/cover_pages.yml +26 -0
  185. data/data/resources/document_elements/fi/equations.yml +21 -0
  186. data/data/resources/document_elements/fi/footers.yml +31 -0
  187. data/data/resources/document_elements/fi/headers.yml +32 -0
  188. data/data/resources/document_elements/fi/table_of_contents.yml +21 -0
  189. data/data/resources/document_elements/fi/tables.yml +19 -0
  190. data/data/resources/document_elements/fi/watermarks.yml +25 -0
  191. data/data/resources/document_elements/fr/bibliographies.yml +13 -0
  192. data/data/resources/document_elements/fr/cover_pages.yml +26 -0
  193. data/data/resources/document_elements/fr/equations.yml +21 -0
  194. data/data/resources/document_elements/fr/footers.yml +31 -0
  195. data/data/resources/document_elements/fr/headers.yml +32 -0
  196. data/data/resources/document_elements/fr/table_of_contents.yml +21 -0
  197. data/data/resources/document_elements/fr/tables.yml +19 -0
  198. data/data/resources/document_elements/fr/watermarks.yml +25 -0
  199. data/data/resources/document_elements/fr-CA/bibliographies.yml +13 -0
  200. data/data/resources/document_elements/fr-CA/cover_pages.yml +26 -0
  201. data/data/resources/document_elements/fr-CA/equations.yml +21 -0
  202. data/data/resources/document_elements/fr-CA/footers.yml +31 -0
  203. data/data/resources/document_elements/fr-CA/headers.yml +32 -0
  204. data/data/resources/document_elements/fr-CA/table_of_contents.yml +21 -0
  205. data/data/resources/document_elements/fr-CA/tables.yml +19 -0
  206. data/data/resources/document_elements/fr-CA/watermarks.yml +25 -0
  207. data/data/resources/document_elements/he/bibliographies.yml +13 -0
  208. data/data/resources/document_elements/he/cover_pages.yml +26 -0
  209. data/data/resources/document_elements/he/equations.yml +21 -0
  210. data/data/resources/document_elements/he/footers.yml +31 -0
  211. data/data/resources/document_elements/he/headers.yml +32 -0
  212. data/data/resources/document_elements/he/table_of_contents.yml +21 -0
  213. data/data/resources/document_elements/he/tables.yml +19 -0
  214. data/data/resources/document_elements/he/watermarks.yml +25 -0
  215. data/data/resources/document_elements/hu/bibliographies.yml +13 -0
  216. data/data/resources/document_elements/hu/cover_pages.yml +26 -0
  217. data/data/resources/document_elements/hu/equations.yml +21 -0
  218. data/data/resources/document_elements/hu/footers.yml +31 -0
  219. data/data/resources/document_elements/hu/headers.yml +32 -0
  220. data/data/resources/document_elements/hu/table_of_contents.yml +21 -0
  221. data/data/resources/document_elements/hu/tables.yml +19 -0
  222. data/data/resources/document_elements/hu/watermarks.yml +25 -0
  223. data/data/resources/document_elements/id/bibliographies.yml +13 -0
  224. data/data/resources/document_elements/id/cover_pages.yml +26 -0
  225. data/data/resources/document_elements/id/equations.yml +21 -0
  226. data/data/resources/document_elements/id/footers.yml +31 -0
  227. data/data/resources/document_elements/id/headers.yml +32 -0
  228. data/data/resources/document_elements/id/table_of_contents.yml +21 -0
  229. data/data/resources/document_elements/id/tables.yml +19 -0
  230. data/data/resources/document_elements/id/watermarks.yml +25 -0
  231. data/data/resources/document_elements/it/bibliographies.yml +13 -0
  232. data/data/resources/document_elements/it/cover_pages.yml +26 -0
  233. data/data/resources/document_elements/it/equations.yml +21 -0
  234. data/data/resources/document_elements/it/footers.yml +31 -0
  235. data/data/resources/document_elements/it/headers.yml +32 -0
  236. data/data/resources/document_elements/it/table_of_contents.yml +21 -0
  237. data/data/resources/document_elements/it/tables.yml +19 -0
  238. data/data/resources/document_elements/it/watermarks.yml +25 -0
  239. data/data/resources/document_elements/ja/bibliographies.yml +13 -0
  240. data/data/resources/document_elements/ja/cover_pages.yml +26 -0
  241. data/data/resources/document_elements/ja/equations.yml +21 -0
  242. data/data/resources/document_elements/ja/footers.yml +31 -0
  243. data/data/resources/document_elements/ja/headers.yml +32 -0
  244. data/data/resources/document_elements/ja/table_of_contents.yml +21 -0
  245. data/data/resources/document_elements/ja/tables.yml +19 -0
  246. data/data/resources/document_elements/ja/watermarks.yml +25 -0
  247. data/data/resources/document_elements/ko/bibliographies.yml +13 -0
  248. data/data/resources/document_elements/ko/cover_pages.yml +26 -0
  249. data/data/resources/document_elements/ko/equations.yml +21 -0
  250. data/data/resources/document_elements/ko/footers.yml +31 -0
  251. data/data/resources/document_elements/ko/headers.yml +32 -0
  252. data/data/resources/document_elements/ko/table_of_contents.yml +21 -0
  253. data/data/resources/document_elements/ko/tables.yml +19 -0
  254. data/data/resources/document_elements/ko/watermarks.yml +25 -0
  255. data/data/resources/document_elements/nl/bibliographies.yml +13 -0
  256. data/data/resources/document_elements/nl/cover_pages.yml +26 -0
  257. data/data/resources/document_elements/nl/equations.yml +21 -0
  258. data/data/resources/document_elements/nl/footers.yml +31 -0
  259. data/data/resources/document_elements/nl/headers.yml +32 -0
  260. data/data/resources/document_elements/nl/table_of_contents.yml +21 -0
  261. data/data/resources/document_elements/nl/tables.yml +19 -0
  262. data/data/resources/document_elements/nl/watermarks.yml +25 -0
  263. data/data/resources/document_elements/no/bibliographies.yml +13 -0
  264. data/data/resources/document_elements/no/cover_pages.yml +26 -0
  265. data/data/resources/document_elements/no/equations.yml +21 -0
  266. data/data/resources/document_elements/no/footers.yml +31 -0
  267. data/data/resources/document_elements/no/headers.yml +32 -0
  268. data/data/resources/document_elements/no/table_of_contents.yml +21 -0
  269. data/data/resources/document_elements/no/tables.yml +19 -0
  270. data/data/resources/document_elements/no/watermarks.yml +25 -0
  271. data/data/resources/document_elements/pl/bibliographies.yml +13 -0
  272. data/data/resources/document_elements/pl/cover_pages.yml +26 -0
  273. data/data/resources/document_elements/pl/equations.yml +21 -0
  274. data/data/resources/document_elements/pl/footers.yml +31 -0
  275. data/data/resources/document_elements/pl/headers.yml +32 -0
  276. data/data/resources/document_elements/pl/table_of_contents.yml +21 -0
  277. data/data/resources/document_elements/pl/tables.yml +19 -0
  278. data/data/resources/document_elements/pl/watermarks.yml +25 -0
  279. data/data/resources/document_elements/pt/bibliographies.yml +13 -0
  280. data/data/resources/document_elements/pt/cover_pages.yml +26 -0
  281. data/data/resources/document_elements/pt/equations.yml +21 -0
  282. data/data/resources/document_elements/pt/footers.yml +31 -0
  283. data/data/resources/document_elements/pt/headers.yml +32 -0
  284. data/data/resources/document_elements/pt/table_of_contents.yml +21 -0
  285. data/data/resources/document_elements/pt/tables.yml +19 -0
  286. data/data/resources/document_elements/pt/watermarks.yml +25 -0
  287. data/data/resources/document_elements/pt-PT/bibliographies.yml +13 -0
  288. data/data/resources/document_elements/pt-PT/cover_pages.yml +26 -0
  289. data/data/resources/document_elements/pt-PT/equations.yml +21 -0
  290. data/data/resources/document_elements/pt-PT/footers.yml +31 -0
  291. data/data/resources/document_elements/pt-PT/headers.yml +32 -0
  292. data/data/resources/document_elements/pt-PT/table_of_contents.yml +21 -0
  293. data/data/resources/document_elements/pt-PT/tables.yml +19 -0
  294. data/data/resources/document_elements/pt-PT/watermarks.yml +25 -0
  295. data/data/resources/document_elements/ru/bibliographies.yml +13 -0
  296. data/data/resources/document_elements/ru/cover_pages.yml +26 -0
  297. data/data/resources/document_elements/ru/equations.yml +21 -0
  298. data/data/resources/document_elements/ru/footers.yml +31 -0
  299. data/data/resources/document_elements/ru/headers.yml +32 -0
  300. data/data/resources/document_elements/ru/table_of_contents.yml +21 -0
  301. data/data/resources/document_elements/ru/tables.yml +19 -0
  302. data/data/resources/document_elements/ru/watermarks.yml +25 -0
  303. data/data/resources/document_elements/sk/bibliographies.yml +13 -0
  304. data/data/resources/document_elements/sk/cover_pages.yml +26 -0
  305. data/data/resources/document_elements/sk/equations.yml +21 -0
  306. data/data/resources/document_elements/sk/footers.yml +31 -0
  307. data/data/resources/document_elements/sk/headers.yml +32 -0
  308. data/data/resources/document_elements/sk/table_of_contents.yml +21 -0
  309. data/data/resources/document_elements/sk/tables.yml +19 -0
  310. data/data/resources/document_elements/sk/watermarks.yml +25 -0
  311. data/data/resources/document_elements/sv/bibliographies.yml +13 -0
  312. data/data/resources/document_elements/sv/cover_pages.yml +26 -0
  313. data/data/resources/document_elements/sv/equations.yml +21 -0
  314. data/data/resources/document_elements/sv/footers.yml +31 -0
  315. data/data/resources/document_elements/sv/headers.yml +32 -0
  316. data/data/resources/document_elements/sv/table_of_contents.yml +21 -0
  317. data/data/resources/document_elements/sv/tables.yml +19 -0
  318. data/data/resources/document_elements/sv/watermarks.yml +25 -0
  319. data/data/resources/document_elements/th/bibliographies.yml +13 -0
  320. data/data/resources/document_elements/th/cover_pages.yml +26 -0
  321. data/data/resources/document_elements/th/equations.yml +21 -0
  322. data/data/resources/document_elements/th/footers.yml +31 -0
  323. data/data/resources/document_elements/th/headers.yml +32 -0
  324. data/data/resources/document_elements/th/table_of_contents.yml +21 -0
  325. data/data/resources/document_elements/th/tables.yml +19 -0
  326. data/data/resources/document_elements/th/watermarks.yml +25 -0
  327. data/data/resources/document_elements/tr/bibliographies.yml +13 -0
  328. data/data/resources/document_elements/tr/cover_pages.yml +26 -0
  329. data/data/resources/document_elements/tr/equations.yml +21 -0
  330. data/data/resources/document_elements/tr/footers.yml +31 -0
  331. data/data/resources/document_elements/tr/headers.yml +32 -0
  332. data/data/resources/document_elements/tr/table_of_contents.yml +21 -0
  333. data/data/resources/document_elements/tr/tables.yml +19 -0
  334. data/data/resources/document_elements/tr/watermarks.yml +25 -0
  335. data/data/resources/document_elements/zh-CN/bibliographies.yml +13 -0
  336. data/data/resources/document_elements/zh-CN/cover_pages.yml +26 -0
  337. data/data/resources/document_elements/zh-CN/equations.yml +21 -0
  338. data/data/resources/document_elements/zh-CN/footers.yml +31 -0
  339. data/data/resources/document_elements/zh-CN/headers.yml +32 -0
  340. data/data/resources/document_elements/zh-CN/table_of_contents.yml +21 -0
  341. data/data/resources/document_elements/zh-CN/tables.yml +19 -0
  342. data/data/resources/document_elements/zh-CN/watermarks.yml +25 -0
  343. data/data/resources/document_elements/zh-TW/bibliographies.yml +13 -0
  344. data/data/resources/document_elements/zh-TW/cover_pages.yml +26 -0
  345. data/data/resources/document_elements/zh-TW/equations.yml +21 -0
  346. data/data/resources/document_elements/zh-TW/footers.yml +31 -0
  347. data/data/resources/document_elements/zh-TW/headers.yml +32 -0
  348. data/data/resources/document_elements/zh-TW/table_of_contents.yml +21 -0
  349. data/data/resources/document_elements/zh-TW/tables.yml +19 -0
  350. data/data/resources/document_elements/zh-TW/watermarks.yml +25 -0
  351. data/data/resources/font_registry.yml +135 -0
  352. data/data/schemas/ecma/opc-contentTypes.xsd +42 -0
  353. data/data/schemas/ecma/opc-coreProperties.xsd +50 -0
  354. data/data/schemas/ecma/opc-digSig.xsd +49 -0
  355. data/data/schemas/ecma/opc-relationships.xsd +33 -0
  356. data/data/schemas/iso/dml-chart.xsd +1499 -0
  357. data/data/schemas/iso/dml-chartDrawing.xsd +146 -0
  358. data/data/schemas/iso/dml-diagram.xsd +1085 -0
  359. data/data/schemas/iso/dml-lockedCanvas.xsd +11 -0
  360. data/data/schemas/iso/dml-main.xsd +3081 -0
  361. data/data/schemas/iso/dml-picture.xsd +23 -0
  362. data/data/schemas/iso/dml-spreadsheetDrawing.xsd +185 -0
  363. data/data/schemas/iso/dml-wordprocessingDrawing.xsd +287 -0
  364. data/data/schemas/iso/pml.xsd +1676 -0
  365. data/data/schemas/iso/shared-additionalCharacteristics.xsd +28 -0
  366. data/data/schemas/iso/shared-bibliography.xsd +144 -0
  367. data/data/schemas/iso/shared-commonSimpleTypes.xsd +172 -0
  368. data/data/schemas/iso/shared-customXmlDataProperties.xsd +25 -0
  369. data/data/schemas/iso/shared-customXmlSchemaProperties.xsd +18 -0
  370. data/data/schemas/iso/shared-documentPropertiesCustom.xsd +59 -0
  371. data/data/schemas/iso/shared-documentPropertiesExtended.xsd +56 -0
  372. data/data/schemas/iso/shared-documentPropertiesVariantTypes.xsd +195 -0
  373. data/data/schemas/iso/shared-math.xsd +582 -0
  374. data/data/schemas/iso/shared-relationshipReference.xsd +25 -0
  375. data/data/schemas/iso/sml.xsd +4439 -0
  376. data/data/schemas/iso/vml-main.xsd +570 -0
  377. data/data/schemas/iso/vml-officeDrawing.xsd +509 -0
  378. data/data/schemas/iso/vml-presentationDrawing.xsd +12 -0
  379. data/data/schemas/iso/vml-spreadsheetDrawing.xsd +108 -0
  380. data/data/schemas/iso/vml-wordprocessingDrawing.xsd +96 -0
  381. data/data/schemas/iso/wml.xsd +3646 -0
  382. data/data/schemas/iso/xml.xsd +116 -0
  383. data/data/schemas/mce/mc.xsd +75 -0
  384. data/data/schemas/microsoft/wml-2010.xsd +560 -0
  385. data/data/schemas/microsoft/wml-2012.xsd +66 -0
  386. data/data/schemas/microsoft/wml-2018.xsd +14 -0
  387. data/data/schemas/microsoft/wml-cex-2018.xsd +19 -0
  388. data/data/schemas/microsoft/wml-cid-2016.xsd +13 -0
  389. data/data/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  390. data/data/schemas/microsoft/wml-symex-2015.xsd +8 -0
  391. data/data/schemas/microsoft/word12.xsd +3 -0
  392. data/data/stylesets/ceremonial.yml +929 -0
  393. data/data/stylesets/classic.yml +1051 -0
  394. data/data/stylesets/contemporary.yml +951 -0
  395. data/data/stylesets/gazette.yml +1452 -0
  396. data/data/stylesets/heritage.yml +898 -0
  397. data/data/stylesets/minimal.yml +855 -0
  398. data/data/stylesets/ornate.yml +920 -0
  399. data/data/stylesets/outlook.yml +1428 -0
  400. data/data/stylesets/refined.yml +956 -0
  401. data/data/stylesets/scrollwork.yml +891 -0
  402. data/data/stylesets/signature.yml +903 -0
  403. data/data/stylesets/wicker.yml +1285 -0
  404. data/data/themes/abyss.yml +197 -0
  405. data/data/themes/archive.yml +197 -0
  406. data/data/themes/boardwalk.yml +197 -0
  407. data/data/themes/botanical.yml +197 -0
  408. data/data/themes/bulletin.yml +197 -0
  409. data/data/themes/calculus.yml +389 -0
  410. data/data/themes/constellation.yml +197 -0
  411. data/data/themes/contrail.yml +197 -0
  412. data/data/themes/corporate.yml +197 -0
  413. data/data/themes/emblem.yml +197 -0
  414. data/data/themes/exhibit.yml +197 -0
  415. data/data/themes/harvest.yml +197 -0
  416. data/data/themes/incision.yml +197 -0
  417. data/data/themes/lather.yml +197 -0
  418. data/data/themes/letterpress.yml +197 -0
  419. data/data/themes/memoir.yml +389 -0
  420. data/data/themes/meridian.yml +197 -0
  421. data/data/themes/mosaic.yml +197 -0
  422. data/data/themes/parkway.yml +197 -0
  423. data/data/themes/plasma.yml +197 -0
  424. data/data/themes/plumage.yml +197 -0
  425. data/data/themes/prism.yml +197 -0
  426. data/data/themes/ripple.yml +197 -0
  427. data/data/themes/spectrum.yml +197 -0
  428. data/data/themes/spotlight.yml +197 -0
  429. data/data/themes/vista.yml +197 -0
  430. data/data/themes/weave.yml +197 -0
  431. data/data/themes/workspace.yml +197 -0
  432. data/data/themes/zephyr.yml +197 -0
  433. data/exe/uniword +2 -2
  434. data/lib/uniword/accessibility/accessibility_checker.rb +4 -4
  435. data/lib/uniword/accessibility/accessibility_profile.rb +20 -11
  436. data/lib/uniword/accessibility/accessibility_report.rb +9 -9
  437. data/lib/uniword/accessibility/accessibility_rule.rb +7 -7
  438. data/lib/uniword/accessibility/accessibility_violation.rb +1 -1
  439. data/lib/uniword/accessibility/rules/descriptive_headings_rule.rb +5 -5
  440. data/lib/uniword/accessibility/rules/document_title_rule.rb +3 -3
  441. data/lib/uniword/accessibility/rules/heading_structure_rule.rb +6 -6
  442. data/lib/uniword/accessibility/rules/image_alt_text_rule.rb +7 -5
  443. data/lib/uniword/accessibility/rules/language_specification_rule.rb +2 -2
  444. data/lib/uniword/accessibility/rules/table_headers_rule.rb +2 -2
  445. data/lib/uniword/accessibility/rules.rb +4 -2
  446. data/lib/uniword/accessibility.rb +8 -4
  447. data/lib/uniword/assembly/assembly_manifest.rb +27 -18
  448. data/lib/uniword/assembly/component_registry.rb +10 -10
  449. data/lib/uniword/assembly/cross_reference_resolver.rb +1 -1
  450. data/lib/uniword/assembly/document_assembler.rb +19 -19
  451. data/lib/uniword/assembly/toc.rb +4 -4
  452. data/lib/uniword/assembly/toc_entry.rb +2 -1
  453. data/lib/uniword/assembly/toc_instruction.rb +3 -3
  454. data/lib/uniword/assembly/variable_substitutor.rb +2 -2
  455. data/lib/uniword/assembly.rb +2 -1
  456. data/lib/uniword/batch/batch_result.rb +20 -20
  457. data/lib/uniword/batch/document_processor.rb +32 -28
  458. data/lib/uniword/batch/processing_stage.rb +6 -6
  459. data/lib/uniword/batch/stages/compress_images_stage.rb +2 -2
  460. data/lib/uniword/batch/stages/convert_format_stage.rb +7 -7
  461. data/lib/uniword/batch/stages/normalize_styles_stage.rb +14 -14
  462. data/lib/uniword/batch/stages/quality_check_stage.rb +13 -9
  463. data/lib/uniword/batch/stages/update_metadata_stage.rb +7 -11
  464. data/lib/uniword/batch/stages/validate_links_stage.rb +9 -9
  465. data/lib/uniword/batch.rb +6 -3
  466. data/lib/uniword/bibliography/author.rb +21 -21
  467. data/lib/uniword/bibliography/city.rb +3 -3
  468. data/lib/uniword/bibliography/corporate.rb +3 -3
  469. data/lib/uniword/bibliography/day.rb +3 -3
  470. data/lib/uniword/bibliography/edition.rb +3 -3
  471. data/lib/uniword/bibliography/first.rb +3 -3
  472. data/lib/uniword/bibliography/first_name.rb +3 -3
  473. data/lib/uniword/bibliography/guid.rb +3 -3
  474. data/lib/uniword/bibliography/issue.rb +3 -3
  475. data/lib/uniword/bibliography/last.rb +3 -3
  476. data/lib/uniword/bibliography/last_name.rb +3 -3
  477. data/lib/uniword/bibliography/lcid.rb +3 -3
  478. data/lib/uniword/bibliography/locale_id.rb +3 -3
  479. data/lib/uniword/bibliography/month.rb +3 -3
  480. data/lib/uniword/bibliography/name_list.rb +3 -3
  481. data/lib/uniword/bibliography/pages.rb +3 -3
  482. data/lib/uniword/bibliography/person.rb +5 -5
  483. data/lib/uniword/bibliography/publisher.rb +3 -3
  484. data/lib/uniword/bibliography/ref_order.rb +3 -3
  485. data/lib/uniword/bibliography/source.rb +59 -55
  486. data/lib/uniword/bibliography/source_tag.rb +3 -3
  487. data/lib/uniword/bibliography/source_type.rb +3 -3
  488. data/lib/uniword/bibliography/sources.rb +6 -6
  489. data/lib/uniword/bibliography/tag.rb +3 -3
  490. data/lib/uniword/bibliography/title.rb +3 -3
  491. data/lib/uniword/bibliography/url.rb +3 -3
  492. data/lib/uniword/bibliography/volume_number.rb +3 -3
  493. data/lib/uniword/bibliography/year.rb +3 -3
  494. data/lib/uniword/bibliography.rb +30 -30
  495. data/lib/uniword/bookmark.rb +2 -2
  496. data/lib/uniword/builder/base_builder.rb +44 -0
  497. data/lib/uniword/builder/bibliography_builder.rb +7 -7
  498. data/lib/uniword/builder/chart_builder.rb +100 -159
  499. data/lib/uniword/builder/comment_builder.rb +1 -1
  500. data/lib/uniword/builder/document_builder.rb +18 -59
  501. data/lib/uniword/builder/footnote_builder.rb +2 -2
  502. data/lib/uniword/builder/has_borders.rb +26 -0
  503. data/lib/uniword/builder/has_shading.rb +19 -0
  504. data/lib/uniword/builder/header_footer_builder.rb +2 -2
  505. data/lib/uniword/builder/image_builder.rb +41 -36
  506. data/lib/uniword/builder/list_builder.rb +5 -4
  507. data/lib/uniword/builder/numbering_builder.rb +4 -16
  508. data/lib/uniword/builder/paragraph_builder.rb +16 -89
  509. data/lib/uniword/builder/run_builder.rb +31 -158
  510. data/lib/uniword/builder/sdt_builder.rb +19 -37
  511. data/lib/uniword/builder/section_builder.rb +11 -39
  512. data/lib/uniword/builder/style_builder.rb +3 -3
  513. data/lib/uniword/builder/table_builder.rb +11 -51
  514. data/lib/uniword/builder/table_cell_builder.rb +14 -58
  515. data/lib/uniword/builder/table_row_builder.rb +4 -16
  516. data/lib/uniword/builder/toc_builder.rb +4 -4
  517. data/lib/uniword/builder/watermark_builder.rb +17 -17
  518. data/lib/uniword/builder.rb +37 -36
  519. data/lib/uniword/chart/area3_d_chart.rb +9 -9
  520. data/lib/uniword/chart/area_chart.rb +8 -8
  521. data/lib/uniword/chart/auto_title_deleted.rb +3 -3
  522. data/lib/uniword/chart/axis_id.rb +3 -3
  523. data/lib/uniword/chart/axis_position.rb +3 -3
  524. data/lib/uniword/chart/bar3_d_chart.rb +11 -11
  525. data/lib/uniword/chart/bar_chart.rb +10 -10
  526. data/lib/uniword/chart/bubble_chart.rb +10 -10
  527. data/lib/uniword/chart/bubble_size.rb +4 -4
  528. data/lib/uniword/chart/cat_ax.rb +14 -14
  529. data/lib/uniword/chart/category_axis_data.rb +6 -6
  530. data/lib/uniword/chart/chart.rb +9 -8
  531. data/lib/uniword/chart/chart_reference.rb +3 -3
  532. data/lib/uniword/chart/chart_space.rb +9 -9
  533. data/lib/uniword/chart/color_map_override.rb +3 -3
  534. data/lib/uniword/chart/data_label.rb +9 -9
  535. data/lib/uniword/chart/data_labels.rb +12 -12
  536. data/lib/uniword/chart/date_ax.rb +14 -14
  537. data/lib/uniword/chart/diagram_reference.rb +3 -3
  538. data/lib/uniword/chart/doughnut_chart.rb +7 -7
  539. data/lib/uniword/chart/drop_lines.rb +3 -3
  540. data/lib/uniword/chart/error_bar_type.rb +3 -3
  541. data/lib/uniword/chart/error_bars.rb +10 -10
  542. data/lib/uniword/chart/error_direction.rb +3 -3
  543. data/lib/uniword/chart/explosion.rb +3 -3
  544. data/lib/uniword/chart/gap_width.rb +3 -3
  545. data/lib/uniword/chart/hi_low_lines.rb +3 -3
  546. data/lib/uniword/chart/index.rb +3 -3
  547. data/lib/uniword/chart/layout.rb +3 -3
  548. data/lib/uniword/chart/legend.rb +10 -9
  549. data/lib/uniword/chart/legend_entry.rb +5 -5
  550. data/lib/uniword/chart/legend_position.rb +3 -3
  551. data/lib/uniword/chart/line3_d_chart.rb +9 -9
  552. data/lib/uniword/chart/line_chart.rb +12 -12
  553. data/lib/uniword/chart/major_gridlines.rb +3 -3
  554. data/lib/uniword/chart/marker.rb +5 -5
  555. data/lib/uniword/chart/marker_size.rb +3 -3
  556. data/lib/uniword/chart/marker_style.rb +3 -3
  557. data/lib/uniword/chart/minor_gridlines.rb +3 -3
  558. data/lib/uniword/chart/number_reference.rb +4 -4
  559. data/lib/uniword/chart/numbering_format.rb +4 -4
  560. data/lib/uniword/chart/order.rb +3 -3
  561. data/lib/uniword/chart/orientation.rb +3 -3
  562. data/lib/uniword/chart/pie3_d_chart.rb +5 -5
  563. data/lib/uniword/chart/pie_chart.rb +6 -6
  564. data/lib/uniword/chart/plot_area.rb +9 -9
  565. data/lib/uniword/chart/plot_vis_only.rb +3 -3
  566. data/lib/uniword/chart/radar_chart.rb +7 -7
  567. data/lib/uniword/chart/scaling.rb +6 -6
  568. data/lib/uniword/chart/scatter_chart.rb +7 -7
  569. data/lib/uniword/chart/ser_ax.rb +13 -13
  570. data/lib/uniword/chart/series.rb +6 -6
  571. data/lib/uniword/chart/series_text.rb +4 -4
  572. data/lib/uniword/chart/shape_properties.rb +3 -3
  573. data/lib/uniword/chart/show_category_name.rb +3 -3
  574. data/lib/uniword/chart/show_legend_key.rb +3 -3
  575. data/lib/uniword/chart/show_value.rb +3 -3
  576. data/lib/uniword/chart/smooth.rb +3 -3
  577. data/lib/uniword/chart/stock_chart.rb +8 -8
  578. data/lib/uniword/chart/style.rb +3 -3
  579. data/lib/uniword/chart/surface3_d_chart.rb +6 -6
  580. data/lib/uniword/chart/surface_chart.rb +6 -6
  581. data/lib/uniword/chart/text_properties.rb +3 -3
  582. data/lib/uniword/chart/tick_label_position.rb +3 -3
  583. data/lib/uniword/chart/title.rb +7 -7
  584. data/lib/uniword/chart/trendline.rb +9 -9
  585. data/lib/uniword/chart/trendline_type.rb +3 -3
  586. data/lib/uniword/chart/up_down_bars.rb +5 -5
  587. data/lib/uniword/chart/val_ax.rb +16 -16
  588. data/lib/uniword/chart/values.rb +4 -4
  589. data/lib/uniword/chart/x_values.rb +4 -4
  590. data/lib/uniword/chart/y_values.rb +4 -4
  591. data/lib/uniword/cli/diff_cli.rb +188 -0
  592. data/lib/uniword/cli/generate_cli.rb +83 -0
  593. data/lib/uniword/cli/headers_cli.rb +159 -0
  594. data/lib/uniword/cli/helpers.rb +43 -0
  595. data/lib/uniword/cli/images_cli.rb +166 -0
  596. data/lib/uniword/cli/main.rb +550 -0
  597. data/lib/uniword/cli/protect_cli.rb +97 -0
  598. data/lib/uniword/cli/resources_cli.rb +165 -0
  599. data/lib/uniword/cli/review_cli.rb +291 -0
  600. data/lib/uniword/cli/spellcheck_cli.rb +102 -0
  601. data/lib/uniword/cli/styleset_cli.rb +191 -0
  602. data/lib/uniword/cli/template_cli.rb +194 -0
  603. data/lib/uniword/cli/theme_cli.rb +221 -0
  604. data/lib/uniword/cli/toc_cli.rb +154 -0
  605. data/lib/uniword/cli/watermark_cli.rb +97 -0
  606. data/lib/uniword/cli.rb +18 -735
  607. data/lib/uniword/column_configuration.rb +2 -2
  608. data/lib/uniword/comment.rb +7 -7
  609. data/lib/uniword/comment_range.rb +5 -5
  610. data/lib/uniword/comments_part.rb +7 -3
  611. data/lib/uniword/configuration/configuration_loader.rb +3 -3
  612. data/lib/uniword/configuration.rb +2 -1
  613. data/lib/uniword/content_types/default.rb +4 -4
  614. data/lib/uniword/content_types/override.rb +4 -4
  615. data/lib/uniword/content_types/types.rb +4 -7
  616. data/lib/uniword/content_types.rb +35 -35
  617. data/lib/uniword/customxml/custom_xml.rb +6 -6
  618. data/lib/uniword/customxml/custom_xml_attribute.rb +5 -5
  619. data/lib/uniword/customxml/custom_xml_block.rb +6 -6
  620. data/lib/uniword/customxml/custom_xml_cell.rb +6 -6
  621. data/lib/uniword/customxml/custom_xml_del_range_start.rb +5 -5
  622. data/lib/uniword/customxml/custom_xml_ins_range_end.rb +3 -3
  623. data/lib/uniword/customxml/custom_xml_ins_range_start.rb +5 -5
  624. data/lib/uniword/customxml/custom_xml_move_from_range_end.rb +3 -3
  625. data/lib/uniword/customxml/custom_xml_move_from_range_start.rb +5 -5
  626. data/lib/uniword/customxml/custom_xml_move_to_range_end.rb +3 -3
  627. data/lib/uniword/customxml/custom_xml_move_to_range_start.rb +5 -5
  628. data/lib/uniword/customxml/custom_xml_properties.rb +7 -6
  629. data/lib/uniword/customxml/custom_xml_row.rb +6 -6
  630. data/lib/uniword/customxml/custom_xml_run.rb +6 -6
  631. data/lib/uniword/customxml/data_binding.rb +5 -5
  632. data/lib/uniword/customxml/data_store_item.rb +4 -4
  633. data/lib/uniword/customxml/element_name.rb +3 -3
  634. data/lib/uniword/customxml/name.rb +3 -3
  635. data/lib/uniword/customxml/namespace_uri.rb +3 -3
  636. data/lib/uniword/customxml/placeholder.rb +3 -3
  637. data/lib/uniword/customxml/placeholder_text.rb +3 -3
  638. data/lib/uniword/customxml/prefix_mappings.rb +3 -3
  639. data/lib/uniword/customxml/schema_reference.rb +5 -5
  640. data/lib/uniword/customxml/showing_placeholder.rb +3 -3
  641. data/lib/uniword/customxml/showing_placeholder_header.rb +3 -3
  642. data/lib/uniword/customxml/smart_tag.rb +6 -6
  643. data/lib/uniword/customxml/smart_tag_attribute.rb +4 -4
  644. data/lib/uniword/customxml/smart_tag_element.rb +3 -3
  645. data/lib/uniword/customxml/smart_tag_name.rb +3 -3
  646. data/lib/uniword/customxml/smart_tag_properties.rb +5 -4
  647. data/lib/uniword/customxml/smart_tag_type.rb +5 -5
  648. data/lib/uniword/customxml/smart_tag_uri.rb +3 -3
  649. data/lib/uniword/customxml/store_item_id.rb +3 -3
  650. data/lib/uniword/customxml/x_path.rb +3 -3
  651. data/lib/uniword/customxml/x_path_expression.rb +3 -3
  652. data/lib/uniword/customxml.rb +45 -38
  653. data/lib/uniword/diff/diff_result.rb +100 -0
  654. data/lib/uniword/diff/document_differ.rb +517 -0
  655. data/lib/uniword/diff/formatter.rb +120 -0
  656. data/lib/uniword/diff/package_diff_result.rb +204 -0
  657. data/lib/uniword/diff/package_differ.rb +581 -0
  658. data/lib/uniword/diff.rb +19 -0
  659. data/lib/uniword/document_factory.rb +55 -26
  660. data/lib/uniword/document_variables/data_type.rb +3 -3
  661. data/lib/uniword/document_variables/default_value.rb +3 -3
  662. data/lib/uniword/document_variables/doc_var.rb +4 -4
  663. data/lib/uniword/document_variables/doc_vars.rb +3 -3
  664. data/lib/uniword/document_variables/read_only.rb +3 -3
  665. data/lib/uniword/document_variables/variable_binding.rb +5 -5
  666. data/lib/uniword/document_variables/variable_collection.rb +4 -4
  667. data/lib/uniword/document_variables/variable_expression.rb +3 -3
  668. data/lib/uniword/document_variables/variable_format.rb +3 -3
  669. data/lib/uniword/document_variables/variable_scope.rb +3 -3
  670. data/lib/uniword/document_writer.rb +18 -17
  671. data/lib/uniword/docx/document_statistics.rb +142 -0
  672. data/lib/uniword/docx/package.rb +492 -0
  673. data/lib/uniword/docx/package_defaults.rb +151 -0
  674. data/lib/uniword/docx/package_serialization.rb +490 -0
  675. data/lib/uniword/docx/profile.rb +256 -0
  676. data/lib/uniword/docx/reconciler.rb +1006 -0
  677. data/lib/uniword/docx.rb +15 -0
  678. data/lib/uniword/drawingml/adjust_value_list.rb +3 -3
  679. data/lib/uniword/drawingml/alpha.rb +3 -3
  680. data/lib/uniword/drawingml/alpha_bi_level.rb +3 -3
  681. data/lib/uniword/drawingml/alpha_modulation.rb +3 -3
  682. data/lib/uniword/drawingml/alpha_modulation_fixed.rb +3 -3
  683. data/lib/uniword/drawingml/alpha_offset.rb +3 -3
  684. data/lib/uniword/drawingml/arc_to.rb +6 -6
  685. data/lib/uniword/drawingml/background_color.rb +4 -4
  686. data/lib/uniword/drawingml/bevel_top.rb +5 -5
  687. data/lib/uniword/drawingml/bi_level.rb +3 -3
  688. data/lib/uniword/drawingml/blip.rb +11 -9
  689. data/lib/uniword/drawingml/blip_fill.rb +6 -6
  690. data/lib/uniword/drawingml/blue.rb +3 -3
  691. data/lib/uniword/drawingml/blur.rb +4 -4
  692. data/lib/uniword/drawingml/body_properties.rb +3 -3
  693. data/lib/uniword/drawingml/camera.rb +4 -4
  694. data/lib/uniword/drawingml/close_path.rb +2 -2
  695. data/lib/uniword/drawingml/color_scheme.rb +71 -71
  696. data/lib/uniword/drawingml/complex_script_font.rb +4 -4
  697. data/lib/uniword/drawingml/custom_dash.rb +3 -3
  698. data/lib/uniword/drawingml/custom_geometry.rb +4 -4
  699. data/lib/uniword/drawingml/dash_stop.rb +4 -4
  700. data/lib/uniword/drawingml/default_paragraph_properties.rb +4 -4
  701. data/lib/uniword/drawingml/duotone.rb +5 -4
  702. data/lib/uniword/drawingml/east_asian_font.rb +4 -4
  703. data/lib/uniword/drawingml/effect_container.rb +3 -3
  704. data/lib/uniword/drawingml/effect_list.rb +7 -7
  705. data/lib/uniword/drawingml/extension.rb +11 -11
  706. data/lib/uniword/drawingml/extension_list.rb +2 -2
  707. data/lib/uniword/drawingml/extents.rb +4 -4
  708. data/lib/uniword/drawingml/extra_color_scheme_list.rb +1 -1
  709. data/lib/uniword/drawingml/fill_overlay.rb +3 -3
  710. data/lib/uniword/drawingml/fill_rect.rb +27 -0
  711. data/lib/uniword/drawingml/fill_to_rect.rb +6 -6
  712. data/lib/uniword/drawingml/font_reference.rb +4 -4
  713. data/lib/uniword/drawingml/font_scheme.rb +30 -30
  714. data/lib/uniword/drawingml/foreground_color.rb +4 -4
  715. data/lib/uniword/drawingml/format_scheme.rb +23 -23
  716. data/lib/uniword/drawingml/gamma.rb +2 -2
  717. data/lib/uniword/drawingml/geometry_guide.rb +4 -4
  718. data/lib/uniword/drawingml/glow.rb +5 -5
  719. data/lib/uniword/drawingml/gradient_fill.rb +6 -6
  720. data/lib/uniword/drawingml/gradient_stop.rb +5 -5
  721. data/lib/uniword/drawingml/gradient_stop_list.rb +5 -4
  722. data/lib/uniword/drawingml/graphic.rb +3 -3
  723. data/lib/uniword/drawingml/graphic_data.rb +6 -6
  724. data/lib/uniword/drawingml/graphic_frame_locks.rb +24 -0
  725. data/lib/uniword/drawingml/grayscale.rb +2 -2
  726. data/lib/uniword/drawingml/green.rb +3 -3
  727. data/lib/uniword/drawingml/group_locking.rb +10 -10
  728. data/lib/uniword/drawingml/group_shape_properties.rb +3 -3
  729. data/lib/uniword/drawingml/gvml.rb +17 -12
  730. data/lib/uniword/drawingml/gvml_connector.rb +5 -5
  731. data/lib/uniword/drawingml/gvml_connector_non_visual.rb +4 -4
  732. data/lib/uniword/drawingml/gvml_graphic_frame_non_visual.rb +5 -4
  733. data/lib/uniword/drawingml/gvml_graphical_object_frame.rb +6 -5
  734. data/lib/uniword/drawingml/gvml_group_shape.rb +10 -10
  735. data/lib/uniword/drawingml/gvml_group_shape_non_visual.rb +4 -4
  736. data/lib/uniword/drawingml/gvml_picture.rb +6 -6
  737. data/lib/uniword/drawingml/gvml_picture_non_visual.rb +4 -4
  738. data/lib/uniword/drawingml/gvml_shape.rb +6 -6
  739. data/lib/uniword/drawingml/gvml_shape_non_visual.rb +4 -4
  740. data/lib/uniword/drawingml/gvml_text_shape.rb +5 -5
  741. data/lib/uniword/drawingml/gvml_use_shape_rectangle.rb +2 -2
  742. data/lib/uniword/drawingml/hue.rb +3 -3
  743. data/lib/uniword/drawingml/hue_modulation.rb +3 -3
  744. data/lib/uniword/drawingml/hue_offset.rb +3 -3
  745. data/lib/uniword/drawingml/inner_shadow.rb +7 -7
  746. data/lib/uniword/drawingml/inverse_gamma.rb +2 -2
  747. data/lib/uniword/drawingml/level1_paragraph_properties.rb +4 -4
  748. data/lib/uniword/drawingml/level2_paragraph_properties.rb +4 -4
  749. data/lib/uniword/drawingml/level3_paragraph_properties.rb +4 -4
  750. data/lib/uniword/drawingml/light_rig.rb +5 -5
  751. data/lib/uniword/drawingml/line_defaults.rb +6 -6
  752. data/lib/uniword/drawingml/line_join_miter.rb +3 -3
  753. data/lib/uniword/drawingml/line_join_round.rb +2 -2
  754. data/lib/uniword/drawingml/line_properties.rb +10 -10
  755. data/lib/uniword/drawingml/line_to.rb +3 -3
  756. data/lib/uniword/drawingml/linear_gradient.rb +4 -4
  757. data/lib/uniword/drawingml/list_style.rb +6 -6
  758. data/lib/uniword/drawingml/luminance.rb +3 -3
  759. data/lib/uniword/drawingml/luminance_modulation.rb +3 -3
  760. data/lib/uniword/drawingml/luminance_offset.rb +3 -3
  761. data/lib/uniword/drawingml/move_to.rb +3 -3
  762. data/lib/uniword/drawingml/no_fill.rb +2 -2
  763. data/lib/uniword/drawingml/non_visual_connector_properties.rb +3 -3
  764. data/lib/uniword/drawingml/non_visual_drawing_properties.rb +10 -4
  765. data/lib/uniword/drawingml/non_visual_graphic_frame_properties.rb +3 -3
  766. data/lib/uniword/drawingml/non_visual_group_drawing_shape_properties.rb +3 -3
  767. data/lib/uniword/drawingml/non_visual_picture_properties.rb +6 -5
  768. data/lib/uniword/drawingml/non_visual_shape_properties.rb +3 -3
  769. data/lib/uniword/drawingml/object_defaults.rb +4 -4
  770. data/lib/uniword/drawingml/office_art_extension.rb +5 -3
  771. data/lib/uniword/drawingml/office_art_extension_list.rb +5 -4
  772. data/lib/uniword/drawingml/offset.rb +4 -4
  773. data/lib/uniword/drawingml/outer_shadow.rb +11 -11
  774. data/lib/uniword/drawingml/path_gradient.rb +4 -4
  775. data/lib/uniword/drawingml/path_list.rb +3 -3
  776. data/lib/uniword/drawingml/pattern_fill.rb +5 -5
  777. data/lib/uniword/drawingml/picture_locking.rb +10 -10
  778. data/lib/uniword/drawingml/preset_dash.rb +3 -3
  779. data/lib/uniword/drawingml/preset_geometry.rb +4 -4
  780. data/lib/uniword/drawingml/preset_shadow.rb +5 -5
  781. data/lib/uniword/drawingml/red.rb +3 -3
  782. data/lib/uniword/drawingml/red_modulation.rb +3 -3
  783. data/lib/uniword/drawingml/red_offset.rb +3 -3
  784. data/lib/uniword/drawingml/reflection.rb +10 -10
  785. data/lib/uniword/drawingml/relative_rect.rb +6 -6
  786. data/lib/uniword/drawingml/rotation.rb +5 -5
  787. data/lib/uniword/drawingml/saturation.rb +3 -3
  788. data/lib/uniword/drawingml/saturation_modulation.rb +3 -3
  789. data/lib/uniword/drawingml/saturation_offset.rb +3 -3
  790. data/lib/uniword/drawingml/scene_3d.rb +4 -4
  791. data/lib/uniword/drawingml/scheme_color.rb +13 -13
  792. data/lib/uniword/drawingml/shade.rb +3 -3
  793. data/lib/uniword/drawingml/shape.rb +4 -4
  794. data/lib/uniword/drawingml/shape_3d.rb +6 -6
  795. data/lib/uniword/drawingml/shape_defaults.rb +6 -6
  796. data/lib/uniword/drawingml/shape_properties.rb +4 -4
  797. data/lib/uniword/drawingml/shape_style.rb +6 -6
  798. data/lib/uniword/drawingml/soft_edge.rb +3 -3
  799. data/lib/uniword/drawingml/solid_fill.rb +4 -4
  800. data/lib/uniword/drawingml/source_rect.rb +6 -6
  801. data/lib/uniword/drawingml/srgb_color.rb +13 -13
  802. data/lib/uniword/drawingml/stretch.rb +6 -2
  803. data/lib/uniword/drawingml/style_matrix.rb +6 -6
  804. data/lib/uniword/drawingml/style_matrix_reference.rb +5 -5
  805. data/lib/uniword/drawingml/style_reference.rb +4 -4
  806. data/lib/uniword/drawingml/text_body.rb +6 -5
  807. data/lib/uniword/drawingml/text_character_properties.rb +8 -8
  808. data/lib/uniword/drawingml/text_defaults.rb +6 -6
  809. data/lib/uniword/drawingml/text_font.rb +4 -4
  810. data/lib/uniword/drawingml/text_paragraph.rb +3 -3
  811. data/lib/uniword/drawingml/text_paragraph_properties.rb +5 -5
  812. data/lib/uniword/drawingml/text_run.rb +3 -3
  813. data/lib/uniword/drawingml/theme.rb +29 -29
  814. data/lib/uniword/drawingml/tile.rb +8 -8
  815. data/lib/uniword/drawingml/tile_rect.rb +6 -6
  816. data/lib/uniword/drawingml/tint.rb +3 -3
  817. data/lib/uniword/drawingml/transform2_d.rb +4 -4
  818. data/lib/uniword/drawingml/use_local_dpi.rb +21 -0
  819. data/lib/uniword/drawingml.rb +163 -144
  820. data/lib/uniword/element.rb +1 -1
  821. data/lib/uniword/element_registry.rb +1 -1
  822. data/lib/uniword/endnote.rb +1 -1
  823. data/lib/uniword/errors.rb +1 -1
  824. data/lib/uniword/field.rb +21 -21
  825. data/lib/uniword/footer.rb +8 -5
  826. data/lib/uniword/footnote.rb +1 -1
  827. data/lib/uniword/format_converter.rb +6 -6
  828. data/lib/uniword/format_detector.rb +39 -16
  829. data/lib/uniword/generation/document_generator.rb +135 -0
  830. data/lib/uniword/generation/structured_text_parser.rb +131 -0
  831. data/lib/uniword/generation/style_extractor.rb +90 -0
  832. data/lib/uniword/generation/style_mapper.rb +89 -0
  833. data/lib/uniword/generation.rb +17 -0
  834. data/lib/uniword/glossary/auto_text.rb +3 -3
  835. data/lib/uniword/glossary/category_name.rb +3 -3
  836. data/lib/uniword/glossary/doc_part.rb +4 -4
  837. data/lib/uniword/glossary/doc_part_behavior.rb +3 -3
  838. data/lib/uniword/glossary/doc_part_behaviors.rb +5 -4
  839. data/lib/uniword/glossary/doc_part_body.rb +7 -6
  840. data/lib/uniword/glossary/doc_part_category.rb +4 -4
  841. data/lib/uniword/glossary/doc_part_description.rb +3 -3
  842. data/lib/uniword/glossary/doc_part_gallery.rb +3 -3
  843. data/lib/uniword/glossary/doc_part_id.rb +3 -3
  844. data/lib/uniword/glossary/doc_part_name.rb +3 -3
  845. data/lib/uniword/glossary/doc_part_properties.rb +9 -9
  846. data/lib/uniword/glossary/doc_part_type.rb +3 -3
  847. data/lib/uniword/glossary/doc_part_types.rb +4 -4
  848. data/lib/uniword/glossary/doc_parts.rb +3 -3
  849. data/lib/uniword/glossary/equation.rb +3 -3
  850. data/lib/uniword/glossary/glossary_document.rb +5 -5
  851. data/lib/uniword/glossary/style_id.rb +3 -3
  852. data/lib/uniword/glossary/text_box.rb +3 -3
  853. data/lib/uniword/glossary.rb +19 -19
  854. data/lib/uniword/header.rb +8 -5
  855. data/lib/uniword/headers_footers/manager.rb +140 -0
  856. data/lib/uniword/headers_footers.rb +12 -0
  857. data/lib/uniword/hyperlink.rb +1 -1
  858. data/lib/uniword/image.rb +12 -9
  859. data/lib/uniword/images/image_info.rb +48 -0
  860. data/lib/uniword/images/image_manager.rb +253 -0
  861. data/lib/uniword/images.rb +15 -0
  862. data/lib/uniword/infrastructure/mime_packager.rb +15 -17
  863. data/lib/uniword/infrastructure/mime_parser.rb +28 -18
  864. data/lib/uniword/infrastructure/xml_namespace_normalizer.rb +8 -6
  865. data/lib/uniword/infrastructure/zip_extractor.rb +23 -15
  866. data/lib/uniword/infrastructure/zip_packager.rb +30 -29
  867. data/lib/uniword/lazy_loader.rb +5 -11
  868. data/lib/uniword/line_numbering.rb +11 -11
  869. data/lib/uniword/logger.rb +1 -1
  870. data/lib/uniword/math/accent.rb +4 -4
  871. data/lib/uniword/math/accent_properties.rb +4 -4
  872. data/lib/uniword/math/argument_properties.rb +3 -3
  873. data/lib/uniword/math/bar.rb +4 -4
  874. data/lib/uniword/math/bar_properties.rb +4 -4
  875. data/lib/uniword/math/begin_char.rb +3 -3
  876. data/lib/uniword/math/border_box.rb +4 -4
  877. data/lib/uniword/math/border_box_properties.rb +11 -11
  878. data/lib/uniword/math/box.rb +4 -4
  879. data/lib/uniword/math/box_properties.rb +8 -8
  880. data/lib/uniword/math/char.rb +3 -3
  881. data/lib/uniword/math/control_properties.rb +3 -3
  882. data/lib/uniword/math/degree.rb +4 -4
  883. data/lib/uniword/math/delimiter.rb +4 -4
  884. data/lib/uniword/math/delimiter_properties.rb +8 -8
  885. data/lib/uniword/math/denominator.rb +4 -4
  886. data/lib/uniword/math/element.rb +29 -24
  887. data/lib/uniword/math/end_char.rb +3 -3
  888. data/lib/uniword/math/equation_array.rb +4 -4
  889. data/lib/uniword/math/equation_array_properties.rb +8 -8
  890. data/lib/uniword/math/fraction.rb +5 -5
  891. data/lib/uniword/math/fraction_properties.rb +4 -4
  892. data/lib/uniword/math/function.rb +5 -5
  893. data/lib/uniword/math/function_name.rb +4 -4
  894. data/lib/uniword/math/function_properties.rb +3 -3
  895. data/lib/uniword/math/group_char.rb +4 -4
  896. data/lib/uniword/math/group_char_properties.rb +6 -6
  897. data/lib/uniword/math/lim.rb +4 -4
  898. data/lib/uniword/math/lower_limit.rb +5 -5
  899. data/lib/uniword/math/lower_limit_properties.rb +3 -3
  900. data/lib/uniword/math/math_break.rb +3 -3
  901. data/lib/uniword/math/math_font.rb +3 -3
  902. data/lib/uniword/math/math_properties.rb +18 -18
  903. data/lib/uniword/math/math_run.rb +5 -5
  904. data/lib/uniword/math/math_run_properties.rb +9 -9
  905. data/lib/uniword/math/math_simple_int_val.rb +3 -3
  906. data/lib/uniword/math/math_simple_val.rb +3 -3
  907. data/lib/uniword/math/math_style.rb +3 -3
  908. data/lib/uniword/math/math_text.rb +2 -2
  909. data/lib/uniword/math/matrix.rb +4 -4
  910. data/lib/uniword/math/matrix_column.rb +3 -3
  911. data/lib/uniword/math/matrix_column_properties.rb +4 -4
  912. data/lib/uniword/math/matrix_columns.rb +3 -3
  913. data/lib/uniword/math/matrix_properties.rb +10 -10
  914. data/lib/uniword/math/matrix_row.rb +3 -3
  915. data/lib/uniword/math/nary.rb +6 -6
  916. data/lib/uniword/math/nary_properties.rb +8 -8
  917. data/lib/uniword/math/numerator.rb +4 -4
  918. data/lib/uniword/math/o_math.rb +28 -23
  919. data/lib/uniword/math/o_math_para.rb +4 -4
  920. data/lib/uniword/math/o_math_para_properties.rb +3 -3
  921. data/lib/uniword/math/phantom.rb +4 -4
  922. data/lib/uniword/math/phantom_properties.rb +8 -8
  923. data/lib/uniword/math/plurimath_adapter.rb +26 -22
  924. data/lib/uniword/math/pre_sub_superscript.rb +6 -6
  925. data/lib/uniword/math/pre_sub_superscript_properties.rb +3 -3
  926. data/lib/uniword/math/radical.rb +5 -5
  927. data/lib/uniword/math/radical_properties.rb +4 -4
  928. data/lib/uniword/math/separator_char.rb +3 -3
  929. data/lib/uniword/math/sub.rb +4 -4
  930. data/lib/uniword/math/sub_superscript.rb +6 -6
  931. data/lib/uniword/math/sub_superscript_properties.rb +4 -4
  932. data/lib/uniword/math/subscript.rb +5 -5
  933. data/lib/uniword/math/subscript_properties.rb +3 -3
  934. data/lib/uniword/math/sup.rb +4 -4
  935. data/lib/uniword/math/superscript.rb +5 -5
  936. data/lib/uniword/math/superscript_properties.rb +3 -3
  937. data/lib/uniword/math/upper_limit.rb +5 -5
  938. data/lib/uniword/math/upper_limit_properties.rb +3 -3
  939. data/lib/uniword/math.rb +70 -68
  940. data/lib/uniword/math_equation.rb +6 -6
  941. data/lib/uniword/mhtml/css_number_formatter.rb +7 -6
  942. data/lib/uniword/mhtml/document.rb +24 -18
  943. data/lib/uniword/mhtml/html_part.rb +19 -18
  944. data/lib/uniword/mhtml/math_converter.rb +17 -15
  945. data/lib/uniword/mhtml/metadata/document_properties.rb +21 -21
  946. data/lib/uniword/mhtml/metadata/latent_styles.rb +8 -8
  947. data/lib/uniword/mhtml/metadata/office_document_settings.rb +4 -4
  948. data/lib/uniword/mhtml/metadata/word_document_settings.rb +16 -15
  949. data/lib/uniword/mhtml/metadata.rb +4 -2
  950. data/lib/uniword/mhtml/mhtml_package.rb +7 -9
  951. data/lib/uniword/mhtml/mime_part.rb +17 -13
  952. data/lib/uniword/mhtml/namespaces.rb +7 -7
  953. data/lib/uniword/mhtml/numbering_configuration.rb +3 -3
  954. data/lib/uniword/mhtml/styles_configuration.rb +3 -3
  955. data/lib/uniword/mhtml/theme.rb +2 -2
  956. data/lib/uniword/mhtml/word_css.rb +15 -29
  957. data/lib/uniword/office/bottom.rb +3 -3
  958. data/lib/uniword/office/brightness.rb +3 -3
  959. data/lib/uniword/office/button.rb +5 -5
  960. data/lib/uniword/office/callout.rb +10 -10
  961. data/lib/uniword/office/callout_anchor.rb +3 -3
  962. data/lib/uniword/office/checkbox.rb +4 -4
  963. data/lib/uniword/office/color_menu.rb +4 -4
  964. data/lib/uniword/office/color_mru.rb +4 -4
  965. data/lib/uniword/office/complex.rb +3 -3
  966. data/lib/uniword/office/diagram.rb +10 -10
  967. data/lib/uniword/office/diffusity.rb +3 -3
  968. data/lib/uniword/office/document_protection.rb +5 -5
  969. data/lib/uniword/office/document_view.rb +3 -3
  970. data/lib/uniword/office/edge.rb +4 -4
  971. data/lib/uniword/office/extrusion.rb +19 -19
  972. data/lib/uniword/office/extrusion_color.rb +4 -4
  973. data/lib/uniword/office/extrusion_color_mode.rb +3 -3
  974. data/lib/uniword/office/extrusion_ok.rb +3 -3
  975. data/lib/uniword/office/field.rb +4 -4
  976. data/lib/uniword/office/forms.rb +3 -3
  977. data/lib/uniword/office/id_map.rb +4 -4
  978. data/lib/uniword/office/ink.rb +4 -4
  979. data/lib/uniword/office/ink_annotation.rb +4 -4
  980. data/lib/uniword/office/left.rb +3 -3
  981. data/lib/uniword/office/lock.rb +7 -7
  982. data/lib/uniword/office/metal.rb +3 -3
  983. data/lib/uniword/office/proof_state.rb +4 -4
  984. data/lib/uniword/office/regroup.rb +3 -3
  985. data/lib/uniword/office/regroup_table.rb +3 -3
  986. data/lib/uniword/office/relation_table.rb +3 -3
  987. data/lib/uniword/office/right.rb +3 -3
  988. data/lib/uniword/office/rules.rb +3 -3
  989. data/lib/uniword/office/shape_defaults.rb +6 -6
  990. data/lib/uniword/office/shape_layout.rb +4 -4
  991. data/lib/uniword/office/signature_line.rb +12 -12
  992. data/lib/uniword/office/skew.rb +6 -6
  993. data/lib/uniword/office/specularity.rb +3 -3
  994. data/lib/uniword/office/top.rb +3 -3
  995. data/lib/uniword/office/writing_style.rb +6 -6
  996. data/lib/uniword/office/zoom.rb +3 -3
  997. data/lib/uniword/office.rb +41 -41
  998. data/lib/uniword/ooxml/additional_characteristics.rb +8 -8
  999. data/lib/uniword/ooxml/app_properties.rb +44 -44
  1000. data/lib/uniword/ooxml/core_properties.rb +15 -14
  1001. data/lib/uniword/ooxml/custom_properties.rb +35 -35
  1002. data/lib/uniword/ooxml/dotx_package.rb +161 -52
  1003. data/lib/uniword/ooxml/namespaces.rb +267 -114
  1004. data/lib/uniword/ooxml/package_file.rb +13 -10
  1005. data/lib/uniword/ooxml/relationships/hyperlink_relationship.rb +3 -3
  1006. data/lib/uniword/ooxml/relationships/image_relationship.rb +2 -2
  1007. data/lib/uniword/ooxml/relationships/office_document_relationship.rb +3 -3
  1008. data/lib/uniword/ooxml/relationships/package_relationship.rb +6 -6
  1009. data/lib/uniword/ooxml/relationships/package_relationships.rb +16 -16
  1010. data/lib/uniword/ooxml/relationships/relationship.rb +6 -6
  1011. data/lib/uniword/ooxml/relationships/relationships.rb +7 -6
  1012. data/lib/uniword/ooxml/relationships.rb +6 -3
  1013. data/lib/uniword/ooxml/schema/attribute_definition.rb +10 -9
  1014. data/lib/uniword/ooxml/schema/child_definition.rb +17 -17
  1015. data/lib/uniword/ooxml/schema/element_definition.rb +3 -3
  1016. data/lib/uniword/ooxml/schema/element_serializer.rb +43 -21
  1017. data/lib/uniword/ooxml/schema/ooxml_schema.rb +7 -6
  1018. data/lib/uniword/ooxml/schema_library.rb +9 -8
  1019. data/lib/uniword/ooxml/styleset_package.rb +1 -1
  1020. data/lib/uniword/ooxml/theme_package.rb +6 -6
  1021. data/lib/uniword/ooxml/thmx_package.rb +13 -12
  1022. data/lib/uniword/ooxml/types/cp_description_type.rb +1 -1
  1023. data/lib/uniword/ooxml/types/cp_keywords_type.rb +1 -1
  1024. data/lib/uniword/ooxml/types/cp_last_modified_by_type.rb +1 -1
  1025. data/lib/uniword/ooxml/types/cp_revision_type.rb +1 -1
  1026. data/lib/uniword/ooxml/types/dc_creator_type.rb +1 -1
  1027. data/lib/uniword/ooxml/types/dc_subject_type.rb +1 -1
  1028. data/lib/uniword/ooxml/types/dc_title_type.rb +1 -1
  1029. data/lib/uniword/ooxml/types/dcterms_created_type.rb +4 -4
  1030. data/lib/uniword/ooxml/types/dcterms_modified_type.rb +4 -4
  1031. data/lib/uniword/ooxml/types/dcterms_w3cdtf_type.rb +6 -35
  1032. data/lib/uniword/ooxml/types/mc_ignorable_type.rb +1 -1
  1033. data/lib/uniword/ooxml/types/on_off_type.rb +5 -5
  1034. data/lib/uniword/ooxml/types/ooxml_boolean.rb +7 -7
  1035. data/lib/uniword/ooxml/types/ooxml_boolean_optional.rb +7 -7
  1036. data/lib/uniword/ooxml/types/relationship_id.rb +18 -0
  1037. data/lib/uniword/ooxml/types/variant_types.rb +41 -41
  1038. data/lib/uniword/ooxml/types.rb +29 -25
  1039. data/lib/uniword/ooxml.rb +2 -2
  1040. data/lib/uniword/page_borders.rb +9 -9
  1041. data/lib/uniword/paragraph_border.rb +9 -8
  1042. data/lib/uniword/picture/fill_rect.rb +6 -6
  1043. data/lib/uniword/picture/non_visual_drawing_properties.rb +29 -0
  1044. data/lib/uniword/picture/non_visual_picture_drawing_properties.rb +4 -4
  1045. data/lib/uniword/picture/non_visual_picture_properties.rb +5 -5
  1046. data/lib/uniword/picture/picture.rb +5 -5
  1047. data/lib/uniword/picture/picture_blip_fill.rb +6 -6
  1048. data/lib/uniword/picture/picture_locks.rb +4 -4
  1049. data/lib/uniword/picture/picture_shape_properties.rb +5 -5
  1050. data/lib/uniword/picture/picture_source_rect.rb +6 -6
  1051. data/lib/uniword/picture/picture_stretch.rb +3 -3
  1052. data/lib/uniword/picture/tile.rb +7 -7
  1053. data/lib/uniword/picture.rb +4 -1
  1054. data/lib/uniword/presentationml/audio.rb +5 -5
  1055. data/lib/uniword/presentationml/body_properties.rb +7 -7
  1056. data/lib/uniword/presentationml/break.rb +3 -3
  1057. data/lib/uniword/presentationml/color_map.rb +6 -6
  1058. data/lib/uniword/presentationml/common_slide_data.rb +5 -5
  1059. data/lib/uniword/presentationml/common_time_node.rb +8 -8
  1060. data/lib/uniword/presentationml/connection_shape.rb +4 -4
  1061. data/lib/uniword/presentationml/embed.rb +3 -3
  1062. data/lib/uniword/presentationml/embedded_font.rb +4 -4
  1063. data/lib/uniword/presentationml/end_conditions_list.rb +3 -3
  1064. data/lib/uniword/presentationml/end_paragraph_run_properties.rb +5 -5
  1065. data/lib/uniword/presentationml/extension.rb +3 -3
  1066. data/lib/uniword/presentationml/extension_list.rb +3 -3
  1067. data/lib/uniword/presentationml/field.rb +7 -7
  1068. data/lib/uniword/presentationml/graphic_frame.rb +5 -5
  1069. data/lib/uniword/presentationml/group_shape.rb +6 -6
  1070. data/lib/uniword/presentationml/handout_master.rb +4 -4
  1071. data/lib/uniword/presentationml/handout_master_id_list.rb +3 -3
  1072. data/lib/uniword/presentationml/list_style.rb +6 -6
  1073. data/lib/uniword/presentationml/non_visual_shape_properties.rb +5 -5
  1074. data/lib/uniword/presentationml/notes.rb +5 -5
  1075. data/lib/uniword/presentationml/notes_master_id_list.rb +3 -3
  1076. data/lib/uniword/presentationml/notes_size.rb +4 -4
  1077. data/lib/uniword/presentationml/ole_object.rb +5 -5
  1078. data/lib/uniword/presentationml/paragraph.rb +7 -7
  1079. data/lib/uniword/presentationml/paragraph_properties.rb +7 -7
  1080. data/lib/uniword/presentationml/parallel_time_node.rb +3 -3
  1081. data/lib/uniword/presentationml/picture.rb +5 -5
  1082. data/lib/uniword/presentationml/presentation.rb +14 -11
  1083. data/lib/uniword/presentationml/run.rb +4 -4
  1084. data/lib/uniword/presentationml/run_properties.rb +9 -9
  1085. data/lib/uniword/presentationml/sequence_time_node.rb +5 -5
  1086. data/lib/uniword/presentationml/shape.rb +5 -5
  1087. data/lib/uniword/presentationml/shape_properties.rb +7 -7
  1088. data/lib/uniword/presentationml/shape_tree.rb +13 -11
  1089. data/lib/uniword/presentationml/slide.rb +8 -8
  1090. data/lib/uniword/presentationml/slide_id.rb +6 -5
  1091. data/lib/uniword/presentationml/slide_id_list.rb +3 -3
  1092. data/lib/uniword/presentationml/slide_layout.rb +8 -8
  1093. data/lib/uniword/presentationml/slide_master.rb +8 -8
  1094. data/lib/uniword/presentationml/slide_master_id.rb +6 -5
  1095. data/lib/uniword/presentationml/slide_master_id_list.rb +5 -4
  1096. data/lib/uniword/presentationml/slide_size.rb +5 -5
  1097. data/lib/uniword/presentationml/start_conditions_list.rb +3 -3
  1098. data/lib/uniword/presentationml/text_body.rb +5 -5
  1099. data/lib/uniword/presentationml/time_node_list.rb +4 -4
  1100. data/lib/uniword/presentationml/timing.rb +4 -4
  1101. data/lib/uniword/presentationml/transition.rb +8 -8
  1102. data/lib/uniword/presentationml/video.rb +4 -4
  1103. data/lib/uniword/presentationml.rb +54 -50
  1104. data/lib/uniword/properties/adjust_right_ind.rb +27 -0
  1105. data/lib/uniword/properties/alignment.rb +3 -3
  1106. data/lib/uniword/properties/auto_space_de.rb +27 -0
  1107. data/lib/uniword/properties/auto_space_dn.rb +27 -0
  1108. data/lib/uniword/properties/bold.rb +5 -5
  1109. data/lib/uniword/properties/boolean_formatting.rb +44 -30
  1110. data/lib/uniword/properties/border.rb +8 -8
  1111. data/lib/uniword/properties/borders.rb +8 -8
  1112. data/lib/uniword/properties/cell_vertical_align.rb +3 -3
  1113. data/lib/uniword/properties/cell_width.rb +4 -4
  1114. data/lib/uniword/properties/character_spacing.rb +3 -3
  1115. data/lib/uniword/properties/color_value.rb +6 -6
  1116. data/lib/uniword/properties/contextual_spacing.rb +4 -4
  1117. data/lib/uniword/properties/displaced_by_custom_xml_value.rb +18 -0
  1118. data/lib/uniword/properties/emphasis_mark.rb +3 -3
  1119. data/lib/uniword/properties/font_size.rb +3 -3
  1120. data/lib/uniword/properties/highlight.rb +3 -3
  1121. data/lib/uniword/properties/history_value.rb +17 -0
  1122. data/lib/uniword/properties/indentation.rb +6 -6
  1123. data/lib/uniword/properties/italic.rb +5 -5
  1124. data/lib/uniword/properties/kerning.rb +3 -3
  1125. data/lib/uniword/properties/language.rb +5 -5
  1126. data/lib/uniword/properties/margin.rb +3 -3
  1127. data/lib/uniword/properties/numbering_id.rb +3 -3
  1128. data/lib/uniword/properties/numbering_level.rb +3 -3
  1129. data/lib/uniword/properties/numbering_properties.rb +4 -4
  1130. data/lib/uniword/properties/outline.rb +6 -6
  1131. data/lib/uniword/properties/outline_level.rb +3 -3
  1132. data/lib/uniword/properties/page_break_before.rb +26 -0
  1133. data/lib/uniword/properties/position.rb +3 -3
  1134. data/lib/uniword/properties/relationship_id.rb +17 -0
  1135. data/lib/uniword/properties/run_fonts.rb +11 -11
  1136. data/lib/uniword/properties/shading.rb +6 -6
  1137. data/lib/uniword/properties/spacing.rb +12 -6
  1138. data/lib/uniword/properties/style_reference.rb +5 -5
  1139. data/lib/uniword/properties/tab_stop.rb +5 -5
  1140. data/lib/uniword/properties/table_caption.rb +19 -0
  1141. data/lib/uniword/properties/table_cell_margin.rb +6 -6
  1142. data/lib/uniword/properties/table_indent.rb +4 -4
  1143. data/lib/uniword/properties/table_justification.rb +3 -3
  1144. data/lib/uniword/properties/table_layout.rb +23 -0
  1145. data/lib/uniword/properties/table_look.rb +9 -9
  1146. data/lib/uniword/properties/table_width.rb +4 -4
  1147. data/lib/uniword/properties/tabs.rb +3 -3
  1148. data/lib/uniword/properties/text_fill.rb +3 -3
  1149. data/lib/uniword/properties/text_outline.rb +4 -4
  1150. data/lib/uniword/properties/underline.rb +6 -6
  1151. data/lib/uniword/properties/vertical_align.rb +3 -3
  1152. data/lib/uniword/properties/widow_control.rb +27 -0
  1153. data/lib/uniword/properties/width_scale.rb +3 -3
  1154. data/lib/uniword/properties/word2010_id_value.rb +17 -0
  1155. data/lib/uniword/properties.rb +69 -55
  1156. data/lib/uniword/protect/manager.rb +124 -0
  1157. data/lib/uniword/protect.rb +11 -0
  1158. data/lib/uniword/quality/document_checker.rb +10 -10
  1159. data/lib/uniword/quality/quality_report.rb +19 -19
  1160. data/lib/uniword/quality/quality_rule.rb +7 -7
  1161. data/lib/uniword/quality/rules/heading_hierarchy_rule.rb +2 -2
  1162. data/lib/uniword/quality/rules/image_alt_text_rule.rb +4 -4
  1163. data/lib/uniword/quality/rules/link_validation_rule.rb +8 -10
  1164. data/lib/uniword/quality/rules/paragraph_length_rule.rb +4 -4
  1165. data/lib/uniword/quality/rules/style_consistency_rule.rb +6 -5
  1166. data/lib/uniword/quality/rules/table_header_rule.rb +2 -2
  1167. data/lib/uniword/quality.rb +8 -4
  1168. data/lib/uniword/resource/cache.rb +1 -1
  1169. data/lib/uniword/resource/cache_paths.rb +9 -7
  1170. data/lib/uniword/resource/cache_version.rb +4 -3
  1171. data/lib/uniword/resource/color_scheme_loader.rb +36 -0
  1172. data/lib/uniword/resource/color_transformer.rb +2 -2
  1173. data/lib/uniword/resource/document_element_converter.rb +63 -0
  1174. data/lib/uniword/resource/document_element_loader.rb +54 -0
  1175. data/lib/uniword/resource/document_element_template.rb +54 -0
  1176. data/lib/uniword/resource/font_scheme_loader.rb +50 -0
  1177. data/lib/uniword/resource/font_substitutor.rb +98 -21
  1178. data/lib/uniword/resource/importer.rb +54 -6
  1179. data/lib/uniword/resource/resource_location.rb +1 -1
  1180. data/lib/uniword/resource/resource_resolver.rb +9 -7
  1181. data/lib/uniword/resource/theme_mapping_loader.rb +138 -0
  1182. data/lib/uniword/resource/theme_processor.rb +7 -10
  1183. data/lib/uniword/resource/theme_transition.rb +124 -0
  1184. data/lib/uniword/resource.rb +18 -0
  1185. data/lib/uniword/review/accept_reject.rb +120 -0
  1186. data/lib/uniword/review/interactive_review.rb +233 -0
  1187. data/lib/uniword/review/review_manager.rb +250 -0
  1188. data/lib/uniword/review.rb +19 -0
  1189. data/lib/uniword/revision.rb +8 -8
  1190. data/lib/uniword/schema/model_generator.rb +22 -21
  1191. data/lib/uniword/schema/schema_loader.rb +8 -8
  1192. data/lib/uniword/section.rb +28 -25
  1193. data/lib/uniword/section_properties.rb +15 -13
  1194. data/lib/uniword/serialization/ooxml_serializer.rb +3 -2
  1195. data/lib/uniword/shading.rb +15 -14
  1196. data/lib/uniword/shared_types/angle.rb +3 -3
  1197. data/lib/uniword/shared_types/boolean_value.rb +3 -3
  1198. data/lib/uniword/shared_types/decimal_number.rb +3 -3
  1199. data/lib/uniword/shared_types/emu_measure.rb +3 -3
  1200. data/lib/uniword/shared_types/fixed_percentage.rb +3 -3
  1201. data/lib/uniword/shared_types/hex_color.rb +3 -3
  1202. data/lib/uniword/shared_types/on_off.rb +3 -3
  1203. data/lib/uniword/shared_types/percent_value.rb +3 -3
  1204. data/lib/uniword/shared_types/pixel_measure.rb +3 -3
  1205. data/lib/uniword/shared_types/point_measure.rb +3 -3
  1206. data/lib/uniword/shared_types/positive_percentage.rb +3 -3
  1207. data/lib/uniword/shared_types/string_type.rb +3 -3
  1208. data/lib/uniword/shared_types/text_alignment.rb +3 -3
  1209. data/lib/uniword/shared_types/twips_measure.rb +3 -3
  1210. data/lib/uniword/shared_types/vertical_alignment.rb +3 -3
  1211. data/lib/uniword/shared_types.rb +16 -16
  1212. data/lib/uniword/spellcheck/grammar_checker.rb +135 -0
  1213. data/lib/uniword/spellcheck/hunspell_adapter.rb +100 -0
  1214. data/lib/uniword/spellcheck/spell_checker.rb +160 -0
  1215. data/lib/uniword/spellcheck/spellcheck_result.rb +82 -0
  1216. data/lib/uniword/spellcheck.rb +10 -0
  1217. data/lib/uniword/spreadsheetml/alignment.rb +8 -8
  1218. data/lib/uniword/spreadsheetml/authors.rb +5 -4
  1219. data/lib/uniword/spreadsheetml/auto_filter.rb +7 -6
  1220. data/lib/uniword/spreadsheetml/bold.rb +3 -3
  1221. data/lib/uniword/spreadsheetml/book_views.rb +3 -3
  1222. data/lib/uniword/spreadsheetml/border.rb +7 -7
  1223. data/lib/uniword/spreadsheetml/borders.rb +6 -5
  1224. data/lib/uniword/spreadsheetml/calc_properties.rb +5 -5
  1225. data/lib/uniword/spreadsheetml/cell.rb +7 -7
  1226. data/lib/uniword/spreadsheetml/cell_format.rb +12 -12
  1227. data/lib/uniword/spreadsheetml/cell_formats.rb +4 -4
  1228. data/lib/uniword/spreadsheetml/cell_formula.rb +6 -6
  1229. data/lib/uniword/spreadsheetml/cell_style.rb +8 -8
  1230. data/lib/uniword/spreadsheetml/cell_style_xfs.rb +4 -4
  1231. data/lib/uniword/spreadsheetml/cell_styles.rb +4 -4
  1232. data/lib/uniword/spreadsheetml/cell_value.rb +3 -3
  1233. data/lib/uniword/spreadsheetml/chartsheet.rb +4 -4
  1234. data/lib/uniword/spreadsheetml/col.rb +8 -8
  1235. data/lib/uniword/spreadsheetml/col_breaks.rb +4 -4
  1236. data/lib/uniword/spreadsheetml/color.rb +6 -6
  1237. data/lib/uniword/spreadsheetml/color_filter.rb +4 -4
  1238. data/lib/uniword/spreadsheetml/colors.rb +3 -3
  1239. data/lib/uniword/spreadsheetml/cols.rb +3 -3
  1240. data/lib/uniword/spreadsheetml/comment.rb +5 -5
  1241. data/lib/uniword/spreadsheetml/comment_list.rb +5 -4
  1242. data/lib/uniword/spreadsheetml/comments.rb +4 -4
  1243. data/lib/uniword/spreadsheetml/conditional_formatting.rb +6 -5
  1244. data/lib/uniword/spreadsheetml/conditional_formatting_rule.rb +5 -5
  1245. data/lib/uniword/spreadsheetml/custom_filter.rb +4 -4
  1246. data/lib/uniword/spreadsheetml/custom_filters.rb +6 -5
  1247. data/lib/uniword/spreadsheetml/custom_workbook_views.rb +3 -3
  1248. data/lib/uniword/spreadsheetml/data_validation.rb +13 -13
  1249. data/lib/uniword/spreadsheetml/data_validations.rb +6 -5
  1250. data/lib/uniword/spreadsheetml/date_group_item.rb +9 -9
  1251. data/lib/uniword/spreadsheetml/defined_name.rb +6 -6
  1252. data/lib/uniword/spreadsheetml/defined_names.rb +3 -3
  1253. data/lib/uniword/spreadsheetml/dimension.rb +3 -3
  1254. data/lib/uniword/spreadsheetml/drawing.rb +3 -3
  1255. data/lib/uniword/spreadsheetml/dynamic_filter.rb +5 -5
  1256. data/lib/uniword/spreadsheetml/external_reference.rb +3 -3
  1257. data/lib/uniword/spreadsheetml/external_references.rb +3 -3
  1258. data/lib/uniword/spreadsheetml/file_sharing.rb +3 -3
  1259. data/lib/uniword/spreadsheetml/file_version.rb +4 -4
  1260. data/lib/uniword/spreadsheetml/fill.rb +3 -3
  1261. data/lib/uniword/spreadsheetml/fills.rb +4 -4
  1262. data/lib/uniword/spreadsheetml/filter.rb +3 -3
  1263. data/lib/uniword/spreadsheetml/filter_column.rb +11 -11
  1264. data/lib/uniword/spreadsheetml/filters.rb +8 -7
  1265. data/lib/uniword/spreadsheetml/font.rb +7 -7
  1266. data/lib/uniword/spreadsheetml/font_name.rb +3 -3
  1267. data/lib/uniword/spreadsheetml/font_size.rb +3 -3
  1268. data/lib/uniword/spreadsheetml/fonts.rb +4 -4
  1269. data/lib/uniword/spreadsheetml/hyperlink.rb +7 -7
  1270. data/lib/uniword/spreadsheetml/hyperlinks.rb +3 -3
  1271. data/lib/uniword/spreadsheetml/icon_filter.rb +4 -4
  1272. data/lib/uniword/spreadsheetml/italic.rb +3 -3
  1273. data/lib/uniword/spreadsheetml/legacy_drawing.rb +3 -3
  1274. data/lib/uniword/spreadsheetml/merge_cell.rb +3 -3
  1275. data/lib/uniword/spreadsheetml/merge_cells.rb +4 -4
  1276. data/lib/uniword/spreadsheetml/number_format.rb +4 -4
  1277. data/lib/uniword/spreadsheetml/number_formats.rb +4 -4
  1278. data/lib/uniword/spreadsheetml/ole_object.rb +4 -4
  1279. data/lib/uniword/spreadsheetml/ole_objects.rb +3 -3
  1280. data/lib/uniword/spreadsheetml/ole_size.rb +3 -3
  1281. data/lib/uniword/spreadsheetml/pattern_fill.rb +5 -5
  1282. data/lib/uniword/spreadsheetml/phonetic_pr.rb +10 -10
  1283. data/lib/uniword/spreadsheetml/phonetic_properties.rb +4 -4
  1284. data/lib/uniword/spreadsheetml/pivot_caches.rb +3 -3
  1285. data/lib/uniword/spreadsheetml/pivot_table.rb +4 -4
  1286. data/lib/uniword/spreadsheetml/pivot_table_definition.rb +5 -5
  1287. data/lib/uniword/spreadsheetml/protected_ranges.rb +3 -3
  1288. data/lib/uniword/spreadsheetml/query_table.rb +4 -4
  1289. data/lib/uniword/spreadsheetml/rich_text_run.rb +4 -4
  1290. data/lib/uniword/spreadsheetml/row.rb +8 -8
  1291. data/lib/uniword/spreadsheetml/row_breaks.rb +4 -4
  1292. data/lib/uniword/spreadsheetml/run_properties.rb +6 -6
  1293. data/lib/uniword/spreadsheetml/scenarios.rb +5 -5
  1294. data/lib/uniword/spreadsheetml/shared_string_table.rb +7 -6
  1295. data/lib/uniword/spreadsheetml/sheet.rb +6 -6
  1296. data/lib/uniword/spreadsheetml/sheet_data.rb +3 -3
  1297. data/lib/uniword/spreadsheetml/sheet_format_pr.rb +12 -9
  1298. data/lib/uniword/spreadsheetml/sheet_protection.rb +6 -6
  1299. data/lib/uniword/spreadsheetml/sheet_view.rb +7 -7
  1300. data/lib/uniword/spreadsheetml/sheet_views.rb +3 -3
  1301. data/lib/uniword/spreadsheetml/sheets.rb +3 -3
  1302. data/lib/uniword/spreadsheetml/sort_condition.rb +9 -9
  1303. data/lib/uniword/spreadsheetml/sort_state.rb +6 -5
  1304. data/lib/uniword/spreadsheetml/sparkline_group.rb +4 -4
  1305. data/lib/uniword/spreadsheetml/sparkline_groups.rb +5 -4
  1306. data/lib/uniword/spreadsheetml/string_item.rb +5 -5
  1307. data/lib/uniword/spreadsheetml/table.rb +9 -9
  1308. data/lib/uniword/spreadsheetml/table_column.rb +4 -4
  1309. data/lib/uniword/spreadsheetml/table_columns.rb +4 -4
  1310. data/lib/uniword/spreadsheetml/table_formula.rb +3 -3
  1311. data/lib/uniword/spreadsheetml/table_parts.rb +4 -4
  1312. data/lib/uniword/spreadsheetml/table_style_info.rb +7 -7
  1313. data/lib/uniword/spreadsheetml/table_styles.rb +6 -5
  1314. data/lib/uniword/spreadsheetml/text.rb +4 -4
  1315. data/lib/uniword/spreadsheetml/top10.rb +6 -6
  1316. data/lib/uniword/spreadsheetml/workbook.rb +7 -7
  1317. data/lib/uniword/spreadsheetml/workbook_properties.rb +5 -5
  1318. data/lib/uniword/spreadsheetml/workbook_protection.rb +4 -4
  1319. data/lib/uniword/spreadsheetml/workbook_view.rb +5 -5
  1320. data/lib/uniword/spreadsheetml/worksheet/sheet_format_pr.rb +12 -9
  1321. data/lib/uniword/spreadsheetml/worksheet.rb +8 -8
  1322. data/lib/uniword/spreadsheetml.rb +108 -105
  1323. data/lib/uniword/streaming_parser.rb +21 -21
  1324. data/lib/uniword/styles.rb +12 -7
  1325. data/lib/uniword/styleset.rb +12 -12
  1326. data/lib/uniword/stylesets/package.rb +13 -9
  1327. data/lib/uniword/stylesets/styleset_importer.rb +10 -10
  1328. data/lib/uniword/stylesets/yaml_styleset_loader.rb +4 -4
  1329. data/lib/uniword/tab_stop.rb +13 -12
  1330. data/lib/uniword/table_border.rb +16 -15
  1331. data/lib/uniword/template/helpers/conditional_helper.rb +2 -1
  1332. data/lib/uniword/template/helpers/filter_helper.rb +20 -17
  1333. data/lib/uniword/template/template.rb +4 -2
  1334. data/lib/uniword/template/template_parser.rb +5 -5
  1335. data/lib/uniword/template/template_validator.rb +5 -4
  1336. data/lib/uniword/template/variable_resolver.rb +10 -10
  1337. data/lib/uniword/template_manager.rb +163 -0
  1338. data/lib/uniword/text_box.rb +5 -4
  1339. data/lib/uniword/text_frame.rb +16 -16
  1340. data/lib/uniword/theme/media_file.rb +18 -12
  1341. data/lib/uniword/theme/theme_applicator.rb +13 -12
  1342. data/lib/uniword/theme/theme_package_reader.rb +5 -5
  1343. data/lib/uniword/theme/theme_xml_parser.rb +67 -56
  1344. data/lib/uniword/theme_writer.rb +1 -1
  1345. data/lib/uniword/themes/theme.rb +29 -21
  1346. data/lib/uniword/themes/theme_importer.rb +24 -24
  1347. data/lib/uniword/themes/theme_transformation.rb +41 -13
  1348. data/lib/uniword/toc/toc_entry.rb +73 -0
  1349. data/lib/uniword/toc/toc_generator.rb +302 -0
  1350. data/lib/uniword/toc.rb +16 -0
  1351. data/lib/uniword/tracked_changes.rb +8 -7
  1352. data/lib/uniword/transformation/html_element_builder.rb +445 -0
  1353. data/lib/uniword/transformation/html_formatting_mapper.rb +245 -0
  1354. data/lib/uniword/transformation/html_to_ooxml_converter.rb +48 -457
  1355. data/lib/uniword/transformation/hyperlink_transformation_rule.rb +2 -2
  1356. data/lib/uniword/transformation/image_transformation_rule.rb +1 -1
  1357. data/lib/uniword/transformation/mhtml_element_renderer.rb +626 -0
  1358. data/lib/uniword/transformation/mhtml_metadata_builder.rb +233 -0
  1359. data/lib/uniword/transformation/mhtml_style_builder.rb +713 -0
  1360. data/lib/uniword/transformation/ooxml_to_html_converter.rb +19 -19
  1361. data/lib/uniword/transformation/ooxml_to_mhtml_converter.rb +182 -1278
  1362. data/lib/uniword/transformation/paragraph_transformation_rule.rb +10 -10
  1363. data/lib/uniword/transformation/run_transformation_rule.rb +1 -1
  1364. data/lib/uniword/transformation/table_transformation_rule.rb +3 -3
  1365. data/lib/uniword/transformation/transformation_rule_registry.rb +1 -1
  1366. data/lib/uniword/transformation/transformer.rb +41 -46
  1367. data/lib/uniword/transformation.rb +31 -11
  1368. data/lib/uniword/validation/checkers/external_link_checker.rb +30 -18
  1369. data/lib/uniword/validation/checkers/file_reference_checker.rb +25 -17
  1370. data/lib/uniword/validation/checkers/footnote_reference_checker.rb +19 -11
  1371. data/lib/uniword/validation/checkers/internal_link_checker.rb +19 -11
  1372. data/lib/uniword/validation/checkers.rb +4 -2
  1373. data/lib/uniword/validation/document_validator.rb +12 -12
  1374. data/lib/uniword/validation/layer_validation_result.rb +3 -3
  1375. data/lib/uniword/validation/layer_validator.rb +5 -5
  1376. data/lib/uniword/validation/link_validator.rb +8 -8
  1377. data/lib/uniword/validation/opc_validator.rb +229 -0
  1378. data/lib/uniword/validation/report/layer_result.rb +59 -0
  1379. data/lib/uniword/validation/report/terminal_formatter.rb +102 -0
  1380. data/lib/uniword/validation/report/validation_issue.rb +56 -0
  1381. data/lib/uniword/validation/report/verification_report.rb +66 -0
  1382. data/lib/uniword/validation/rules/base.rb +100 -0
  1383. data/lib/uniword/validation/rules/bookmarks_rule.rb +84 -0
  1384. data/lib/uniword/validation/rules/content_types_coverage_rule.rb +64 -0
  1385. data/lib/uniword/validation/rules/core_properties_namespace_rule.rb +86 -0
  1386. data/lib/uniword/validation/rules/document_context.rb +197 -0
  1387. data/lib/uniword/validation/rules/font_table_signature_rule.rb +55 -0
  1388. data/lib/uniword/validation/rules/fonts_rule.rb +64 -0
  1389. data/lib/uniword/validation/rules/footnotes_rule.rb +164 -0
  1390. data/lib/uniword/validation/rules/headers_footers_rule.rb +91 -0
  1391. data/lib/uniword/validation/rules/images_rule.rb +115 -0
  1392. data/lib/uniword/validation/rules/mc_ignorable_namespace_rule.rb +82 -0
  1393. data/lib/uniword/validation/rules/numbering_preservation_rule.rb +139 -0
  1394. data/lib/uniword/validation/rules/numbering_rule.rb +81 -0
  1395. data/lib/uniword/validation/rules/registry.rb +69 -0
  1396. data/lib/uniword/validation/rules/relationship_integrity_rule.rb +85 -0
  1397. data/lib/uniword/validation/rules/rsid_rule.rb +65 -0
  1398. data/lib/uniword/validation/rules/section_properties_rule.rb +72 -0
  1399. data/lib/uniword/validation/rules/settings_rule.rb +76 -0
  1400. data/lib/uniword/validation/rules/settings_values_rule.rb +76 -0
  1401. data/lib/uniword/validation/rules/style_references_rule.rb +98 -0
  1402. data/lib/uniword/validation/rules/tables_rule.rb +69 -0
  1403. data/lib/uniword/validation/rules/theme_completeness_rule.rb +72 -0
  1404. data/lib/uniword/validation/rules/theme_rule.rb +88 -0
  1405. data/lib/uniword/validation/rules.rb +47 -0
  1406. data/lib/uniword/validation/schema_registry.rb +200 -0
  1407. data/lib/uniword/validation/structural_validator.rb +116 -0
  1408. data/lib/uniword/validation/validation_report.rb +18 -18
  1409. data/lib/uniword/validation/validation_result.rb +3 -3
  1410. data/lib/uniword/validation/validators/content_type_validator.rb +28 -22
  1411. data/lib/uniword/validation/validators/document_semantics_validator.rb +42 -123
  1412. data/lib/uniword/validation/validators/file_structure_validator.rb +10 -7
  1413. data/lib/uniword/validation/validators/ooxml_part_validator.rb +19 -19
  1414. data/lib/uniword/validation/validators/relationship_validator.rb +22 -21
  1415. data/lib/uniword/validation/validators/xml_schema_validator.rb +110 -73
  1416. data/lib/uniword/validation/validators/zip_integrity_validator.rb +8 -8
  1417. data/lib/uniword/validation/validators.rb +10 -5
  1418. data/lib/uniword/validation/verify_orchestrator.rb +171 -0
  1419. data/lib/uniword/validation.rb +3 -1
  1420. data/lib/uniword/validators/element_validator.rb +11 -9
  1421. data/lib/uniword/validators/paragraph_validator.rb +5 -11
  1422. data/lib/uniword/validators/table_validator.rb +6 -12
  1423. data/lib/uniword/version.rb +1 -1
  1424. data/lib/uniword/visitor/text_extractor.rb +6 -6
  1425. data/lib/uniword/vml/arc.rb +13 -13
  1426. data/lib/uniword/vml/background.rb +9 -9
  1427. data/lib/uniword/vml/curve.rb +11 -11
  1428. data/lib/uniword/vml/fill.rb +8 -8
  1429. data/lib/uniword/vml/formula.rb +3 -3
  1430. data/lib/uniword/vml/formulas.rb +3 -3
  1431. data/lib/uniword/vml/group.rb +7 -7
  1432. data/lib/uniword/vml/handle.rb +11 -11
  1433. data/lib/uniword/vml/handles.rb +3 -3
  1434. data/lib/uniword/vml/image.rb +16 -16
  1435. data/lib/uniword/vml/imagedata.rb +14 -9
  1436. data/lib/uniword/vml/line.rb +10 -10
  1437. data/lib/uniword/vml/oval.rb +11 -11
  1438. data/lib/uniword/vml/path.rb +6 -6
  1439. data/lib/uniword/vml/polyline.rb +9 -9
  1440. data/lib/uniword/vml/rect.rb +11 -11
  1441. data/lib/uniword/vml/roundrect.rb +12 -12
  1442. data/lib/uniword/vml/shadow.rb +9 -9
  1443. data/lib/uniword/vml/shape.rb +22 -22
  1444. data/lib/uniword/vml/shapetype.rb +10 -10
  1445. data/lib/uniword/vml/stroke.rb +9 -9
  1446. data/lib/uniword/vml/textbox.rb +5 -5
  1447. data/lib/uniword/vml/textpath.rb +5 -5
  1448. data/lib/uniword/vml/wrap.rb +4 -4
  1449. data/lib/uniword/vml.rb +24 -24
  1450. data/lib/uniword/vml_office/vml_anchor_lock.rb +3 -3
  1451. data/lib/uniword/vml_office/vml_bottom.rb +4 -4
  1452. data/lib/uniword/vml_office/vml_callout.rb +10 -10
  1453. data/lib/uniword/vml_office/vml_clip_path.rb +4 -4
  1454. data/lib/uniword/vml_office/vml_color_mru.rb +4 -4
  1455. data/lib/uniword/vml_office/vml_column.rb +4 -4
  1456. data/lib/uniword/vml_office/vml_complex.rb +3 -3
  1457. data/lib/uniword/vml_office/vml_complex_extension.rb +4 -4
  1458. data/lib/uniword/vml_office/vml_diagram.rb +8 -8
  1459. data/lib/uniword/vml_office/vml_entry.rb +4 -4
  1460. data/lib/uniword/vml_office/vml_extrusion.rb +14 -14
  1461. data/lib/uniword/vml_office/vml_id_map.rb +4 -4
  1462. data/lib/uniword/vml_office/vml_ink.rb +5 -5
  1463. data/lib/uniword/vml_office/vml_left.rb +4 -4
  1464. data/lib/uniword/vml_office/vml_lock.rb +11 -11
  1465. data/lib/uniword/vml_office/vml_office_fill.rb +8 -8
  1466. data/lib/uniword/vml_office/vml_proxy.rb +6 -6
  1467. data/lib/uniword/vml_office/vml_regroup.rb +3 -3
  1468. data/lib/uniword/vml_office/vml_relation_table.rb +4 -4
  1469. data/lib/uniword/vml_office/vml_right.rb +4 -4
  1470. data/lib/uniword/vml_office/vml_rule.rb +5 -5
  1471. data/lib/uniword/vml_office/vml_rules.rb +4 -4
  1472. data/lib/uniword/vml_office/vml_shape_defaults.rb +9 -9
  1473. data/lib/uniword/vml_office/vml_shape_layout.rb +12 -12
  1474. data/lib/uniword/vml_office/vml_signature_line.rb +11 -11
  1475. data/lib/uniword/vml_office/vml_skew.rb +7 -7
  1476. data/lib/uniword/vml_office/vml_top.rb +4 -4
  1477. data/lib/uniword/vml_office/vml_wrap_block.rb +4 -4
  1478. data/lib/uniword/vml_office/vml_wrap_coords.rb +3 -3
  1479. data/lib/uniword/vml_office.rb +31 -31
  1480. data/lib/uniword/vml_word/border_bottom.rb +7 -7
  1481. data/lib/uniword/vml_word/border_left.rb +7 -7
  1482. data/lib/uniword/vml_word/border_right.rb +7 -7
  1483. data/lib/uniword/vml_word/border_top.rb +7 -7
  1484. data/lib/uniword/vml_word.rb +4 -4
  1485. data/lib/uniword/warnings/warning.rb +1 -1
  1486. data/lib/uniword/warnings/warning_collector.rb +9 -9
  1487. data/lib/uniword/warnings/warning_report.rb +6 -6
  1488. data/lib/uniword/watermark/manager.rb +119 -0
  1489. data/lib/uniword/watermark.rb +11 -0
  1490. data/lib/uniword/word2010_ext/wrap.rb +4 -4
  1491. data/lib/uniword/word2010_ext.rb +2 -2
  1492. data/lib/uniword/word_implementation.rb +12 -4
  1493. data/lib/uniword/word_implementation_factory.rb +1 -1
  1494. data/lib/uniword/word_implementation_linux.rb +7 -7
  1495. data/lib/uniword/word_implementation_macos.rb +8 -8
  1496. data/lib/uniword/word_implementation_null.rb +1 -1
  1497. data/lib/uniword/word_implementation_windows.rb +22 -17
  1498. data/lib/uniword/wordprocessing_group.rb +5 -5
  1499. data/lib/uniword/wordprocessing_shape.rb +10 -10
  1500. data/lib/uniword/wordprocessingml/abstract_num.rb +5 -5
  1501. data/lib/uniword/wordprocessingml/abstract_num_id.rb +3 -3
  1502. data/lib/uniword/wordprocessingml/alternate_content.rb +4 -4
  1503. data/lib/uniword/wordprocessingml/anchor.rb +9 -9
  1504. data/lib/uniword/wordprocessingml/based_on.rb +3 -3
  1505. data/lib/uniword/wordprocessingml/body.rb +38 -14
  1506. data/lib/uniword/wordprocessingml/bookmark_end.rb +5 -3
  1507. data/lib/uniword/wordprocessingml/bookmark_start.rb +6 -4
  1508. data/lib/uniword/wordprocessingml/border.rb +7 -7
  1509. data/lib/uniword/wordprocessingml/break.rb +4 -4
  1510. data/lib/uniword/wordprocessingml/carriage_return.rb +2 -2
  1511. data/lib/uniword/wordprocessingml/character_style.rb +64 -63
  1512. data/lib/uniword/wordprocessingml/choice.rb +4 -4
  1513. data/lib/uniword/wordprocessingml/cnf_style.rb +15 -15
  1514. data/lib/uniword/wordprocessingml/columns.rb +5 -5
  1515. data/lib/uniword/wordprocessingml/comment_range_end.rb +3 -3
  1516. data/lib/uniword/wordprocessingml/comment_range_start.rb +3 -3
  1517. data/lib/uniword/wordprocessingml/comment_reference.rb +3 -3
  1518. data/lib/uniword/wordprocessingml/compat.rb +7 -6
  1519. data/lib/uniword/wordprocessingml/compat_setting.rb +5 -5
  1520. data/lib/uniword/wordprocessingml/deleted_text.rb +3 -3
  1521. data/lib/uniword/wordprocessingml/doc_defaults.rb +4 -4
  1522. data/lib/uniword/wordprocessingml/doc_grid.rb +5 -5
  1523. data/lib/uniword/wordprocessingml/doc_pr.rb +5 -5
  1524. data/lib/uniword/wordprocessingml/document_root/feature_facade.rb +317 -0
  1525. data/lib/uniword/wordprocessingml/document_root.rb +145 -30
  1526. data/lib/uniword/wordprocessingml/drawing.rb +4 -4
  1527. data/lib/uniword/wordprocessingml/emboss.rb +3 -3
  1528. data/lib/uniword/wordprocessingml/endnote.rb +5 -5
  1529. data/lib/uniword/wordprocessingml/endnote_ref.rb +2 -2
  1530. data/lib/uniword/wordprocessingml/endnote_reference.rb +3 -3
  1531. data/lib/uniword/wordprocessingml/endnotes.rb +5 -4
  1532. data/lib/uniword/wordprocessingml/extent.rb +4 -4
  1533. data/lib/uniword/wordprocessingml/fallback.rb +4 -4
  1534. data/lib/uniword/wordprocessingml/field_char.rb +4 -4
  1535. data/lib/uniword/wordprocessingml/font.rb +36 -26
  1536. data/lib/uniword/wordprocessingml/font_table.rb +23 -5
  1537. data/lib/uniword/wordprocessingml/fonts.rb +3 -3
  1538. data/lib/uniword/wordprocessingml/footer.rb +4 -4
  1539. data/lib/uniword/wordprocessingml/footer_reference.rb +6 -8
  1540. data/lib/uniword/wordprocessingml/footnote.rb +5 -5
  1541. data/lib/uniword/wordprocessingml/footnote_ref.rb +2 -2
  1542. data/lib/uniword/wordprocessingml/footnote_reference.rb +3 -3
  1543. data/lib/uniword/wordprocessingml/footnotes.rb +5 -4
  1544. data/lib/uniword/wordprocessingml/graphic.rb +3 -3
  1545. data/lib/uniword/wordprocessingml/graphic_data.rb +3 -3
  1546. data/lib/uniword/wordprocessingml/grid_after.rb +3 -3
  1547. data/lib/uniword/wordprocessingml/grid_before.rb +3 -3
  1548. data/lib/uniword/wordprocessingml/grid_col.rb +3 -3
  1549. data/lib/uniword/wordprocessingml/header.rb +4 -4
  1550. data/lib/uniword/wordprocessingml/header_reference.rb +6 -8
  1551. data/lib/uniword/wordprocessingml/hide_mark.rb +20 -0
  1552. data/lib/uniword/wordprocessingml/hyperlink.rb +14 -32
  1553. data/lib/uniword/wordprocessingml/imprint.rb +3 -3
  1554. data/lib/uniword/wordprocessingml/inline.rb +5 -5
  1555. data/lib/uniword/wordprocessingml/instr_text.rb +7 -6
  1556. data/lib/uniword/wordprocessingml/last_rendered_page_break.rb +2 -2
  1557. data/lib/uniword/wordprocessingml/latent_styles.rb +16 -16
  1558. data/lib/uniword/wordprocessingml/level.rb +50 -16
  1559. data/lib/uniword/wordprocessingml/link.rb +3 -3
  1560. data/lib/uniword/wordprocessingml/lvl_jc.rb +3 -3
  1561. data/lib/uniword/wordprocessingml/lvl_text.rb +3 -3
  1562. data/lib/uniword/wordprocessingml/mc_requires.rb +1 -1
  1563. data/lib/uniword/wordprocessingml/multi_level_type.rb +3 -3
  1564. data/lib/uniword/wordprocessingml/next.rb +3 -3
  1565. data/lib/uniword/wordprocessingml/no_break_hyphen.rb +2 -2
  1566. data/lib/uniword/wordprocessingml/no_wrap.rb +2 -2
  1567. data/lib/uniword/wordprocessingml/num.rb +7 -4
  1568. data/lib/uniword/wordprocessingml/num_fmt.rb +3 -3
  1569. data/lib/uniword/wordprocessingml/numbering.rb +29 -5
  1570. data/lib/uniword/wordprocessingml/numbering_configuration.rb +29 -9
  1571. data/lib/uniword/wordprocessingml/numbering_definition.rb +37 -27
  1572. data/lib/uniword/wordprocessingml/numbering_elements.rb +14 -14
  1573. data/lib/uniword/wordprocessingml/numbering_instance.rb +40 -8
  1574. data/lib/uniword/wordprocessingml/numbering_level.rb +9 -8
  1575. data/lib/uniword/wordprocessingml/object.rb +4 -4
  1576. data/lib/uniword/wordprocessingml/outline.rb +3 -3
  1577. data/lib/uniword/wordprocessingml/p_pr_default.rb +3 -3
  1578. data/lib/uniword/wordprocessingml/page_margins.rb +9 -9
  1579. data/lib/uniword/wordprocessingml/page_numbering.rb +6 -4
  1580. data/lib/uniword/wordprocessingml/page_size.rb +7 -5
  1581. data/lib/uniword/wordprocessingml/paragraph.rb +33 -75
  1582. data/lib/uniword/wordprocessingml/paragraph_borders.rb +9 -11
  1583. data/lib/uniword/wordprocessingml/paragraph_properties.rb +108 -119
  1584. data/lib/uniword/wordprocessingml/paragraph_style.rb +66 -59
  1585. data/lib/uniword/wordprocessingml/pict.rb +3 -3
  1586. data/lib/uniword/wordprocessingml/picture.rb +4 -4
  1587. data/lib/uniword/wordprocessingml/position_tab.rb +5 -5
  1588. data/lib/uniword/wordprocessingml/proof_err.rb +3 -3
  1589. data/lib/uniword/wordprocessingml/r_pr_default.rb +3 -3
  1590. data/lib/uniword/wordprocessingml/recipient_data.rb +5 -5
  1591. data/lib/uniword/wordprocessingml/recipients.rb +5 -4
  1592. data/lib/uniword/wordprocessingml/run.rb +34 -28
  1593. data/lib/uniword/wordprocessingml/run_properties/accessors.rb +74 -0
  1594. data/lib/uniword/wordprocessingml/run_properties/conversion.rb +167 -0
  1595. data/lib/uniword/wordprocessingml/run_properties/predicates.rb +96 -0
  1596. data/lib/uniword/wordprocessingml/run_properties/yaml_transforms.rb +205 -0
  1597. data/lib/uniword/wordprocessingml/run_properties.rb +89 -598
  1598. data/lib/uniword/wordprocessingml/section_properties.rb +29 -19
  1599. data/lib/uniword/wordprocessingml/semi_hidden.rb +3 -3
  1600. data/lib/uniword/wordprocessingml/settings.rb +174 -136
  1601. data/lib/uniword/wordprocessingml/shading.rb +7 -7
  1602. data/lib/uniword/wordprocessingml/shadow.rb +3 -3
  1603. data/lib/uniword/wordprocessingml/shape.rb +5 -5
  1604. data/lib/uniword/wordprocessingml/simple_field.rb +5 -5
  1605. data/lib/uniword/wordprocessingml/simple_pos.rb +4 -4
  1606. data/lib/uniword/wordprocessingml/soft_hyphen.rb +2 -2
  1607. data/lib/uniword/wordprocessingml/start.rb +3 -3
  1608. data/lib/uniword/wordprocessingml/structured_document_tag/alias.rb +3 -3
  1609. data/lib/uniword/wordprocessingml/structured_document_tag/appearance.rb +3 -3
  1610. data/lib/uniword/wordprocessingml/structured_document_tag/bibliography.rb +2 -2
  1611. data/lib/uniword/wordprocessingml/structured_document_tag/content.rb +19 -10
  1612. data/lib/uniword/wordprocessingml/structured_document_tag/data_binding.rb +6 -5
  1613. data/lib/uniword/wordprocessingml/structured_document_tag/date.rb +16 -15
  1614. data/lib/uniword/wordprocessingml/structured_document_tag/doc_part_obj.rb +11 -10
  1615. data/lib/uniword/wordprocessingml/structured_document_tag/end_properties.rb +3 -3
  1616. data/lib/uniword/wordprocessingml/structured_document_tag/id.rb +3 -3
  1617. data/lib/uniword/wordprocessingml/structured_document_tag/placeholder.rb +5 -5
  1618. data/lib/uniword/wordprocessingml/structured_document_tag/run_properties.rb +31 -31
  1619. data/lib/uniword/wordprocessingml/structured_document_tag/showing_placeholder_header.rb +2 -2
  1620. data/lib/uniword/wordprocessingml/structured_document_tag/tag.rb +3 -3
  1621. data/lib/uniword/wordprocessingml/structured_document_tag/temporary.rb +2 -2
  1622. data/lib/uniword/wordprocessingml/structured_document_tag/text.rb +5 -2
  1623. data/lib/uniword/wordprocessingml/structured_document_tag.rb +15 -10
  1624. data/lib/uniword/wordprocessingml/structured_document_tag_properties.rb +17 -16
  1625. data/lib/uniword/wordprocessingml/style.rb +48 -171
  1626. data/lib/uniword/wordprocessingml/style_name.rb +3 -3
  1627. data/lib/uniword/wordprocessingml/styles/list_style_definition.rb +2 -2
  1628. data/lib/uniword/wordprocessingml/styles/paragraph_style_definition.rb +3 -2
  1629. data/lib/uniword/wordprocessingml/styles/style_definition.rb +1 -1
  1630. data/lib/uniword/wordprocessingml/styles/style_library.rb +1 -1
  1631. data/lib/uniword/wordprocessingml/styles/table_style_definition.rb +7 -5
  1632. data/lib/uniword/wordprocessingml/styles.rb +4 -2
  1633. data/lib/uniword/wordprocessingml/styles_configuration.rb +47 -19
  1634. data/lib/uniword/wordprocessingml/symbol.rb +4 -4
  1635. data/lib/uniword/wordprocessingml/tab.rb +4 -4
  1636. data/lib/uniword/wordprocessingml/tab_stop.rb +5 -37
  1637. data/lib/uniword/wordprocessingml/table.rb +8 -7
  1638. data/lib/uniword/wordprocessingml/table_borders.rb +8 -8
  1639. data/lib/uniword/wordprocessingml/table_cell.rb +8 -38
  1640. data/lib/uniword/wordprocessingml/table_cell_borders.rb +6 -6
  1641. data/lib/uniword/wordprocessingml/table_cell_margin.rb +7 -7
  1642. data/lib/uniword/wordprocessingml/table_cell_properties.rb +14 -28
  1643. data/lib/uniword/wordprocessingml/table_grid.rb +3 -3
  1644. data/lib/uniword/wordprocessingml/table_properties.rb +18 -253
  1645. data/lib/uniword/wordprocessingml/table_row.rb +9 -25
  1646. data/lib/uniword/wordprocessingml/table_row_properties.rb +13 -9
  1647. data/lib/uniword/wordprocessingml/table_style.rb +3 -3
  1648. data/lib/uniword/wordprocessingml/text.rb +6 -13
  1649. data/lib/uniword/wordprocessingml/text_box_content.rb +7 -6
  1650. data/lib/uniword/wordprocessingml/text_direction.rb +3 -3
  1651. data/lib/uniword/wordprocessingml/title_pg.rb +20 -0
  1652. data/lib/uniword/wordprocessingml/tr_height.rb +4 -4
  1653. data/lib/uniword/wordprocessingml/ui_priority.rb +3 -3
  1654. data/lib/uniword/wordprocessingml/val_int.rb +3 -3
  1655. data/lib/uniword/wordprocessingml/w14_attributes.rb +1 -1
  1656. data/lib/uniword/wordprocessingml/web_settings.rb +30 -7
  1657. data/lib/uniword/wordprocessingml/width_after.rb +4 -4
  1658. data/lib/uniword/wordprocessingml/width_before.rb +4 -4
  1659. data/lib/uniword/wordprocessingml/zoom.rb +3 -3
  1660. data/lib/uniword/wordprocessingml.rb +209 -197
  1661. data/lib/uniword/wordprocessingml_2010/checkbox.rb +5 -5
  1662. data/lib/uniword/wordprocessingml_2010/checked_state.rb +4 -4
  1663. data/lib/uniword/wordprocessingml_2010/conditional_format_style.rb +7 -7
  1664. data/lib/uniword/wordprocessingml_2010/conflict_deletion.rb +5 -5
  1665. data/lib/uniword/wordprocessingml_2010/conflict_insertion.rb +5 -5
  1666. data/lib/uniword/wordprocessingml_2010/conflict_mode.rb +3 -3
  1667. data/lib/uniword/wordprocessingml_2010/custom_xml_conflict_insertion.rb +4 -4
  1668. data/lib/uniword/wordprocessingml_2010/doc_id.rb +3 -3
  1669. data/lib/uniword/wordprocessingml_2010/doc_part_gallery.rb +3 -3
  1670. data/lib/uniword/wordprocessingml_2010/doc_part_obj.rb +5 -5
  1671. data/lib/uniword/wordprocessingml_2010/entity_picker.rb +3 -3
  1672. data/lib/uniword/wordprocessingml_2010/ligatures.rb +3 -3
  1673. data/lib/uniword/wordprocessingml_2010/number_form.rb +3 -3
  1674. data/lib/uniword/wordprocessingml_2010/para_id.rb +3 -3
  1675. data/lib/uniword/wordprocessingml_2010/props3d.rb +5 -5
  1676. data/lib/uniword/wordprocessingml_2010/sdt_content.rb +3 -3
  1677. data/lib/uniword/wordprocessingml_2010/sdt_properties.rb +5 -5
  1678. data/lib/uniword/wordprocessingml_2010/structured_document_tag.rb +4 -4
  1679. data/lib/uniword/wordprocessingml_2010/text_fill.rb +5 -5
  1680. data/lib/uniword/wordprocessingml_2010/text_glow.rb +4 -4
  1681. data/lib/uniword/wordprocessingml_2010/text_id.rb +3 -3
  1682. data/lib/uniword/wordprocessingml_2010/text_outline.rb +6 -6
  1683. data/lib/uniword/wordprocessingml_2010/text_reflection.rb +6 -6
  1684. data/lib/uniword/wordprocessingml_2010/text_shadow.rb +6 -6
  1685. data/lib/uniword/wordprocessingml_2010/unchecked_state.rb +4 -4
  1686. data/lib/uniword/wordprocessingml_2010.rb +30 -26
  1687. data/lib/uniword/wordprocessingml_2013/chart_props.rb +4 -4
  1688. data/lib/uniword/wordprocessingml_2013/chart_tracking_ref_based.rb +3 -3
  1689. data/lib/uniword/wordprocessingml_2013/comment_author.rb +5 -5
  1690. data/lib/uniword/wordprocessingml_2013/comment_collapsed.rb +3 -3
  1691. data/lib/uniword/wordprocessingml_2013/comment_done.rb +3 -3
  1692. data/lib/uniword/wordprocessingml_2013/comment_ex.rb +5 -5
  1693. data/lib/uniword/wordprocessingml_2013/comments_ids.rb +3 -3
  1694. data/lib/uniword/wordprocessingml_2013/doc_part_anchor.rb +3 -3
  1695. data/lib/uniword/wordprocessingml_2013/document_part.rb +3 -3
  1696. data/lib/uniword/wordprocessingml_2013/footnote_columns.rb +3 -3
  1697. data/lib/uniword/wordprocessingml_2013/people_group.rb +4 -4
  1698. data/lib/uniword/wordprocessingml_2013/person.rb +5 -5
  1699. data/lib/uniword/wordprocessingml_2013/presence_info.rb +4 -4
  1700. data/lib/uniword/wordprocessingml_2013/repeating_section.rb +4 -4
  1701. data/lib/uniword/wordprocessingml_2013/repeating_section_item.rb +3 -3
  1702. data/lib/uniword/wordprocessingml_2013/sdt_appearance.rb +3 -3
  1703. data/lib/uniword/wordprocessingml_2013/sdt_color.rb +3 -3
  1704. data/lib/uniword/wordprocessingml_2013/sdt_data_binding.rb +4 -4
  1705. data/lib/uniword/wordprocessingml_2013/web_extension.rb +3 -3
  1706. data/lib/uniword/wordprocessingml_2013/web_extension_linked.rb +3 -3
  1707. data/lib/uniword/wordprocessingml_2013.rb +26 -21
  1708. data/lib/uniword/wordprocessingml_2016/cell_rsid.rb +3 -3
  1709. data/lib/uniword/wordprocessingml_2016/chart_color_style.rb +3 -3
  1710. data/lib/uniword/wordprocessingml_2016/chart_style2016.rb +3 -3
  1711. data/lib/uniword/wordprocessingml_2016/comments_ext.rb +4 -4
  1712. data/lib/uniword/wordprocessingml_2016/conflict_mode2016.rb +3 -3
  1713. data/lib/uniword/wordprocessingml_2016/content_id.rb +3 -3
  1714. data/lib/uniword/wordprocessingml_2016/data_binding2016.rb +5 -5
  1715. data/lib/uniword/wordprocessingml_2016/extension.rb +4 -4
  1716. data/lib/uniword/wordprocessingml_2016/extension_list.rb +3 -3
  1717. data/lib/uniword/wordprocessingml_2016/persistent_document_id.rb +3 -3
  1718. data/lib/uniword/wordprocessingml_2016/row_rsid.rb +3 -3
  1719. data/lib/uniword/wordprocessingml_2016/sdt_appearance2016.rb +3 -3
  1720. data/lib/uniword/wordprocessingml_2016/separator_extension.rb +3 -3
  1721. data/lib/uniword/wordprocessingml_2016/table_rsid.rb +3 -3
  1722. data/lib/uniword/wordprocessingml_2016/web_video_property.rb +4 -4
  1723. data/lib/uniword/wordprocessingml_2016.rb +21 -16
  1724. data/lib/uniword/wp_drawing/align.rb +3 -3
  1725. data/lib/uniword/wp_drawing/allow_overlap.rb +3 -3
  1726. data/lib/uniword/wp_drawing/anchor.rb +29 -27
  1727. data/lib/uniword/wp_drawing/behind_doc.rb +3 -3
  1728. data/lib/uniword/wp_drawing/c_nv_graphic_frame_pr.rb +5 -5
  1729. data/lib/uniword/wp_drawing/doc_pr.rb +7 -7
  1730. data/lib/uniword/wp_drawing/doc_properties.rb +8 -6
  1731. data/lib/uniword/wp_drawing/effect_extent.rb +6 -6
  1732. data/lib/uniword/wp_drawing/extent.rb +4 -4
  1733. data/lib/uniword/wp_drawing/hidden.rb +3 -3
  1734. data/lib/uniword/wp_drawing/inline.rb +16 -11
  1735. data/lib/uniword/wp_drawing/layout_in_cell.rb +3 -3
  1736. data/lib/uniword/wp_drawing/line_to.rb +4 -4
  1737. data/lib/uniword/wp_drawing/locked.rb +3 -3
  1738. data/lib/uniword/wp_drawing/non_visual_drawing_props.rb +6 -4
  1739. data/lib/uniword/wp_drawing/pos_offset.rb +3 -3
  1740. data/lib/uniword/wp_drawing/position_h.rb +5 -5
  1741. data/lib/uniword/wp_drawing/position_v.rb +5 -5
  1742. data/lib/uniword/wp_drawing/relative_height.rb +3 -3
  1743. data/lib/uniword/wp_drawing/simple_pos.rb +4 -4
  1744. data/lib/uniword/wp_drawing/size_rel_h.rb +4 -4
  1745. data/lib/uniword/wp_drawing/size_rel_v.rb +4 -4
  1746. data/lib/uniword/wp_drawing/start.rb +4 -4
  1747. data/lib/uniword/wp_drawing/wrap_none.rb +2 -2
  1748. data/lib/uniword/wp_drawing/wrap_polygon.rb +5 -5
  1749. data/lib/uniword/wp_drawing/wrap_square.rb +8 -8
  1750. data/lib/uniword/wp_drawing/wrap_through.rb +6 -6
  1751. data/lib/uniword/wp_drawing/wrap_tight.rb +6 -6
  1752. data/lib/uniword/wp_drawing/wrap_top_and_bottom.rb +5 -5
  1753. data/lib/uniword/wp_drawing.rb +30 -29
  1754. data/lib/uniword.rb +139 -121
  1755. metadata +583 -41
  1756. data/lib/uniword/document_properties/app_version.rb +0 -22
  1757. data/lib/uniword/document_properties/application.rb +0 -22
  1758. data/lib/uniword/document_properties/bool_value.rb +0 -22
  1759. data/lib/uniword/document_properties/company.rb +0 -22
  1760. data/lib/uniword/document_properties/custom_properties.rb +0 -23
  1761. data/lib/uniword/document_properties/custom_property.rb +0 -37
  1762. data/lib/uniword/document_properties/doc_security.rb +0 -22
  1763. data/lib/uniword/document_properties/extended_properties.rb +0 -41
  1764. data/lib/uniword/document_properties/file_time.rb +0 -22
  1765. data/lib/uniword/document_properties/heading_pairs.rb +0 -23
  1766. data/lib/uniword/document_properties/hyperlinks_changed.rb +0 -22
  1767. data/lib/uniword/document_properties/i4.rb +0 -22
  1768. data/lib/uniword/document_properties/links_up_to_date.rb +0 -22
  1769. data/lib/uniword/document_properties/lpw_str.rb +0 -22
  1770. data/lib/uniword/document_properties/manager.rb +0 -22
  1771. data/lib/uniword/document_properties/scale_crop.rb +0 -22
  1772. data/lib/uniword/document_properties/shared_doc.rb +0 -22
  1773. data/lib/uniword/document_properties/titles_of_parts.rb +0 -23
  1774. data/lib/uniword/document_properties/variant.rb +0 -25
  1775. data/lib/uniword/document_properties/vector.rb +0 -27
  1776. data/lib/uniword/document_properties.rb +0 -32
  1777. data/lib/uniword/metadata/metadata.rb +0 -345
  1778. data/lib/uniword/metadata/metadata_extractor.rb +0 -403
  1779. data/lib/uniword/metadata/metadata_index.rb +0 -455
  1780. data/lib/uniword/metadata/metadata_manager.rb +0 -334
  1781. data/lib/uniword/metadata/metadata_updater.rb +0 -243
  1782. data/lib/uniword/metadata/metadata_validator.rb +0 -326
  1783. data/lib/uniword/metadata.rb +0 -12
  1784. data/lib/uniword/ooxml/docx_package.rb +0 -989
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'nokogiri'
4
-
5
3
  module Uniword
6
4
  module Transformation
7
5
  # Converts OOXML DocumentRoot to Mhtml::Document for full-fidelity MHT output.
@@ -9,20 +7,117 @@ module Uniword
9
7
  # This is COMPLETELY SEPARATE from OoxmlToHtmlConverter which produces HTML5.
10
8
  # This converter produces Word HTML4 with proper MIME multipart structure.
11
9
  #
10
+ # Delegates to:
11
+ # - MhtmlStyleBuilder for static style templates
12
+ # - MhtmlElementRenderer for element-to-HTML conversion
13
+ # - MhtmlMetadataBuilder for metadata, properties, and file parts
14
+ #
12
15
  # @example Transform DOCX to MHT
13
- # docx_doc = Uniword::Ooxml::DocxPackage.from_file("document.docx")
16
+ # docx_doc = Uniword::Docx::Package.from_file("document.docx")
14
17
  # mhtml_doc = OoxmlToMhtmlConverter.document_to_mht(docx_doc)
15
18
  # output = Uniword::Infrastructure::MimePackager.new(mhtml_doc).build_mime_content
16
19
  #
17
20
  class OoxmlToMhtmlConverter
21
+ # Static MsoNormalTable CSS (used in wrap_html_document head)
22
+ MSO_NORMAL_TABLE_STYLE = <<~CSS
23
+ <!--[if gte mso 10]>
24
+ <style>
25
+ /* Style Definitions */
26
+ table.MsoNormalTable
27
+ {mso-style-name:"Table Normal";
28
+ mso-tstyle-rowband-size:0;
29
+ mso-tstyle-colband-size:0;
30
+ mso-style-noshow:yes;
31
+ mso-style-priority:99;
32
+ mso-style-parent:"";
33
+ mso-padding-alt:0in 5.4pt 0in 5.4pt;
34
+ mso-para-margin-top:0in;
35
+ mso-para-margin-right:0in;
36
+ mso-para-margin-bottom:8.0pt;
37
+ mso-para-margin-left:0in;
38
+ line-height:115%;
39
+ mso-pagination:widow-orphan;
40
+ font-size:12.0pt;
41
+ font-family:"Aptos",sans-serif;
42
+ mso-ascii-font-family:Aptos;
43
+ mso-ascii-theme-font:minor-latin;
44
+ mso-hansi-font-family:Aptos;
45
+ mso-hansi-theme-font:minor-latin;
46
+ mso-font-kerning:1.0pt;
47
+ mso-ligatures:standardcontextual;}
48
+ </style>
49
+ <![endif]-->
50
+ CSS
51
+
52
+ # Static VML behavior style block
53
+ VML_BEHAVIOR_STYLE = <<~CSS
54
+ <!--[if !mso]>
55
+ <style>
56
+ v:* {behavior:url(#default#VML);}
57
+ o:* {behavior:url(#default#VML);}
58
+ w:* {behavior:url(#default#VML);}
59
+ .shape {behavior:url(#default#VML);}
60
+ </style>
61
+ <![endif]-->
62
+ CSS
63
+
64
+ # Static WordDocument XML block (compatibility settings + MathPr)
65
+ WORD_DOCUMENT_XML = <<~XML
66
+ <!--[if gte mso 9]><xml>
67
+ <w:WordDocument xmlns:w="urn:schemas-microsoft-com:office:word">
68
+ <w:TrackMoves>false</w:TrackMoves>
69
+ <w:TrackFormatting/>
70
+ <w:PunctuationKerning/>
71
+ <w:ValidateAgainstSchemas/>
72
+ <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
73
+ <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
74
+ <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
75
+ <w:DoNotPromoteQF/>
76
+ <w:LidThemeOther>en-US</w:LidThemeOther>
77
+ <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
78
+ <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
79
+ <w:Compatibility>
80
+ <w:BreakWrappedTables/>
81
+ <w:SnapToGridInCell/>
82
+ <w:WrapTextWithPunct/>
83
+ <w:UseAsianBreakRules/>
84
+ <w:DontGrowAutofit/>
85
+ <w:SplitPgBreakAndParaMark/>
86
+ <w:EnableOpenTypeKerning/>
87
+ <w:DontFlipMirrorIndents/>
88
+ <w:OverrideTableStyleHps/>
89
+ <w:UseFELayout/>
90
+ </w:Compatibility>
91
+ <w:MathPr>
92
+ <w:MathFont w:val="Cambria Math"/>
93
+ <w:brkBin w:val="before"/>
94
+ <w:brkBinSub w:val="&#45;-"/>
95
+ <w:smallFrac w:val="off"/>
96
+ <w:dispDef/>
97
+ <w:lMargin w:val="0"/>
98
+ <w:rMargin w:val="0"/>
99
+ <w:defJc w:val="centerGroup"/>
100
+ <w:wrapIndent w:val="1440"/>
101
+ <w:intLim w:val="subSup"/>
102
+ <w:naryLim w:val="undOvr"/>
103
+ </w:MathPr>
104
+ </w:WordDocument>
105
+ </xml><![endif]-->
106
+ XML
107
+
108
+ # Static OfficeDocumentSettings XML
109
+ OFFICE_SETTINGS_XML = <<~XML
110
+ <o:OfficeDocumentSettings xmlns:o="urn:schemas-microsoft-com:office:office">
111
+ <o:AllowPNG/>
112
+ </o:OfficeDocumentSettings>
113
+ XML
114
+
18
115
  # Convert OOXML DocumentRoot to Mhtml::Document
19
116
  #
20
117
  # @param document [Uniword::Wordprocessingml::DocumentRoot] OOXML document
21
118
  # @param core_properties [Uniword::Ooxml::CoreProperties] Optional core properties
22
- # (if not provided, uses document.core_properties which may be lazily initialized)
23
119
  # @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'
120
+ # @param document_name [String] Optional document name
26
121
  # @return [Uniword::Mhtml::Document] MHT document model
27
122
  def self.document_to_mht(document, core_properties = nil, relationships = nil,
28
123
  document_name = nil)
@@ -36,17 +131,23 @@ module Uniword
36
131
  # @param core_properties [Uniword::Ooxml::CoreProperties] Optional core properties
37
132
  # @param relationships [Uniword::Ooxml::Relationships::PackageRelationships] Optional relationships
38
133
  # @return [String] Word HTML4 body content
39
- def self.document_to_html_body(document, core_properties = nil, relationships = nil)
134
+ def self.document_to_html_body(document, core_properties = nil,
135
+ relationships = nil)
40
136
  converter = new(document, core_properties, relationships)
41
137
  converter.build_html_body
42
138
  end
43
139
 
44
- def initialize(document, core_properties = nil, relationships = nil, document_name = nil)
140
+ def initialize(document, core_properties = nil, relationships = nil,
141
+ document_name = nil)
45
142
  @document = document
46
143
  @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
144
  @core_properties = core_properties
145
+
146
+ @metadata_builder = MhtmlMetadataBuilder.new(
147
+ document, core_properties, relationships, document_name
148
+ )
149
+ @element_renderer = MhtmlElementRenderer.new(relationships,
150
+ document.image_parts)
50
151
  end
51
152
 
52
153
  # Get the core properties to use (provided or from document)
@@ -54,6 +155,11 @@ module Uniword
54
155
  @core_properties || @document.core_properties
55
156
  end
56
157
 
158
+ # Get document name via metadata builder
159
+ def document_name
160
+ @metadata_builder.document_name
161
+ end
162
+
57
163
  # Build the complete Mhtml::Document
58
164
  def build_mhtml_document
59
165
  mhtml_doc = Uniword::Mhtml::Document.new
@@ -61,8 +167,8 @@ module Uniword
61
167
  # Build HTML content
62
168
  html_content = build_html_body
63
169
  html_part = Uniword::Mhtml::HtmlPart.new
64
- html_part.content_type = 'text/html'
65
- html_part.content_transfer_encoding = 'quoted-printable'
170
+ html_part.content_type = "text/html"
171
+ html_part.content_transfer_encoding = "quoted-printable"
66
172
  html_part.raw_content = html_content
67
173
  html_part.content_location = "file:///C:/D057922B/#{document_name}.htm"
68
174
 
@@ -70,21 +176,19 @@ module Uniword
70
176
  mhtml_doc.parts << html_part
71
177
 
72
178
  # Build metadata
73
- mhtml_doc.document_properties = build_document_properties
179
+ mhtml_doc.document_properties = @metadata_builder.build_document_properties
74
180
 
75
181
  # Build filelist.xml
76
- filelist_part = build_filelist_part
182
+ filelist_part = @metadata_builder.build_filelist_part
77
183
  mhtml_doc.parts << filelist_part if filelist_part
78
184
 
79
185
  # Build image parts from document.image_parts
80
- image_parts = build_image_parts
81
- image_parts.each do |image_part|
186
+ @metadata_builder.build_image_parts.each do |image_part|
82
187
  mhtml_doc.parts << image_part
83
188
  end
84
189
 
85
190
  # 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'
191
+ hash = document_name.gsub(/[^a-zA-Z0-9]/, "").upcase[0..7] || "DOC"
88
192
  mhtml_doc.boundary = "----=_NextPart_01DC60F8.#{hash}"
89
193
 
90
194
  mhtml_doc
@@ -93,95 +197,26 @@ module Uniword
93
197
  # Build the HTML body content
94
198
  def build_html_body
95
199
  body = @document.body
96
- return '' unless body
200
+ return "" unless body
97
201
 
98
- paragraphs_html = body.elements.map do |element|
99
- element_to_html(element)
100
- end.join("\n")
202
+ # Split body elements into sections based on paragraph section_properties
203
+ sections = split_into_sections(body.elements)
101
204
 
102
- wrap_html_document(paragraphs_html)
205
+ wrap_html_document(sections)
103
206
  end
104
207
 
105
208
  private
106
209
 
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
210
  # 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
211
+ def wrap_html_document(sections)
212
+ name = document_name
213
+ meta_tags = @metadata_builder.build_meta_tags
214
+ link_tags = @metadata_builder.build_link_tags
215
+ metadata_comments = @metadata_builder.build_metadata_comments
216
+ custom_props = @metadata_builder.build_custom_document_properties
217
+
218
+ # Build body content from sections
219
+ body_content = build_sections_html(sections)
185
220
 
186
221
  <<~HTML
187
222
  <html xmlns:o="urn:schemas-microsoft-com:office:office"
@@ -195,1211 +230,80 @@ module Uniword
195
230
  <o:DocumentProperties xmlns:o="urn:schemas-microsoft-com:office:office">
196
231
  #{metadata_comments}
197
232
  </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>
233
+ #{custom_props}
234
+ #{OFFICE_SETTINGS_XML}
244
235
  </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]-->
236
+ <link rel=themeData href="#{name}.fld/themedata.thmx">
237
+ <link rel=colorSchemeMapping href="#{name}.fld/colorschememapping.xml">
238
+ #{WORD_DOCUMENT_XML}
239
+ #{VML_BEHAVIOR_STYLE}
240
+ #{MhtmlStyleBuilder.latent_styles}
241
+ #{MhtmlStyleBuilder.style_block}
242
+ #{MSO_NORMAL_TABLE_STYLE}
282
243
  </head>
283
244
  <body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'>
284
245
 
285
- <div class=WordSection1>
286
-
287
- #{body_html}
288
-
289
- </div>
246
+ #{body_content}
290
247
 
291
248
  </body>
292
249
  </html>
293
250
  HTML
294
251
  end
295
252
 
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
253
+ # Split body elements into sections based on paragraph section_properties.
254
+ # Returns an array of arrays: each inner array is one section's elements.
255
+ def split_into_sections(elements)
256
+ return [elements] if elements.empty?
366
257
 
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
258
+ sections = []
259
+ current_section = []
376
260
 
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
261
+ elements.each do |element|
262
+ current_section << element
391
263
 
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]
264
+ # Check if this paragraph marks a section boundary
265
+ if element.is_a?(Uniword::Wordprocessingml::Paragraph) &&
266
+ element.properties&.section_properties
267
+ sections << current_section
268
+ current_section = []
402
269
  end
403
270
  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
271
 
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
272
+ # Add remaining elements as the last section
273
+ sections << current_section unless current_section.empty?
423
274
 
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
275
+ sections
445
276
  end
446
277
 
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
278
+ # Build HTML body content from sections array.
279
+ # Each section is wrapped in a <div class=WordSectionN> with <br> between them.
280
+ def build_sections_html(sections)
281
+ return "" if sections.empty?
1140
282
 
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
- ''
283
+ # Single section: wrap in WordSection1 without breaks
284
+ if sections.size == 1
285
+ elements_html = sections.first.map do |element|
286
+ @element_renderer.element_to_html(element)
287
+ end.join("\n")
288
+ return "<div class=WordSection1>\n\n#{elements_html}\n\n</div>"
1150
289
  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
290
 
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
291
+ section_divs = sections.each_with_index.map do |section_elements, idx|
292
+ elements_html = section_elements.map do |element|
293
+ @element_renderer.element_to_html(element)
294
+ end.join("\n")
1166
295
 
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)
296
+ # First N sections get WordSection1..N class, last section is unnamed
297
+ if idx < sections.size - 1
298
+ "<div class=WordSection#{idx + 1}>\n\n#{elements_html}\n\n</div>"
1174
299
  else
1175
- run_to_html(run)
300
+ "<div class=>\n\n#{elements_html}\n\n</div>"
1176
301
  end
1177
302
  end
1178
303
 
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;')
304
+ # Join with <br> between sections (not after the last one)
305
+ # Word HTML uses <br clear="all" class="section" /> between sections
306
+ section_divs.join("\n\n<br clear=\"all\" class=\"section\" />\n\n")
1403
307
  end
1404
308
  end
1405
309
  end