Initial commit
This commit is contained in:
15
.claude-plugin/plugin.json
Normal file
15
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "document-skills",
|
||||||
|
"description": "Collection of document processing suite including Excel, Word, PowerPoint, and PDF capabilities",
|
||||||
|
"version": "0.0.0-2025.11.28",
|
||||||
|
"author": {
|
||||||
|
"name": "Cameron Rohn",
|
||||||
|
"email": "github@cameronrohn.com"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills/xlsx",
|
||||||
|
"./skills/docx",
|
||||||
|
"./skills/pptx",
|
||||||
|
"./skills/pdf"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# document-skills
|
||||||
|
|
||||||
|
Collection of document processing suite including Excel, Word, PowerPoint, and PDF capabilities
|
||||||
564
plugin.lock.json
Normal file
564
plugin.lock.json
Normal file
@@ -0,0 +1,564 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:Cam10001110101/claude-skills-base:document-skills",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "fb9ac202a94b58fdb76adf9a459306cfbbfc2f84",
|
||||||
|
"treeHash": "47eca301dcb8f3011a3efdb315bab412e3f8bbc7ab82f7d0c78ada7f3f68e204",
|
||||||
|
"generatedAt": "2025-11-28T10:10:00.947781Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "document-skills",
|
||||||
|
"description": "Collection of document processing suite including Excel, Word, PowerPoint, and PDF capabilities"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "b0bd4626e1c6924ac7fc6ace512ab54e3415b1fe72c816113a7e77d3e0cdda7b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "9f1c38f44e3f0acdfda22e07c101b8739dc70b60b4abce6f478edae8c012d7df"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/xlsx/recalc.py",
|
||||||
|
"sha256": "ab1ef0c94536bb23b6c6a3d32769b0401ec3cc85e73c247d574dd84ec73af15d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/xlsx/SKILL.md",
|
||||||
|
"sha256": "020ccdb5932257b66c638ec1157ea248d57fa52c8c01f1f68b559b5970c7df35"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/xlsx/LICENSE.txt",
|
||||||
|
"sha256": "79f6d8f5b427252fa3b1c11ecdbdb6bf610b944f7530b4de78f770f38741cfaa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/REFERENCE.md",
|
||||||
|
"sha256": "03a5f964f8abecbbe156f363356e927e864d7ee964f1012c84ee1bfc8acbeb95"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/FORMS.md",
|
||||||
|
"sha256": "0ab10e9095deb1c1f9f79eb04254589f55c1d16e095cb53191e03f9fc3184449"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/SKILL.md",
|
||||||
|
"sha256": "6c17133c12d30173ab5c32db3f37fa303ef473b90ec7da4a66443337deb28131"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/LICENSE.txt",
|
||||||
|
"sha256": "79f6d8f5b427252fa3b1c11ecdbdb6bf610b944f7530b4de78f770f38741cfaa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/fill_fillable_fields.py",
|
||||||
|
"sha256": "0b954387dd7069dc5f38209d90cd8dce3839a9cc95490f258f331fd5e8233ba2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/convert_pdf_to_images.py",
|
||||||
|
"sha256": "095a0105a718af75ede309cb03f84a20c81d17f1727f7686fd4b294f1f40294f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/extract_form_field_info.py",
|
||||||
|
"sha256": "191a3d9d8b43f6abce0e0e35cf56f5f1c1760521bdacc590b5b154389e4c270a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/check_bounding_boxes.py",
|
||||||
|
"sha256": "98c84bfb3e712e846df046418809caa7e2eee01264ef3caaa22c4fa4c9d4c4c8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/check_bounding_boxes_test.py",
|
||||||
|
"sha256": "f95dca01a8b79aafd152511e9f7bf2bbcd606dde1be77d691f03a18624e002ca"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/create_validation_image.py",
|
||||||
|
"sha256": "90b3bba0bd492b5f18b7c0c47f61cc047bc7b6cbaf965d3762b1bb74f6516fd9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/fill_pdf_form_with_annotations.py",
|
||||||
|
"sha256": "1592c3d705602baf1ca08589228c361765e1ab726cd94f0c45f00d33d9e007b0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pdf/scripts/check_fillable_fields.py",
|
||||||
|
"sha256": "159c9525764f95815cd57a02dafccb7b66e20fa6c5f356ab9c0da6e0a8b672ba"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/css.md",
|
||||||
|
"sha256": "fd6551c21cad23c3b580a7032422f437ee3c2cf115808df6ebd37ea58c0d1353"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml.md",
|
||||||
|
"sha256": "09868e9f1786765421ecf3f0f49c77006738efda82a76df43ed87f7a9bfe2467"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/html2pptx.tgz",
|
||||||
|
"sha256": "542e19f94c89a888a4708fa1728dff9b082a9fb2d65c5114a730a6f9060c6e6a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/SKILL.md",
|
||||||
|
"sha256": "336864cfb0878052defd1b014acde767ba2aeed96a9fd8e28b5bb2b462807007"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/html2pptx.md",
|
||||||
|
"sha256": "cadbe677d069867f96ce1dc6e24c84fe3169b735bef12f113999a0d07c032457"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/LICENSE.txt",
|
||||||
|
"sha256": "79f6d8f5b427252fa3b1c11ecdbdb6bf610b944f7530b4de78f770f38741cfaa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd",
|
||||||
|
"sha256": "842e7163409c8d74f4d7088a8bc99500d80bc75332681a0980055b08f374a604"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd",
|
||||||
|
"sha256": "0fa75578a000439a7988ba0c59fdc69f774bbd416cbacc14d07125b3f686cb74"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd",
|
||||||
|
"sha256": "568b26ee156cb9549aa439ca2158965f77b7c1602b7e0316f40ac6cf586e35f2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd",
|
||||||
|
"sha256": "127ca209fa73d7cb708449cb355c871867948a96e4a74f7bf5811ef62d17991d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd",
|
||||||
|
"sha256": "16f6f8072249f431370723c2cd8974672e0d9c897e00e97dd918079df934871b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd",
|
||||||
|
"sha256": "fddc2b880cabb9005aebbc7e783e53c19fec1c03df7d0e2f2076a33a0fdfd081"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd",
|
||||||
|
"sha256": "be0ff793a22dd31384650c3a4da14c2fa8062751c2e97b0e5ee852bda13c60ad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/mce/mc.xsd",
|
||||||
|
"sha256": "3a37e461ecf5a8670fdec34029703401f8728ab9c96ec1739a6ae58d55212413"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd",
|
||||||
|
"sha256": "451958454e8588dfc7cd945981ada142ca06ff3307937f5700df059c2b307fa8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd",
|
||||||
|
"sha256": "f565adfef5a502044abc3a9153e157edc25af78304d335994afb958874b15e26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd",
|
||||||
|
"sha256": "9e0b7209fc69ab11987900404540969976000c5ebe4d4f58c43dc3842886bf3a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd",
|
||||||
|
"sha256": "6de111e11403f7cd49027400755bae0ea1cabef2815f09bd40a24f0017613b24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd",
|
||||||
|
"sha256": "133c9f64a5c5d573b78d0a474122b22506d8eadb5e063f67cdbbb8fa2f161d0e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd",
|
||||||
|
"sha256": "585bedc1313b40888dcc544cb74cd939a105ee674f3b1d3aa1cc6d34f70ff155"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd",
|
||||||
|
"sha256": "0d103b99a4a8652f8871552a69d42d2a3760ac6a5e3ef02d979c4273257ff6a4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd",
|
||||||
|
"sha256": "d173c3e5d61e42e2e3a97226c632fd2ab7cc481fc4e492365b87024ab546daff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd",
|
||||||
|
"sha256": "5cb76dabd8b97d1e9308a1700b90c20139be4d50792d21a7f09789f5cccd6026"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd",
|
||||||
|
"sha256": "41b93bd8857cc68b1e43be2806a872d736a9bdd6566900062d8fdb57d7bbb354"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd",
|
||||||
|
"sha256": "3fd0586f2637b98bb9886f0e0b67d89e1cc987c2d158cc7deb5f5b9890ced412"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd",
|
||||||
|
"sha256": "beffeed56945c22a77440122c8bdc426f3fcbe7f3b12ea0976c770d1f8d54578"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd",
|
||||||
|
"sha256": "6bdeb169c3717eb01108853bd9fc5a3750fb1fa5b82abbdd854d49855a40f519"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd",
|
||||||
|
"sha256": "c2dd9f61f892deae6acd8d20771ea79b12018af25f3bf8d06639c8542d218cfd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd",
|
||||||
|
"sha256": "5d389d42befbebd91945d620242347caecd3367f9a3a7cf8d97949507ae1f53c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd",
|
||||||
|
"sha256": "29b254ee0d10414a8504b5a08149c7baec35a60d5ff607d6b3f492aa36815f40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd",
|
||||||
|
"sha256": "5375417f0f5394b8dd1a7035b9679151f19a6b65df309dec10cfb4a420cb00e9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd",
|
||||||
|
"sha256": "9c085407751b9061c1f996f6c39ce58451be22a8d334f09175f0e89e42736285"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd",
|
||||||
|
"sha256": "b4532b6d258832953fbb3ee4c711f4fe25d3faf46a10644b2505f17010d01e88"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd",
|
||||||
|
"sha256": "e2abacbb9a55ce1365f8961bc1b1395bbc811e512b111000d8c333f98458dece"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd",
|
||||||
|
"sha256": "bdad416b096b61d37b71603b2c949484f9070c830bdaeba93bf35e15c8900614"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd",
|
||||||
|
"sha256": "475dcae1e7d1ea46232db6f8481040c15e53a52a3c256831d3df204212b0e831"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd",
|
||||||
|
"sha256": "0b364451dc36a48dd6dae0f3b6ada05fd9b71e5208211f8ee5537d7e51a587e2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd",
|
||||||
|
"sha256": "bc92e36ccd233722d4c5869bec71ddc7b12e2df56059942cce5a39065cc9c368"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd",
|
||||||
|
"sha256": "f5ee623b08b6a66935e5aced2f5d8ad0fc71bf9e8e833cd490150c0fa94b8763"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd",
|
||||||
|
"sha256": "a539aa2fb154fa50e0f5cc97e6ad7cbc66f8ec3e3746f61ec6a8b0d5d15ecdf2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd",
|
||||||
|
"sha256": "12264f3c03d738311cd9237d212f1c07479e70f0cbe1ae725d29b36539aef637"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd",
|
||||||
|
"sha256": "0ef4bb354ff44b923564c4ddbdda5987919d220225129ec94614a618ceafc281"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd",
|
||||||
|
"sha256": "7b5b7413e2c895b1e148e82e292a117d53c7ec65b0696c992edca57b61b4a74b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd",
|
||||||
|
"sha256": "3213ef1631606250f5010b42cad7ef716f7c59426367798e33c374c0ec391d3a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd",
|
||||||
|
"sha256": "3c6709101c6aaa82888df5d8795c33f9e857196790eb320d9194e64be2b6bdd8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/pack.py",
|
||||||
|
"sha256": "6fe762f45aff8c63fd95b9fcb1337b28921d6fa454e18a0e8158d4c8708d6d00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/validate.py",
|
||||||
|
"sha256": "1ec252de8b14b07d16966c48906ccb1c45c68bcd23557ad31d8c50a27f5f8c0f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/unpack.py",
|
||||||
|
"sha256": "0bd17f76a1a4c388aba42c6d1d39015fa84e405c3e0692397fe12762bd632b58"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/validation/docx.py",
|
||||||
|
"sha256": "e65d6cda0525866a24cc847b2e883bd2416ae6f87b3f5b9e2784dfbb0ec13093"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/validation/__init__.py",
|
||||||
|
"sha256": "83e0f035c5abea238d3f2c3968afbd511ed022b527b7c9cb60a9434cc34ff987"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/validation/redlining.py",
|
||||||
|
"sha256": "97abfdff4f08f43f9a4bb5c8a2f8fd483398b5b339592724e8635153b5507967"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/validation/pptx.py",
|
||||||
|
"sha256": "00bf2623da1177b3948143a4ade2f1cda7cb389dee31960861913fa42ef1b00f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/ooxml/scripts/validation/base.py",
|
||||||
|
"sha256": "f2c70d481613456e32b43869d1604b05c236c8da34b5b3967677a661cac7ba63"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/scripts/thumbnail.py",
|
||||||
|
"sha256": "c21fd950b6ada7bd2f029885d3e56bc66b7ff061cc8404c492eb301664aa9e5d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/scripts/rearrange.py",
|
||||||
|
"sha256": "c04ac37916f398ba621b2d9e1e4c1a69225eaad6d7fb0ad116c237ddeb1b2b68"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/scripts/inventory.py",
|
||||||
|
"sha256": "adead8fe6270e520c397cec9fbee4d606ab10bb80f749e018b42ec894c60d2e5"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/pptx/scripts/replace.py",
|
||||||
|
"sha256": "8a590747551be847a904e3296fb2f35aa4e7feeb4970a61596c2375306462820"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml.md",
|
||||||
|
"sha256": "93fc077b48a0d4797d04a19fcf14520fb149289ce8532f6b7b6196eaf4f0714a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/docx-js.md",
|
||||||
|
"sha256": "83b4a2f88d058a10509fbc0b3b12b6933c407805f4d4afc955cd3fb939c16428"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/SKILL.md",
|
||||||
|
"sha256": "278d10606659283366935c77d51852a6c75cbb08dfccb8de876ac8b2d7b6957d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/LICENSE.txt",
|
||||||
|
"sha256": "79f6d8f5b427252fa3b1c11ecdbdb6bf610b944f7530b4de78f770f38741cfaa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd",
|
||||||
|
"sha256": "842e7163409c8d74f4d7088a8bc99500d80bc75332681a0980055b08f374a604"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-2012.xsd",
|
||||||
|
"sha256": "0fa75578a000439a7988ba0c59fdc69f774bbd416cbacc14d07125b3f686cb74"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-2010.xsd",
|
||||||
|
"sha256": "568b26ee156cb9549aa439ca2158965f77b7c1602b7e0316f40ac6cf586e35f2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd",
|
||||||
|
"sha256": "127ca209fa73d7cb708449cb355c871867948a96e4a74f7bf5811ef62d17991d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd",
|
||||||
|
"sha256": "16f6f8072249f431370723c2cd8974672e0d9c897e00e97dd918079df934871b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd",
|
||||||
|
"sha256": "fddc2b880cabb9005aebbc7e783e53c19fec1c03df7d0e2f2076a33a0fdfd081"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/microsoft/wml-2018.xsd",
|
||||||
|
"sha256": "be0ff793a22dd31384650c3a4da14c2fa8062751c2e97b0e5ee852bda13c60ad"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/mce/mc.xsd",
|
||||||
|
"sha256": "3a37e461ecf5a8670fdec34029703401f8728ab9c96ec1739a6ae58d55212413"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd",
|
||||||
|
"sha256": "451958454e8588dfc7cd945981ada142ca06ff3307937f5700df059c2b307fa8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd",
|
||||||
|
"sha256": "f565adfef5a502044abc3a9153e157edc25af78304d335994afb958874b15e26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd",
|
||||||
|
"sha256": "9e0b7209fc69ab11987900404540969976000c5ebe4d4f58c43dc3842886bf3a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd",
|
||||||
|
"sha256": "6de111e11403f7cd49027400755bae0ea1cabef2815f09bd40a24f0017613b24"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd",
|
||||||
|
"sha256": "133c9f64a5c5d573b78d0a474122b22506d8eadb5e063f67cdbbb8fa2f161d0e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd",
|
||||||
|
"sha256": "585bedc1313b40888dcc544cb74cd939a105ee674f3b1d3aa1cc6d34f70ff155"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd",
|
||||||
|
"sha256": "0d103b99a4a8652f8871552a69d42d2a3760ac6a5e3ef02d979c4273257ff6a4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd",
|
||||||
|
"sha256": "d173c3e5d61e42e2e3a97226c632fd2ab7cc481fc4e492365b87024ab546daff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd",
|
||||||
|
"sha256": "5cb76dabd8b97d1e9308a1700b90c20139be4d50792d21a7f09789f5cccd6026"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd",
|
||||||
|
"sha256": "41b93bd8857cc68b1e43be2806a872d736a9bdd6566900062d8fdb57d7bbb354"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd",
|
||||||
|
"sha256": "3fd0586f2637b98bb9886f0e0b67d89e1cc987c2d158cc7deb5f5b9890ced412"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd",
|
||||||
|
"sha256": "beffeed56945c22a77440122c8bdc426f3fcbe7f3b12ea0976c770d1f8d54578"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd",
|
||||||
|
"sha256": "6bdeb169c3717eb01108853bd9fc5a3750fb1fa5b82abbdd854d49855a40f519"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd",
|
||||||
|
"sha256": "c2dd9f61f892deae6acd8d20771ea79b12018af25f3bf8d06639c8542d218cfd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd",
|
||||||
|
"sha256": "5d389d42befbebd91945d620242347caecd3367f9a3a7cf8d97949507ae1f53c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd",
|
||||||
|
"sha256": "29b254ee0d10414a8504b5a08149c7baec35a60d5ff607d6b3f492aa36815f40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd",
|
||||||
|
"sha256": "5375417f0f5394b8dd1a7035b9679151f19a6b65df309dec10cfb4a420cb00e9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd",
|
||||||
|
"sha256": "9c085407751b9061c1f996f6c39ce58451be22a8d334f09175f0e89e42736285"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd",
|
||||||
|
"sha256": "b4532b6d258832953fbb3ee4c711f4fe25d3faf46a10644b2505f17010d01e88"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd",
|
||||||
|
"sha256": "e2abacbb9a55ce1365f8961bc1b1395bbc811e512b111000d8c333f98458dece"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd",
|
||||||
|
"sha256": "bdad416b096b61d37b71603b2c949484f9070c830bdaeba93bf35e15c8900614"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd",
|
||||||
|
"sha256": "475dcae1e7d1ea46232db6f8481040c15e53a52a3c256831d3df204212b0e831"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd",
|
||||||
|
"sha256": "0b364451dc36a48dd6dae0f3b6ada05fd9b71e5208211f8ee5537d7e51a587e2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd",
|
||||||
|
"sha256": "bc92e36ccd233722d4c5869bec71ddc7b12e2df56059942cce5a39065cc9c368"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd",
|
||||||
|
"sha256": "f5ee623b08b6a66935e5aced2f5d8ad0fc71bf9e8e833cd490150c0fa94b8763"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd",
|
||||||
|
"sha256": "a539aa2fb154fa50e0f5cc97e6ad7cbc66f8ec3e3746f61ec6a8b0d5d15ecdf2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd",
|
||||||
|
"sha256": "12264f3c03d738311cd9237d212f1c07479e70f0cbe1ae725d29b36539aef637"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd",
|
||||||
|
"sha256": "0ef4bb354ff44b923564c4ddbdda5987919d220225129ec94614a618ceafc281"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd",
|
||||||
|
"sha256": "7b5b7413e2c895b1e148e82e292a117d53c7ec65b0696c992edca57b61b4a74b"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd",
|
||||||
|
"sha256": "3213ef1631606250f5010b42cad7ef716f7c59426367798e33c374c0ec391d3a"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd",
|
||||||
|
"sha256": "3c6709101c6aaa82888df5d8795c33f9e857196790eb320d9194e64be2b6bdd8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/pack.py",
|
||||||
|
"sha256": "6fe762f45aff8c63fd95b9fcb1337b28921d6fa454e18a0e8158d4c8708d6d00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/validate.py",
|
||||||
|
"sha256": "1ec252de8b14b07d16966c48906ccb1c45c68bcd23557ad31d8c50a27f5f8c0f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/unpack.py",
|
||||||
|
"sha256": "0bd17f76a1a4c388aba42c6d1d39015fa84e405c3e0692397fe12762bd632b58"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/validation/docx.py",
|
||||||
|
"sha256": "e65d6cda0525866a24cc847b2e883bd2416ae6f87b3f5b9e2784dfbb0ec13093"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/validation/__init__.py",
|
||||||
|
"sha256": "83e0f035c5abea238d3f2c3968afbd511ed022b527b7c9cb60a9434cc34ff987"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/validation/redlining.py",
|
||||||
|
"sha256": "97abfdff4f08f43f9a4bb5c8a2f8fd483398b5b339592724e8635153b5507967"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/validation/pptx.py",
|
||||||
|
"sha256": "00bf2623da1177b3948143a4ade2f1cda7cb389dee31960861913fa42ef1b00f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/ooxml/scripts/validation/base.py",
|
||||||
|
"sha256": "f2c70d481613456e32b43869d1604b05c236c8da34b5b3967677a661cac7ba63"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/__init__.py",
|
||||||
|
"sha256": "83e262a425814b72add701272b99ddcf9635251c5d4672bf9fc38d2b03f00d85"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/document.py",
|
||||||
|
"sha256": "6ada306126560e5e4090d45473a3620b63408d68885554afc95766e983c0afe1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/utilities.py",
|
||||||
|
"sha256": "62a4b689056501b91e2df2d1f4e6335818e421c7390e48050717ea8f461a0ed0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/templates/comments.xml",
|
||||||
|
"sha256": "87e218a3a295016ec855f2cd74495c416072f29c4846e86b527aec0a4d93ba21"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/templates/commentsExtensible.xml",
|
||||||
|
"sha256": "af5d057e16462ca172cea845e502bafb4f3e1b474a8d5848ffe92214853a4935"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/templates/commentsExtended.xml",
|
||||||
|
"sha256": "86bf401354c111102033ed147763faccb82479598f17777a3384c2f3e9fa0014"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/templates/commentsIds.xml",
|
||||||
|
"sha256": "20168f7b237af091332f8348c548eb7f755f583185bb198359c5978155099d67"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/docx/scripts/templates/people.xml",
|
||||||
|
"sha256": "61db9900b579acd4c4f84ff7f40df47e77e9e780c40d5f5ef6a7beba41d62ec5"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "47eca301dcb8f3011a3efdb315bab412e3f8bbc7ab82f7d0c78ada7f3f68e204"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
30
skills/docx/LICENSE.txt
Normal file
30
skills/docx/LICENSE.txt
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
© 2025 Anthropic, PBC. All rights reserved.
|
||||||
|
|
||||||
|
LICENSE: Use of these materials (including all code, prompts, assets, files,
|
||||||
|
and other components of this Skill) is governed by your agreement with
|
||||||
|
Anthropic regarding use of Anthropic's services. If no separate agreement
|
||||||
|
exists, use is governed by Anthropic's Consumer Terms of Service or
|
||||||
|
Commercial Terms of Service, as applicable:
|
||||||
|
https://www.anthropic.com/legal/consumer-terms
|
||||||
|
https://www.anthropic.com/legal/commercial-terms
|
||||||
|
Your applicable agreement is referred to as the "Agreement." "Services" are
|
||||||
|
as defined in the Agreement.
|
||||||
|
|
||||||
|
ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
|
||||||
|
contrary, users may not:
|
||||||
|
|
||||||
|
- Extract these materials from the Services or retain copies of these
|
||||||
|
materials outside the Services
|
||||||
|
- Reproduce or copy these materials, except for temporary copies created
|
||||||
|
automatically during authorized use of the Services
|
||||||
|
- Create derivative works based on these materials
|
||||||
|
- Distribute, sublicense, or transfer these materials to any third party
|
||||||
|
- Make, offer to sell, sell, or import any inventions embodied in these
|
||||||
|
materials
|
||||||
|
- Reverse engineer, decompile, or disassemble these materials
|
||||||
|
|
||||||
|
The receipt, viewing, or possession of these materials does not convey or
|
||||||
|
imply any license or right beyond those expressly granted above.
|
||||||
|
|
||||||
|
Anthropic retains all right, title, and interest in these materials,
|
||||||
|
including all copyrights, patents, and other intellectual property rights.
|
||||||
197
skills/docx/SKILL.md
Normal file
197
skills/docx/SKILL.md
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
---
|
||||||
|
name: docx
|
||||||
|
description: "Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. When Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks"
|
||||||
|
license: Proprietary. LICENSE.txt has complete terms
|
||||||
|
---
|
||||||
|
|
||||||
|
# DOCX creation, editing, and analysis
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
A user may ask you to create, edit, or analyze the contents of a .docx file. A .docx file is essentially a ZIP archive containing XML files and other resources that you can read or edit. You have different tools and workflows available for different tasks.
|
||||||
|
|
||||||
|
## Workflow Decision Tree
|
||||||
|
|
||||||
|
### Reading/Analyzing Content
|
||||||
|
Use "Text extraction" or "Raw XML access" sections below
|
||||||
|
|
||||||
|
### Creating New Document
|
||||||
|
Use "Creating a new Word document" workflow
|
||||||
|
|
||||||
|
### Editing Existing Document
|
||||||
|
- **Your own document + simple changes**
|
||||||
|
Use "Basic OOXML editing" workflow
|
||||||
|
|
||||||
|
- **Someone else's document**
|
||||||
|
Use **"Redlining workflow"** (recommended default)
|
||||||
|
|
||||||
|
- **Legal, academic, business, or government docs**
|
||||||
|
Use **"Redlining workflow"** (required)
|
||||||
|
|
||||||
|
## Reading and analyzing content
|
||||||
|
|
||||||
|
### Text extraction
|
||||||
|
If you just need to read the text contents of a document, you should convert the document to markdown using pandoc. Pandoc provides excellent support for preserving document structure and can show tracked changes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Convert document to markdown with tracked changes
|
||||||
|
pandoc --track-changes=all path-to-file.docx -o output.md
|
||||||
|
# Options: --track-changes=accept/reject/all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Raw XML access
|
||||||
|
You need raw XML access for: comments, complex formatting, document structure, embedded media, and metadata. For any of these features, you'll need to unpack a document and read its raw XML contents.
|
||||||
|
|
||||||
|
#### Unpacking a file
|
||||||
|
`python ooxml/scripts/unpack.py <office_file> <output_directory>`
|
||||||
|
|
||||||
|
#### Key file structures
|
||||||
|
* `word/document.xml` - Main document contents
|
||||||
|
* `word/comments.xml` - Comments referenced in document.xml
|
||||||
|
* `word/media/` - Embedded images and media files
|
||||||
|
* Tracked changes use `<w:ins>` (insertions) and `<w:del>` (deletions) tags
|
||||||
|
|
||||||
|
## Creating a new Word document
|
||||||
|
|
||||||
|
When creating a new Word document from scratch, use **docx-js**, which allows you to create Word documents using JavaScript/TypeScript.
|
||||||
|
|
||||||
|
### Workflow
|
||||||
|
1. **MANDATORY - READ ENTIRE FILE**: Read [`docx-js.md`](docx-js.md) (~500 lines) completely from start to finish. **NEVER set any range limits when reading this file.** Read the full file content for detailed syntax, critical formatting rules, and best practices before proceeding with document creation.
|
||||||
|
2. Create a JavaScript/TypeScript file using Document, Paragraph, TextRun components (You can assume all dependencies are installed, but if not, refer to the dependencies section below)
|
||||||
|
3. Export as .docx using Packer.toBuffer()
|
||||||
|
|
||||||
|
## Editing an existing Word document
|
||||||
|
|
||||||
|
When editing an existing Word document, use the **Document library** (a Python library for OOXML manipulation). The library automatically handles infrastructure setup and provides methods for document manipulation. For complex scenarios, you can access the underlying DOM directly through the library.
|
||||||
|
|
||||||
|
### Workflow
|
||||||
|
1. **MANDATORY - READ ENTIRE FILE**: Read [`ooxml.md`](ooxml.md) (~600 lines) completely from start to finish. **NEVER set any range limits when reading this file.** Read the full file content for the Document library API and XML patterns for directly editing document files.
|
||||||
|
2. Unpack the document: `python ooxml/scripts/unpack.py <office_file> <output_directory>`
|
||||||
|
3. Create and run a Python script using the Document library (set PYTHONPATH per "Initialization" section in ooxml.md)
|
||||||
|
4. Pack the final document: `python ooxml/scripts/pack.py <input_directory> <office_file>`
|
||||||
|
|
||||||
|
The Document library provides both high-level methods for common operations and direct DOM access for complex scenarios.
|
||||||
|
|
||||||
|
## Redlining workflow for document review
|
||||||
|
|
||||||
|
This workflow allows you to plan comprehensive tracked changes using markdown before implementing them in OOXML. **CRITICAL**: For complete tracked changes, you must implement ALL changes systematically.
|
||||||
|
|
||||||
|
**Batching Strategy**: Group related changes into batches of 3-10 changes. This makes debugging manageable while maintaining efficiency. Test each batch before moving to the next.
|
||||||
|
|
||||||
|
**Principle: Minimal, Precise Edits**
|
||||||
|
When implementing tracked changes, only mark text that actually changes. Repeating unchanged text makes edits harder to review and appears unprofessional. Break replacements into: [unchanged text] + [deletion] + [insertion] + [unchanged text]. Preserve the original run's RSID for unchanged text by extracting the `<w:r>` element from the original and reusing it.
|
||||||
|
|
||||||
|
Example - Changing "30 days" to "60 days" in a sentence:
|
||||||
|
```python
|
||||||
|
# BAD - Replaces entire sentence
|
||||||
|
'<w:del><w:r><w:delText>The term is 30 days.</w:delText></w:r></w:del><w:ins><w:r><w:t>The term is 60 days.</w:t></w:r></w:ins>'
|
||||||
|
|
||||||
|
# GOOD - Only marks what changed, preserves original <w:r> for unchanged text
|
||||||
|
'<w:r w:rsidR="00AB12CD"><w:t>The term is </w:t></w:r><w:del><w:r><w:delText>30</w:delText></w:r></w:del><w:ins><w:r><w:t>60</w:t></w:r></w:ins><w:r w:rsidR="00AB12CD"><w:t> days.</w:t></w:r>'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tracked changes workflow
|
||||||
|
|
||||||
|
1. **Get markdown representation**: Convert document to markdown with tracked changes preserved:
|
||||||
|
```bash
|
||||||
|
pandoc --track-changes=all path-to-file.docx -o current.md
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Identify and group changes**: Review the document and identify ALL changes needed, organizing them into logical batches:
|
||||||
|
|
||||||
|
**Location methods** (for finding changes in XML):
|
||||||
|
- Section/heading numbers (e.g., "Section 3.2", "Article IV")
|
||||||
|
- Paragraph identifiers if numbered
|
||||||
|
- Grep patterns with unique surrounding text
|
||||||
|
- Document structure (e.g., "first paragraph", "signature block")
|
||||||
|
- **DO NOT use markdown line numbers** - they don't map to XML structure
|
||||||
|
|
||||||
|
**Batch organization** (group 3-10 related changes per batch):
|
||||||
|
- By section: "Batch 1: Section 2 amendments", "Batch 2: Section 5 updates"
|
||||||
|
- By type: "Batch 1: Date corrections", "Batch 2: Party name changes"
|
||||||
|
- By complexity: Start with simple text replacements, then tackle complex structural changes
|
||||||
|
- Sequential: "Batch 1: Pages 1-3", "Batch 2: Pages 4-6"
|
||||||
|
|
||||||
|
3. **Read documentation and unpack**:
|
||||||
|
- **MANDATORY - READ ENTIRE FILE**: Read [`ooxml.md`](ooxml.md) (~600 lines) completely from start to finish. **NEVER set any range limits when reading this file.** Read the full file content for the Document library API and XML patterns for directly editing document files.
|
||||||
|
- **Unpack the document**: `python ooxml/scripts/unpack.py <file.docx> <dir>`
|
||||||
|
- **Note the suggested RSID**: The unpack script will suggest an RSID to use for your tracked changes. Copy this RSID for use in step 4b.
|
||||||
|
|
||||||
|
4. **Implement changes in batches**: Group changes logically (by section, by type, or by proximity) and implement them together in a single script. This approach:
|
||||||
|
- Makes debugging easier (smaller batch = easier to isolate errors)
|
||||||
|
- Allows incremental progress
|
||||||
|
- Maintains efficiency (batch size of 3-10 changes works well)
|
||||||
|
|
||||||
|
**Suggested batch groupings:**
|
||||||
|
- By document section (e.g., "Section 3 changes", "Definitions", "Termination clause")
|
||||||
|
- By change type (e.g., "Date changes", "Party name updates", "Legal term replacements")
|
||||||
|
- By proximity (e.g., "Changes on pages 1-3", "Changes in first half of document")
|
||||||
|
|
||||||
|
For each batch of related changes:
|
||||||
|
|
||||||
|
**a. Map text to XML**: Grep for text in `word/document.xml` to verify how text is split across `<w:r>` elements.
|
||||||
|
|
||||||
|
**b. Create and run script**: Set PYTHONPATH and import Document library (see "Initialization" in ooxml.md), then use `get_node` to find nodes, implement changes, and `doc.save()`. See **"Document Library"** section in ooxml.md for patterns.
|
||||||
|
|
||||||
|
**Note**: Always grep `word/document.xml` immediately before writing a script to get current line numbers and verify text content. Line numbers change after each script run.
|
||||||
|
|
||||||
|
5. **Pack the document**: After all batches are complete, convert the unpacked directory back to .docx:
|
||||||
|
```bash
|
||||||
|
python ooxml/scripts/pack.py unpacked reviewed-document.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **Final verification**: Do a comprehensive check of the complete document:
|
||||||
|
- Convert final document to markdown:
|
||||||
|
```bash
|
||||||
|
pandoc --track-changes=all reviewed-document.docx -o verification.md
|
||||||
|
```
|
||||||
|
- Verify ALL changes were applied correctly:
|
||||||
|
```bash
|
||||||
|
grep "original phrase" verification.md # Should NOT find it
|
||||||
|
grep "replacement phrase" verification.md # Should find it
|
||||||
|
```
|
||||||
|
- Check that no unintended changes were introduced
|
||||||
|
|
||||||
|
|
||||||
|
## Converting Documents to Images
|
||||||
|
|
||||||
|
To visually analyze Word documents, convert them to images using a two-step process:
|
||||||
|
|
||||||
|
1. **Convert DOCX to PDF**:
|
||||||
|
```bash
|
||||||
|
soffice --headless --convert-to pdf document.docx
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Convert PDF pages to JPEG images**:
|
||||||
|
```bash
|
||||||
|
pdftoppm -jpeg -r 150 document.pdf page
|
||||||
|
```
|
||||||
|
This creates files like `page-1.jpg`, `page-2.jpg`, etc.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- `-r 150`: Sets resolution to 150 DPI (adjust for quality/size balance)
|
||||||
|
- `-jpeg`: Output JPEG format (use `-png` for PNG if preferred)
|
||||||
|
- `-f N`: First page to convert (e.g., `-f 2` starts from page 2)
|
||||||
|
- `-l N`: Last page to convert (e.g., `-l 5` stops at page 5)
|
||||||
|
- `page`: Prefix for output files
|
||||||
|
|
||||||
|
Example for specific range:
|
||||||
|
```bash
|
||||||
|
pdftoppm -jpeg -r 150 -f 2 -l 5 document.pdf page # Converts only pages 2-5
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Style Guidelines
|
||||||
|
**IMPORTANT**: When generating code for DOCX operations:
|
||||||
|
- Write concise code
|
||||||
|
- Avoid verbose variable names and redundant operations
|
||||||
|
- Avoid unnecessary print statements
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Required dependencies (install if not available):
|
||||||
|
|
||||||
|
- **pandoc**: `sudo apt-get install pandoc` (for text extraction)
|
||||||
|
- **docx**: `npm install -g docx` (for creating new documents)
|
||||||
|
- **LibreOffice**: `sudo apt-get install libreoffice` (for PDF conversion)
|
||||||
|
- **Poppler**: `sudo apt-get install poppler-utils` (for pdftoppm to convert PDF to images)
|
||||||
|
- **defusedxml**: `pip install defusedxml` (for secure XML parsing)
|
||||||
350
skills/docx/docx-js.md
Normal file
350
skills/docx/docx-js.md
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
# DOCX Library Tutorial
|
||||||
|
|
||||||
|
Generate .docx files with JavaScript/TypeScript.
|
||||||
|
|
||||||
|
**Important: Read this entire document before starting.** Critical formatting rules and common pitfalls are covered throughout - skipping sections may result in corrupted files or rendering issues.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
Assumes docx is already installed globally
|
||||||
|
If not installed: `npm install -g docx`
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, ImageRun, Media,
|
||||||
|
Header, Footer, AlignmentType, PageOrientation, LevelFormat, ExternalHyperlink,
|
||||||
|
InternalHyperlink, TableOfContents, HeadingLevel, BorderStyle, WidthType, TabStopType,
|
||||||
|
TabStopPosition, UnderlineType, ShadingType, VerticalAlign, SymbolRun, PageNumber,
|
||||||
|
FootnoteReferenceRun, Footnote, PageBreak } = require('docx');
|
||||||
|
|
||||||
|
// Create & Save
|
||||||
|
const doc = new Document({ sections: [{ children: [/* content */] }] });
|
||||||
|
Packer.toBuffer(doc).then(buffer => fs.writeFileSync("doc.docx", buffer)); // Node.js
|
||||||
|
Packer.toBlob(doc).then(blob => { /* download logic */ }); // Browser
|
||||||
|
```
|
||||||
|
|
||||||
|
## Text & Formatting
|
||||||
|
```javascript
|
||||||
|
// IMPORTANT: Never use \n for line breaks - always use separate Paragraph elements
|
||||||
|
// ❌ WRONG: new TextRun("Line 1\nLine 2")
|
||||||
|
// ✅ CORRECT: new Paragraph({ children: [new TextRun("Line 1")] }), new Paragraph({ children: [new TextRun("Line 2")] })
|
||||||
|
|
||||||
|
// Basic text with all formatting options
|
||||||
|
new Paragraph({
|
||||||
|
alignment: AlignmentType.CENTER,
|
||||||
|
spacing: { before: 200, after: 200 },
|
||||||
|
indent: { left: 720, right: 720 },
|
||||||
|
children: [
|
||||||
|
new TextRun({ text: "Bold", bold: true }),
|
||||||
|
new TextRun({ text: "Italic", italics: true }),
|
||||||
|
new TextRun({ text: "Underlined", underline: { type: UnderlineType.DOUBLE, color: "FF0000" } }),
|
||||||
|
new TextRun({ text: "Colored", color: "FF0000", size: 28, font: "Arial" }), // Arial default
|
||||||
|
new TextRun({ text: "Highlighted", highlight: "yellow" }),
|
||||||
|
new TextRun({ text: "Strikethrough", strike: true }),
|
||||||
|
new TextRun({ text: "x2", superScript: true }),
|
||||||
|
new TextRun({ text: "H2O", subScript: true }),
|
||||||
|
new TextRun({ text: "SMALL CAPS", smallCaps: true }),
|
||||||
|
new SymbolRun({ char: "2022", font: "Symbol" }), // Bullet •
|
||||||
|
new SymbolRun({ char: "00A9", font: "Arial" }) // Copyright © - Arial for symbols
|
||||||
|
]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Styles & Professional Formatting
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const doc = new Document({
|
||||||
|
styles: {
|
||||||
|
default: { document: { run: { font: "Arial", size: 24 } } }, // 12pt default
|
||||||
|
paragraphStyles: [
|
||||||
|
// Document title style - override built-in Title style
|
||||||
|
{ id: "Title", name: "Title", basedOn: "Normal",
|
||||||
|
run: { size: 56, bold: true, color: "000000", font: "Arial" },
|
||||||
|
paragraph: { spacing: { before: 240, after: 120 }, alignment: AlignmentType.CENTER } },
|
||||||
|
// IMPORTANT: Override built-in heading styles by using their exact IDs
|
||||||
|
{ id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
|
||||||
|
run: { size: 32, bold: true, color: "000000", font: "Arial" }, // 16pt
|
||||||
|
paragraph: { spacing: { before: 240, after: 240 }, outlineLevel: 0 } }, // Required for TOC
|
||||||
|
{ id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
|
||||||
|
run: { size: 28, bold: true, color: "000000", font: "Arial" }, // 14pt
|
||||||
|
paragraph: { spacing: { before: 180, after: 180 }, outlineLevel: 1 } },
|
||||||
|
// Custom styles use your own IDs
|
||||||
|
{ id: "myStyle", name: "My Style", basedOn: "Normal",
|
||||||
|
run: { size: 28, bold: true, color: "000000" },
|
||||||
|
paragraph: { spacing: { after: 120 }, alignment: AlignmentType.CENTER } }
|
||||||
|
],
|
||||||
|
characterStyles: [{ id: "myCharStyle", name: "My Char Style",
|
||||||
|
run: { color: "FF0000", bold: true, underline: { type: UnderlineType.SINGLE } } }]
|
||||||
|
},
|
||||||
|
sections: [{
|
||||||
|
properties: { page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } },
|
||||||
|
children: [
|
||||||
|
new Paragraph({ heading: HeadingLevel.TITLE, children: [new TextRun("Document Title")] }), // Uses overridden Title style
|
||||||
|
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Heading 1")] }), // Uses overridden Heading1 style
|
||||||
|
new Paragraph({ style: "myStyle", children: [new TextRun("Custom paragraph style")] }),
|
||||||
|
new Paragraph({ children: [
|
||||||
|
new TextRun("Normal with "),
|
||||||
|
new TextRun({ text: "custom char style", style: "myCharStyle" })
|
||||||
|
]})
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Professional Font Combinations:**
|
||||||
|
- **Arial (Headers) + Arial (Body)** - Most universally supported, clean and professional
|
||||||
|
- **Times New Roman (Headers) + Arial (Body)** - Classic serif headers with modern sans-serif body
|
||||||
|
- **Georgia (Headers) + Verdana (Body)** - Optimized for screen reading, elegant contrast
|
||||||
|
|
||||||
|
**Key Styling Principles:**
|
||||||
|
- **Override built-in styles**: Use exact IDs like "Heading1", "Heading2", "Heading3" to override Word's built-in heading styles
|
||||||
|
- **HeadingLevel constants**: `HeadingLevel.HEADING_1` uses "Heading1" style, `HeadingLevel.HEADING_2` uses "Heading2" style, etc.
|
||||||
|
- **Include outlineLevel**: Set `outlineLevel: 0` for H1, `outlineLevel: 1` for H2, etc. to ensure TOC works correctly
|
||||||
|
- **Use custom styles** instead of inline formatting for consistency
|
||||||
|
- **Set a default font** using `styles.default.document.run.font` - Arial is universally supported
|
||||||
|
- **Establish visual hierarchy** with different font sizes (titles > headers > body)
|
||||||
|
- **Add proper spacing** with `before` and `after` paragraph spacing
|
||||||
|
- **Use colors sparingly**: Default to black (000000) and shades of gray for titles and headings (heading 1, heading 2, etc.)
|
||||||
|
- **Set consistent margins** (1440 = 1 inch is standard)
|
||||||
|
|
||||||
|
|
||||||
|
## Lists (ALWAYS USE PROPER LISTS - NEVER USE UNICODE BULLETS)
|
||||||
|
```javascript
|
||||||
|
// Bullets - ALWAYS use the numbering config, NOT unicode symbols
|
||||||
|
// CRITICAL: Use LevelFormat.BULLET constant, NOT the string "bullet"
|
||||||
|
const doc = new Document({
|
||||||
|
numbering: {
|
||||||
|
config: [
|
||||||
|
{ reference: "bullet-list",
|
||||||
|
levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT,
|
||||||
|
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
|
||||||
|
{ reference: "first-numbered-list",
|
||||||
|
levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
|
||||||
|
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
|
||||||
|
{ reference: "second-numbered-list", // Different reference = restarts at 1
|
||||||
|
levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
|
||||||
|
style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
sections: [{
|
||||||
|
children: [
|
||||||
|
// Bullet list items
|
||||||
|
new Paragraph({ numbering: { reference: "bullet-list", level: 0 },
|
||||||
|
children: [new TextRun("First bullet point")] }),
|
||||||
|
new Paragraph({ numbering: { reference: "bullet-list", level: 0 },
|
||||||
|
children: [new TextRun("Second bullet point")] }),
|
||||||
|
// Numbered list items
|
||||||
|
new Paragraph({ numbering: { reference: "first-numbered-list", level: 0 },
|
||||||
|
children: [new TextRun("First numbered item")] }),
|
||||||
|
new Paragraph({ numbering: { reference: "first-numbered-list", level: 0 },
|
||||||
|
children: [new TextRun("Second numbered item")] }),
|
||||||
|
// ⚠️ CRITICAL: Different reference = INDEPENDENT list that restarts at 1
|
||||||
|
// Same reference = CONTINUES previous numbering
|
||||||
|
new Paragraph({ numbering: { reference: "second-numbered-list", level: 0 },
|
||||||
|
children: [new TextRun("Starts at 1 again (because different reference)")] })
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
|
||||||
|
// ⚠️ CRITICAL NUMBERING RULE: Each reference creates an INDEPENDENT numbered list
|
||||||
|
// - Same reference = continues numbering (1, 2, 3... then 4, 5, 6...)
|
||||||
|
// - Different reference = restarts at 1 (1, 2, 3... then 1, 2, 3...)
|
||||||
|
// Use unique reference names for each separate numbered section!
|
||||||
|
|
||||||
|
// ⚠️ CRITICAL: NEVER use unicode bullets - they create fake lists that don't work properly
|
||||||
|
// new TextRun("• Item") // WRONG
|
||||||
|
// new SymbolRun({ char: "2022" }) // WRONG
|
||||||
|
// ✅ ALWAYS use numbering config with LevelFormat.BULLET for real Word lists
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tables
|
||||||
|
```javascript
|
||||||
|
// Complete table with margins, borders, headers, and bullet points
|
||||||
|
const tableBorder = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
|
||||||
|
const cellBorders = { top: tableBorder, bottom: tableBorder, left: tableBorder, right: tableBorder };
|
||||||
|
|
||||||
|
new Table({
|
||||||
|
columnWidths: [4680, 4680], // ⚠️ CRITICAL: Set column widths at table level - values in DXA (twentieths of a point)
|
||||||
|
margins: { top: 100, bottom: 100, left: 180, right: 180 }, // Set once for all cells
|
||||||
|
rows: [
|
||||||
|
new TableRow({
|
||||||
|
tableHeader: true,
|
||||||
|
children: [
|
||||||
|
new TableCell({
|
||||||
|
borders: cellBorders,
|
||||||
|
width: { size: 4680, type: WidthType.DXA }, // ALSO set width on each cell
|
||||||
|
// ⚠️ CRITICAL: Always use ShadingType.CLEAR to prevent black backgrounds in Word.
|
||||||
|
shading: { fill: "D5E8F0", type: ShadingType.CLEAR },
|
||||||
|
verticalAlign: VerticalAlign.CENTER,
|
||||||
|
children: [new Paragraph({
|
||||||
|
alignment: AlignmentType.CENTER,
|
||||||
|
children: [new TextRun({ text: "Header", bold: true, size: 22 })]
|
||||||
|
})]
|
||||||
|
}),
|
||||||
|
new TableCell({
|
||||||
|
borders: cellBorders,
|
||||||
|
width: { size: 4680, type: WidthType.DXA }, // ALSO set width on each cell
|
||||||
|
shading: { fill: "D5E8F0", type: ShadingType.CLEAR },
|
||||||
|
children: [new Paragraph({
|
||||||
|
alignment: AlignmentType.CENTER,
|
||||||
|
children: [new TextRun({ text: "Bullet Points", bold: true, size: 22 })]
|
||||||
|
})]
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}),
|
||||||
|
new TableRow({
|
||||||
|
children: [
|
||||||
|
new TableCell({
|
||||||
|
borders: cellBorders,
|
||||||
|
width: { size: 4680, type: WidthType.DXA }, // ALSO set width on each cell
|
||||||
|
children: [new Paragraph({ children: [new TextRun("Regular data")] })]
|
||||||
|
}),
|
||||||
|
new TableCell({
|
||||||
|
borders: cellBorders,
|
||||||
|
width: { size: 4680, type: WidthType.DXA }, // ALSO set width on each cell
|
||||||
|
children: [
|
||||||
|
new Paragraph({
|
||||||
|
numbering: { reference: "bullet-list", level: 0 },
|
||||||
|
children: [new TextRun("First bullet point")]
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
numbering: { reference: "bullet-list", level: 0 },
|
||||||
|
children: [new TextRun("Second bullet point")]
|
||||||
|
})
|
||||||
|
]
|
||||||
|
})
|
||||||
|
]
|
||||||
|
})
|
||||||
|
]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
**IMPORTANT: Table Width & Borders**
|
||||||
|
- Use BOTH `columnWidths: [width1, width2, ...]` array AND `width: { size: X, type: WidthType.DXA }` on each cell
|
||||||
|
- Values in DXA (twentieths of a point): 1440 = 1 inch, Letter usable width = 9360 DXA (with 1" margins)
|
||||||
|
- Apply borders to individual `TableCell` elements, NOT the `Table` itself
|
||||||
|
|
||||||
|
**Precomputed Column Widths (Letter size with 1" margins = 9360 DXA total):**
|
||||||
|
- **2 columns:** `columnWidths: [4680, 4680]` (equal width)
|
||||||
|
- **3 columns:** `columnWidths: [3120, 3120, 3120]` (equal width)
|
||||||
|
|
||||||
|
## Links & Navigation
|
||||||
|
```javascript
|
||||||
|
// TOC (requires headings) - CRITICAL: Use HeadingLevel only, NOT custom styles
|
||||||
|
// ❌ WRONG: new Paragraph({ heading: HeadingLevel.HEADING_1, style: "customHeader", children: [new TextRun("Title")] })
|
||||||
|
// ✅ CORRECT: new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Title")] })
|
||||||
|
new TableOfContents("Table of Contents", { hyperlink: true, headingStyleRange: "1-3" }),
|
||||||
|
|
||||||
|
// External link
|
||||||
|
new Paragraph({
|
||||||
|
children: [new ExternalHyperlink({
|
||||||
|
children: [new TextRun({ text: "Google", style: "Hyperlink" })],
|
||||||
|
link: "https://www.google.com"
|
||||||
|
})]
|
||||||
|
}),
|
||||||
|
|
||||||
|
// Internal link & bookmark
|
||||||
|
new Paragraph({
|
||||||
|
children: [new InternalHyperlink({
|
||||||
|
children: [new TextRun({ text: "Go to Section", style: "Hyperlink" })],
|
||||||
|
anchor: "section1"
|
||||||
|
})]
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
children: [new TextRun("Section Content")],
|
||||||
|
bookmark: { id: "section1", name: "section1" }
|
||||||
|
}),
|
||||||
|
```
|
||||||
|
|
||||||
|
## Images & Media
|
||||||
|
```javascript
|
||||||
|
// Basic image with sizing & positioning
|
||||||
|
// CRITICAL: Always specify 'type' parameter - it's REQUIRED for ImageRun
|
||||||
|
new Paragraph({
|
||||||
|
alignment: AlignmentType.CENTER,
|
||||||
|
children: [new ImageRun({
|
||||||
|
type: "png", // NEW REQUIREMENT: Must specify image type (png, jpg, jpeg, gif, bmp, svg)
|
||||||
|
data: fs.readFileSync("image.png"),
|
||||||
|
transformation: { width: 200, height: 150, rotation: 0 }, // rotation in degrees
|
||||||
|
altText: { title: "Logo", description: "Company logo", name: "Name" } // IMPORTANT: All three fields are required
|
||||||
|
})]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Page Breaks
|
||||||
|
```javascript
|
||||||
|
// Manual page break
|
||||||
|
new Paragraph({ children: [new PageBreak()] }),
|
||||||
|
|
||||||
|
// Page break before paragraph
|
||||||
|
new Paragraph({
|
||||||
|
pageBreakBefore: true,
|
||||||
|
children: [new TextRun("This starts on a new page")]
|
||||||
|
})
|
||||||
|
|
||||||
|
// ⚠️ CRITICAL: NEVER use PageBreak standalone - it will create invalid XML that Word cannot open
|
||||||
|
// ❌ WRONG: new PageBreak()
|
||||||
|
// ✅ CORRECT: new Paragraph({ children: [new PageBreak()] })
|
||||||
|
```
|
||||||
|
|
||||||
|
## Headers/Footers & Page Setup
|
||||||
|
```javascript
|
||||||
|
const doc = new Document({
|
||||||
|
sections: [{
|
||||||
|
properties: {
|
||||||
|
page: {
|
||||||
|
margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 }, // 1440 = 1 inch
|
||||||
|
size: { orientation: PageOrientation.LANDSCAPE },
|
||||||
|
pageNumbers: { start: 1, formatType: "decimal" } // "upperRoman", "lowerRoman", "upperLetter", "lowerLetter"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
default: new Header({ children: [new Paragraph({
|
||||||
|
alignment: AlignmentType.RIGHT,
|
||||||
|
children: [new TextRun("Header Text")]
|
||||||
|
})] })
|
||||||
|
},
|
||||||
|
footers: {
|
||||||
|
default: new Footer({ children: [new Paragraph({
|
||||||
|
alignment: AlignmentType.CENTER,
|
||||||
|
children: [new TextRun("Page "), new TextRun({ children: [PageNumber.CURRENT] }), new TextRun(" of "), new TextRun({ children: [PageNumber.TOTAL_PAGES] })]
|
||||||
|
})] })
|
||||||
|
},
|
||||||
|
children: [/* content */]
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tabs
|
||||||
|
```javascript
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: [
|
||||||
|
{ type: TabStopType.LEFT, position: TabStopPosition.MAX / 4 },
|
||||||
|
{ type: TabStopType.CENTER, position: TabStopPosition.MAX / 2 },
|
||||||
|
{ type: TabStopType.RIGHT, position: TabStopPosition.MAX * 3 / 4 }
|
||||||
|
],
|
||||||
|
children: [new TextRun("Left\tCenter\tRight")]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Constants & Quick Reference
|
||||||
|
- **Underlines:** `SINGLE`, `DOUBLE`, `WAVY`, `DASH`
|
||||||
|
- **Borders:** `SINGLE`, `DOUBLE`, `DASHED`, `DOTTED`
|
||||||
|
- **Numbering:** `DECIMAL` (1,2,3), `UPPER_ROMAN` (I,II,III), `LOWER_LETTER` (a,b,c)
|
||||||
|
- **Tabs:** `LEFT`, `CENTER`, `RIGHT`, `DECIMAL`
|
||||||
|
- **Symbols:** `"2022"` (•), `"00A9"` (©), `"00AE"` (®), `"2122"` (™), `"00B0"` (°), `"F070"` (✓), `"F0FC"` (✗)
|
||||||
|
|
||||||
|
## Critical Issues & Common Mistakes
|
||||||
|
- **CRITICAL: PageBreak must ALWAYS be inside a Paragraph** - standalone PageBreak creates invalid XML that Word cannot open
|
||||||
|
- **ALWAYS use ShadingType.CLEAR for table cell shading** - Never use ShadingType.SOLID (causes black background).
|
||||||
|
- Measurements in DXA (1440 = 1 inch) | Each table cell needs ≥1 Paragraph | TOC requires HeadingLevel styles only
|
||||||
|
- **ALWAYS use custom styles** with Arial font for professional appearance and proper visual hierarchy
|
||||||
|
- **ALWAYS set a default font** using `styles.default.document.run.font` - Arial recommended
|
||||||
|
- **ALWAYS use columnWidths array for tables** + individual cell widths for compatibility
|
||||||
|
- **NEVER use unicode symbols for bullets** - always use proper numbering configuration with `LevelFormat.BULLET` constant (NOT the string "bullet")
|
||||||
|
- **NEVER use \n for line breaks anywhere** - always use separate Paragraph elements for each line
|
||||||
|
- **ALWAYS use TextRun objects within Paragraph children** - never use text property directly on Paragraph
|
||||||
|
- **CRITICAL for images**: ImageRun REQUIRES `type` parameter - always specify "png", "jpg", "jpeg", "gif", "bmp", or "svg"
|
||||||
|
- **CRITICAL for bullets**: Must use `LevelFormat.BULLET` constant, not string "bullet", and include `text: "•"` for the bullet character
|
||||||
|
- **CRITICAL for numbering**: Each numbering reference creates an INDEPENDENT list. Same reference = continues numbering (1,2,3 then 4,5,6). Different reference = restarts at 1 (1,2,3 then 1,2,3). Use unique reference names for each separate numbered section!
|
||||||
|
- **CRITICAL for TOC**: When using TableOfContents, headings must use HeadingLevel ONLY - do NOT add custom styles to heading paragraphs or TOC will break
|
||||||
|
- **Tables**: Set `columnWidths` array + individual cell widths, apply borders to cells not table
|
||||||
|
- **Set table margins at TABLE level** for consistent cell padding (avoids repetition per cell)
|
||||||
632
skills/docx/ooxml.md
Normal file
632
skills/docx/ooxml.md
Normal file
@@ -0,0 +1,632 @@
|
|||||||
|
# Office Open XML Technical Reference
|
||||||
|
|
||||||
|
**Important: Read this entire document before starting.** This document covers:
|
||||||
|
- [Technical Guidelines](#technical-guidelines) - Schema compliance rules and validation requirements
|
||||||
|
- [Document Content Patterns](#document-content-patterns) - XML patterns for headings, lists, tables, formatting, etc.
|
||||||
|
- [Document Library (Python)](#document-library-python) - Recommended approach for OOXML manipulation with automatic infrastructure setup
|
||||||
|
- [Tracked Changes (Redlining)](#tracked-changes-redlining) - XML patterns for implementing tracked changes
|
||||||
|
|
||||||
|
## Technical Guidelines
|
||||||
|
|
||||||
|
### Schema Compliance
|
||||||
|
- **Element ordering in `<w:pPr>`**: `<w:pStyle>`, `<w:numPr>`, `<w:spacing>`, `<w:ind>`, `<w:jc>`, `<w:keepNext>`, `<w:keepLines>`, then `<w:rPr>` last
|
||||||
|
- **Element ordering in `<w:trPr>`**: All regular properties (`<w:gridAfter>`, `<w:wAfter>`, `<w:cantSplit>`, `<w:trHeight>`) must come before `<w:ins/>` or `<w:del/>`, which must be last. No properties can follow tracked change elements
|
||||||
|
- **Whitespace**: Add `xml:space='preserve'` to `<w:t>` elements with leading/trailing spaces
|
||||||
|
- **Unicode**: Escape characters in ASCII content: `"` becomes `“`
|
||||||
|
- **Character encoding reference**: Curly quotes `""` become `“”`, apostrophe `'` becomes `’`, em-dash `—` becomes `—`
|
||||||
|
- **Tracked changes**: Use `<w:del>` and `<w:ins>` tags with `w:author="Claude"` outside `<w:r>` elements
|
||||||
|
- **Critical**: `<w:ins>` closes with `</w:ins>`, `<w:del>` closes with `</w:del>` - never mix
|
||||||
|
- **RSIDs must be 8-digit hex**: Use values like `00AB1234` (only 0-9, A-F characters)
|
||||||
|
- **trackRevisions placement**: Add `<w:trackRevisions/>` after `<w:proofState>` in settings.xml
|
||||||
|
- **Images**: Add to `word/media/`, reference in `document.xml`, set dimensions to prevent overflow
|
||||||
|
|
||||||
|
## Document Content Patterns
|
||||||
|
|
||||||
|
### Basic Structure
|
||||||
|
```xml
|
||||||
|
<w:p>
|
||||||
|
<w:r><w:t>Text content</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Headings and Styles
|
||||||
|
```xml
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:pStyle w:val="Title"/>
|
||||||
|
<w:jc w:val="center"/>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r><w:t>Document Title</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
|
||||||
|
<w:p>
|
||||||
|
<w:pPr><w:pStyle w:val="Heading2"/></w:pPr>
|
||||||
|
<w:r><w:t>Section Heading</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Text Formatting
|
||||||
|
```xml
|
||||||
|
<!-- Bold -->
|
||||||
|
<w:r><w:rPr><w:b/><w:bCs/></w:rPr><w:t>Bold</w:t></w:r>
|
||||||
|
<!-- Italic -->
|
||||||
|
<w:r><w:rPr><w:i/><w:iCs/></w:rPr><w:t>Italic</w:t></w:r>
|
||||||
|
<!-- Underline -->
|
||||||
|
<w:r><w:rPr><w:u w:val="single"/></w:rPr><w:t>Underlined</w:t></w:r>
|
||||||
|
<!-- Highlight -->
|
||||||
|
<w:r><w:rPr><w:highlight w:val="yellow"/></w:rPr><w:t>Highlighted</w:t></w:r>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lists
|
||||||
|
```xml
|
||||||
|
<!-- Numbered list -->
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:pStyle w:val="ListParagraph"/>
|
||||||
|
<w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr>
|
||||||
|
<w:spacing w:before="240"/>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r><w:t>First item</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
|
||||||
|
<!-- Restart numbered list at 1 - use different numId -->
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:pStyle w:val="ListParagraph"/>
|
||||||
|
<w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr>
|
||||||
|
<w:spacing w:before="240"/>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r><w:t>New list item 1</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
|
||||||
|
<!-- Bullet list (level 2) -->
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:pStyle w:val="ListParagraph"/>
|
||||||
|
<w:numPr><w:ilvl w:val="1"/><w:numId w:val="1"/></w:numPr>
|
||||||
|
<w:spacing w:before="240"/>
|
||||||
|
<w:ind w:left="900"/>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r><w:t>Bullet item</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tables
|
||||||
|
|
||||||
|
**CRITICAL**: When adding rows to existing tables, match the EXACT cell structure of existing rows:
|
||||||
|
- Count cells in an existing row and match the count exactly
|
||||||
|
- Check for `<w:gridSpan>` (cell spans multiple columns) and `<w:gridAfter>` (columns after cells)
|
||||||
|
- Match cell widths (`<w:tcW>`) from the table's `<w:tblGrid>` definition
|
||||||
|
- **Match content placement**: Check which cell contains the content in the reference row and place your content in the same cell position (e.g., if label rows have empty first cells with content in second cells, replicate this pattern)
|
||||||
|
- Examine which columns contain content vs. which are empty - replicate this exact pattern
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<w:tbl>
|
||||||
|
<w:tblPr>
|
||||||
|
<w:tblStyle w:val="TableGrid"/>
|
||||||
|
<w:tblW w:w="0" w:type="auto"/>
|
||||||
|
</w:tblPr>
|
||||||
|
<w:tblGrid>
|
||||||
|
<w:gridCol w:w="4675"/><w:gridCol w:w="4675"/>
|
||||||
|
</w:tblGrid>
|
||||||
|
<w:tr>
|
||||||
|
<w:tc>
|
||||||
|
<w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr>
|
||||||
|
<w:p><w:r><w:t>Cell 1</w:t></w:r></w:p>
|
||||||
|
</w:tc>
|
||||||
|
<w:tc>
|
||||||
|
<w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr>
|
||||||
|
<w:p><w:r><w:t>Cell 2</w:t></w:r></w:p>
|
||||||
|
</w:tc>
|
||||||
|
</w:tr>
|
||||||
|
</w:tbl>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
```xml
|
||||||
|
<!-- Page break before new section (common pattern) -->
|
||||||
|
<w:p>
|
||||||
|
<w:r>
|
||||||
|
<w:br w:type="page"/>
|
||||||
|
</w:r>
|
||||||
|
</w:p>
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:pStyle w:val="Heading1"/>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r>
|
||||||
|
<w:t>New Section Title</w:t>
|
||||||
|
</w:r>
|
||||||
|
</w:p>
|
||||||
|
|
||||||
|
<!-- Centered paragraph -->
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:spacing w:before="240" w:after="0"/>
|
||||||
|
<w:jc w:val="center"/>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r><w:t>Centered text</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
|
||||||
|
<!-- Font change - paragraph level (applies to all runs) -->
|
||||||
|
<w:p>
|
||||||
|
<w:pPr>
|
||||||
|
<w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New"/></w:rPr>
|
||||||
|
</w:pPr>
|
||||||
|
<w:r><w:t>Monospace text</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
|
||||||
|
<!-- Font change - run level (specific to this text) -->
|
||||||
|
<w:p>
|
||||||
|
<w:r>
|
||||||
|
<w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New"/></w:rPr>
|
||||||
|
<w:t>This text is Courier New</w:t>
|
||||||
|
</w:r>
|
||||||
|
<w:r><w:t> and this text uses default font</w:t></w:r>
|
||||||
|
</w:p>
|
||||||
|
```
|
||||||
|
|
||||||
|
## File Updates
|
||||||
|
|
||||||
|
When adding content, update these files:
|
||||||
|
|
||||||
|
**`word/_rels/document.xml.rels`:**
|
||||||
|
```xml
|
||||||
|
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/>
|
||||||
|
<Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
**`[Content_Types].xml`:**
|
||||||
|
```xml
|
||||||
|
<Default Extension="png" ContentType="image/png"/>
|
||||||
|
<Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Images
|
||||||
|
**CRITICAL**: Calculate dimensions to prevent page overflow and maintain aspect ratio.
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- Minimal required structure -->
|
||||||
|
<w:p>
|
||||||
|
<w:r>
|
||||||
|
<w:drawing>
|
||||||
|
<wp:inline>
|
||||||
|
<wp:extent cx="2743200" cy="1828800"/>
|
||||||
|
<wp:docPr id="1" name="Picture 1"/>
|
||||||
|
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
|
||||||
|
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<pic:nvPicPr>
|
||||||
|
<pic:cNvPr id="0" name="image1.png"/>
|
||||||
|
<pic:cNvPicPr/>
|
||||||
|
</pic:nvPicPr>
|
||||||
|
<pic:blipFill>
|
||||||
|
<a:blip r:embed="rId5"/>
|
||||||
|
<!-- Add for stretch fill with aspect ratio preservation -->
|
||||||
|
<a:stretch>
|
||||||
|
<a:fillRect/>
|
||||||
|
</a:stretch>
|
||||||
|
</pic:blipFill>
|
||||||
|
<pic:spPr>
|
||||||
|
<a:xfrm>
|
||||||
|
<a:ext cx="2743200" cy="1828800"/>
|
||||||
|
</a:xfrm>
|
||||||
|
<a:prstGeom prst="rect"/>
|
||||||
|
</pic:spPr>
|
||||||
|
</pic:pic>
|
||||||
|
</a:graphicData>
|
||||||
|
</a:graphic>
|
||||||
|
</wp:inline>
|
||||||
|
</w:drawing>
|
||||||
|
</w:r>
|
||||||
|
</w:p>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Links (Hyperlinks)
|
||||||
|
|
||||||
|
**IMPORTANT**: All hyperlinks (both internal and external) require the Hyperlink style to be defined in styles.xml. Without this style, links will look like regular text instead of blue underlined clickable links.
|
||||||
|
|
||||||
|
**External Links:**
|
||||||
|
```xml
|
||||||
|
<!-- In document.xml -->
|
||||||
|
<w:hyperlink r:id="rId5">
|
||||||
|
<w:r>
|
||||||
|
<w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr>
|
||||||
|
<w:t>Link Text</w:t>
|
||||||
|
</w:r>
|
||||||
|
</w:hyperlink>
|
||||||
|
|
||||||
|
<!-- In word/_rels/document.xml.rels -->
|
||||||
|
<Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"
|
||||||
|
Target="https://www.example.com/" TargetMode="External"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Internal Links:**
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- Link to bookmark -->
|
||||||
|
<w:hyperlink w:anchor="myBookmark">
|
||||||
|
<w:r>
|
||||||
|
<w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr>
|
||||||
|
<w:t>Link Text</w:t>
|
||||||
|
</w:r>
|
||||||
|
</w:hyperlink>
|
||||||
|
|
||||||
|
<!-- Bookmark target -->
|
||||||
|
<w:bookmarkStart w:id="0" w:name="myBookmark"/>
|
||||||
|
<w:r><w:t>Target content</w:t></w:r>
|
||||||
|
<w:bookmarkEnd w:id="0"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Hyperlink Style (required in styles.xml):**
|
||||||
|
```xml
|
||||||
|
<w:style w:type="character" w:styleId="Hyperlink">
|
||||||
|
<w:name w:val="Hyperlink"/>
|
||||||
|
<w:basedOn w:val="DefaultParagraphFont"/>
|
||||||
|
<w:uiPriority w:val="99"/>
|
||||||
|
<w:unhideWhenUsed/>
|
||||||
|
<w:rPr>
|
||||||
|
<w:color w:val="467886" w:themeColor="hyperlink"/>
|
||||||
|
<w:u w:val="single"/>
|
||||||
|
</w:rPr>
|
||||||
|
</w:style>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Document Library (Python)
|
||||||
|
|
||||||
|
Use the Document class from `scripts/document.py` for all tracked changes and comments. It automatically handles infrastructure setup (people.xml, RSIDs, settings.xml, comment files, relationships, content types). Only use direct XML manipulation for complex scenarios not supported by the library.
|
||||||
|
|
||||||
|
**Working with Unicode and Entities:**
|
||||||
|
- **Searching**: Both entity notation and Unicode characters work - `contains="“Company"` and `contains="\u201cCompany"` find the same text
|
||||||
|
- **Replacing**: Use either entities (`“`) or Unicode (`\u201c`) - both work and will be converted appropriately based on the file's encoding (ascii → entities, utf-8 → Unicode)
|
||||||
|
|
||||||
|
### Initialization
|
||||||
|
|
||||||
|
**Set PYTHONPATH to the docx skill root:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find the docx skill root (directory containing scripts/ and ooxml/)
|
||||||
|
find /mnt/skills -name "document.py" -path "*/docx/scripts/*" 2>/dev/null | head -1
|
||||||
|
# Example output: /mnt/skills/public/docx/scripts/document.py
|
||||||
|
# Skill root is: /mnt/skills/public/docx
|
||||||
|
|
||||||
|
# Option 1: Export for entire session
|
||||||
|
export PYTHONPATH=/mnt/skills/public/docx:$PYTHONPATH
|
||||||
|
|
||||||
|
# Option 2: Inline with script execution
|
||||||
|
PYTHONPATH=/mnt/skills/public/docx python3 your_script.py
|
||||||
|
```
|
||||||
|
|
||||||
|
**In your script**, import normally:
|
||||||
|
```python
|
||||||
|
from scripts.document import Document
|
||||||
|
|
||||||
|
# Basic initialization (automatically creates temp copy and sets up infrastructure)
|
||||||
|
doc = Document('unpacked')
|
||||||
|
|
||||||
|
# Customize author and initials
|
||||||
|
doc = Document('unpacked', author="John Doe", initials="JD")
|
||||||
|
|
||||||
|
# Enable track revisions mode
|
||||||
|
doc = Document('unpacked', track_revisions=True)
|
||||||
|
|
||||||
|
# Specify custom RSID (auto-generated if not provided)
|
||||||
|
doc = Document('unpacked', rsid="07DC5ECB")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating Tracked Changes
|
||||||
|
|
||||||
|
**CRITICAL**: Only mark text that actually changes. Keep ALL unchanged text outside `<w:del>`/`<w:ins>` tags. Marking unchanged text makes edits unprofessional and harder to review.
|
||||||
|
|
||||||
|
**Attribute Handling**: The Document class auto-injects attributes (w:id, w:date, w:rsidR, w:rsidDel, w16du:dateUtc, xml:space) into new elements. When preserving unchanged text from the original document, copy the original `<w:r>` element with its existing attributes to maintain document integrity.
|
||||||
|
|
||||||
|
**Method Selection Guide**:
|
||||||
|
- **Adding your own changes to regular text**: Use `replace_node()` with `<w:del>`/`<w:ins>` tags, or `suggest_deletion()` for removing entire `<w:r>` or `<w:p>` elements
|
||||||
|
- **Partially modifying another author's tracked change**: Use `replace_node()` to nest your changes inside their `<w:ins>`/`<w:del>`
|
||||||
|
- **Completely rejecting another author's insertion**: Use `revert_insertion()` on the `<w:ins>` element (NOT `suggest_deletion()`)
|
||||||
|
- **Completely rejecting another author's deletion**: Use `revert_deletion()` on the `<w:del>` element to restore deleted content using tracked changes
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Minimal edit - change one word: "The report is monthly" → "The report is quarterly"
|
||||||
|
# Original: <w:r w:rsidR="00AB12CD"><w:rPr><w:rFonts w:ascii="Calibri"/></w:rPr><w:t>The report is monthly</w:t></w:r>
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="The report is monthly")
|
||||||
|
rpr = tags[0].toxml() if (tags := node.getElementsByTagName("w:rPr")) else ""
|
||||||
|
replacement = f'<w:r w:rsidR="00AB12CD">{rpr}<w:t>The report is </w:t></w:r><w:del><w:r>{rpr}<w:delText>monthly</w:delText></w:r></w:del><w:ins><w:r>{rpr}<w:t>quarterly</w:t></w:r></w:ins>'
|
||||||
|
doc["word/document.xml"].replace_node(node, replacement)
|
||||||
|
|
||||||
|
# Minimal edit - change number: "within 30 days" → "within 45 days"
|
||||||
|
# Original: <w:r w:rsidR="00XYZ789"><w:rPr><w:rFonts w:ascii="Calibri"/></w:rPr><w:t>within 30 days</w:t></w:r>
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="within 30 days")
|
||||||
|
rpr = tags[0].toxml() if (tags := node.getElementsByTagName("w:rPr")) else ""
|
||||||
|
replacement = f'<w:r w:rsidR="00XYZ789">{rpr}<w:t>within </w:t></w:r><w:del><w:r>{rpr}<w:delText>30</w:delText></w:r></w:del><w:ins><w:r>{rpr}<w:t>45</w:t></w:r></w:ins><w:r w:rsidR="00XYZ789">{rpr}<w:t> days</w:t></w:r>'
|
||||||
|
doc["word/document.xml"].replace_node(node, replacement)
|
||||||
|
|
||||||
|
# Complete replacement - preserve formatting even when replacing all text
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="apple")
|
||||||
|
rpr = tags[0].toxml() if (tags := node.getElementsByTagName("w:rPr")) else ""
|
||||||
|
replacement = f'<w:del><w:r>{rpr}<w:delText>apple</w:delText></w:r></w:del><w:ins><w:r>{rpr}<w:t>banana orange</w:t></w:r></w:ins>'
|
||||||
|
doc["word/document.xml"].replace_node(node, replacement)
|
||||||
|
|
||||||
|
# Insert new content (no attributes needed - auto-injected)
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="existing text")
|
||||||
|
doc["word/document.xml"].insert_after(node, '<w:ins><w:r><w:t>new text</w:t></w:r></w:ins>')
|
||||||
|
|
||||||
|
# Partially delete another author's insertion
|
||||||
|
# Original: <w:ins w:author="Jane Smith" w:date="..."><w:r><w:t>quarterly financial report</w:t></w:r></w:ins>
|
||||||
|
# Goal: Delete only "financial" to make it "quarterly report"
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:ins", attrs={"w:id": "5"})
|
||||||
|
# IMPORTANT: Preserve w:author="Jane Smith" on the outer <w:ins> to maintain authorship
|
||||||
|
replacement = '''<w:ins w:author="Jane Smith" w:date="2025-01-15T10:00:00Z">
|
||||||
|
<w:r><w:t>quarterly </w:t></w:r>
|
||||||
|
<w:del><w:r><w:delText>financial </w:delText></w:r></w:del>
|
||||||
|
<w:r><w:t>report</w:t></w:r>
|
||||||
|
</w:ins>'''
|
||||||
|
doc["word/document.xml"].replace_node(node, replacement)
|
||||||
|
|
||||||
|
# Change part of another author's insertion
|
||||||
|
# Original: <w:ins w:author="Jane Smith"><w:r><w:t>in silence, safe and sound</w:t></w:r></w:ins>
|
||||||
|
# Goal: Change "safe and sound" to "soft and unbound"
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:ins", attrs={"w:id": "8"})
|
||||||
|
replacement = f'''<w:ins w:author="Jane Smith" w:date="2025-01-15T10:00:00Z">
|
||||||
|
<w:r><w:t>in silence, </w:t></w:r>
|
||||||
|
</w:ins>
|
||||||
|
<w:ins>
|
||||||
|
<w:r><w:t>soft and unbound</w:t></w:r>
|
||||||
|
</w:ins>
|
||||||
|
<w:ins w:author="Jane Smith" w:date="2025-01-15T10:00:00Z">
|
||||||
|
<w:del><w:r><w:delText>safe and sound</w:delText></w:r></w:del>
|
||||||
|
</w:ins>'''
|
||||||
|
doc["word/document.xml"].replace_node(node, replacement)
|
||||||
|
|
||||||
|
# Delete entire run (use only when deleting all content; use replace_node for partial deletions)
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="text to delete")
|
||||||
|
doc["word/document.xml"].suggest_deletion(node)
|
||||||
|
|
||||||
|
# Delete entire paragraph (in-place, handles both regular and numbered list paragraphs)
|
||||||
|
para = doc["word/document.xml"].get_node(tag="w:p", contains="paragraph to delete")
|
||||||
|
doc["word/document.xml"].suggest_deletion(para)
|
||||||
|
|
||||||
|
# Add new numbered list item
|
||||||
|
target_para = doc["word/document.xml"].get_node(tag="w:p", contains="existing list item")
|
||||||
|
pPr = tags[0].toxml() if (tags := target_para.getElementsByTagName("w:pPr")) else ""
|
||||||
|
new_item = f'<w:p>{pPr}<w:r><w:t>New item</w:t></w:r></w:p>'
|
||||||
|
tracked_para = doc.suggest_paragraph(new_item)
|
||||||
|
doc["word/document.xml"].insert_after(target_para, tracked_para)
|
||||||
|
# Optional: add spacing paragraph before content for better visual separation
|
||||||
|
# spacing = doc.suggest_paragraph('<w:p><w:pPr><w:pStyle w:val="ListParagraph"/></w:pPr></w:p>')
|
||||||
|
# doc["word/document.xml"].insert_after(target_para, spacing + tracked_para)
|
||||||
|
|
||||||
|
# Add table row with tracked changes (requires 3 levels: row, cell properties, content)
|
||||||
|
# IMPORTANT: First examine an existing row to match cell count, widths, and content placement
|
||||||
|
last_row = doc["word/document.xml"].get_node(tag="w:tr", line_number=5000)
|
||||||
|
new_row = '''<w:tr>
|
||||||
|
<w:trPr><w:ins/></w:trPr>
|
||||||
|
<w:tc>
|
||||||
|
<w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr>
|
||||||
|
<w:p><w:pPr><w:rPr><w:ins/></w:rPr></w:pPr><w:ins><w:r><w:t>New Cell</w:t></w:r></w:ins></w:p>
|
||||||
|
</w:tc>
|
||||||
|
</w:tr>'''
|
||||||
|
doc["word/document.xml"].insert_after(last_row, new_row)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Comments
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Add comment spanning two existing tracked changes
|
||||||
|
# Note: w:id is auto-generated. Only search by w:id if you know it from XML inspection
|
||||||
|
start_node = doc["word/document.xml"].get_node(tag="w:del", attrs={"w:id": "1"})
|
||||||
|
end_node = doc["word/document.xml"].get_node(tag="w:ins", attrs={"w:id": "2"})
|
||||||
|
doc.add_comment(start=start_node, end=end_node, text="Explanation of this change")
|
||||||
|
|
||||||
|
# Add comment on a paragraph
|
||||||
|
para = doc["word/document.xml"].get_node(tag="w:p", contains="paragraph text")
|
||||||
|
doc.add_comment(start=para, end=para, text="Comment on this paragraph")
|
||||||
|
|
||||||
|
# Add comment on newly created tracked change
|
||||||
|
# First create the tracked change
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="old")
|
||||||
|
new_nodes = doc["word/document.xml"].replace_node(
|
||||||
|
node,
|
||||||
|
'<w:del><w:r><w:delText>old</w:delText></w:r></w:del><w:ins><w:r><w:t>new</w:t></w:r></w:ins>'
|
||||||
|
)
|
||||||
|
# Then add comment on the newly created elements
|
||||||
|
# new_nodes[0] is the <w:del>, new_nodes[1] is the <w:ins>
|
||||||
|
doc.add_comment(start=new_nodes[0], end=new_nodes[1], text="Changed old to new per requirements")
|
||||||
|
|
||||||
|
# Reply to existing comment
|
||||||
|
doc.reply_to_comment(parent_comment_id=0, text="I agree with this change")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rejecting Tracked Changes
|
||||||
|
|
||||||
|
**IMPORTANT**: Use `revert_insertion()` to reject insertions and `revert_deletion()` to restore deletions using tracked changes. Use `suggest_deletion()` only for regular unmarked content.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Reject insertion (wraps it in deletion)
|
||||||
|
# Use this when another author inserted text that you want to delete
|
||||||
|
ins = doc["word/document.xml"].get_node(tag="w:ins", attrs={"w:id": "5"})
|
||||||
|
nodes = doc["word/document.xml"].revert_insertion(ins) # Returns [ins]
|
||||||
|
|
||||||
|
# Reject deletion (creates insertion to restore deleted content)
|
||||||
|
# Use this when another author deleted text that you want to restore
|
||||||
|
del_elem = doc["word/document.xml"].get_node(tag="w:del", attrs={"w:id": "3"})
|
||||||
|
nodes = doc["word/document.xml"].revert_deletion(del_elem) # Returns [del_elem, new_ins]
|
||||||
|
|
||||||
|
# Reject all insertions in a paragraph
|
||||||
|
para = doc["word/document.xml"].get_node(tag="w:p", contains="paragraph text")
|
||||||
|
nodes = doc["word/document.xml"].revert_insertion(para) # Returns [para]
|
||||||
|
|
||||||
|
# Reject all deletions in a paragraph
|
||||||
|
para = doc["word/document.xml"].get_node(tag="w:p", contains="paragraph text")
|
||||||
|
nodes = doc["word/document.xml"].revert_deletion(para) # Returns [para]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Inserting Images
|
||||||
|
|
||||||
|
**CRITICAL**: The Document class works with a temporary copy at `doc.unpacked_path`. Always copy images to this temp directory, not the original unpacked folder.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from PIL import Image
|
||||||
|
import shutil, os
|
||||||
|
|
||||||
|
# Initialize document first
|
||||||
|
doc = Document('unpacked')
|
||||||
|
|
||||||
|
# Copy image and calculate full-width dimensions with aspect ratio
|
||||||
|
media_dir = os.path.join(doc.unpacked_path, 'word/media')
|
||||||
|
os.makedirs(media_dir, exist_ok=True)
|
||||||
|
shutil.copy('image.png', os.path.join(media_dir, 'image1.png'))
|
||||||
|
img = Image.open(os.path.join(media_dir, 'image1.png'))
|
||||||
|
width_emus = int(6.5 * 914400) # 6.5" usable width, 914400 EMUs/inch
|
||||||
|
height_emus = int(width_emus * img.size[1] / img.size[0])
|
||||||
|
|
||||||
|
# Add relationship and content type
|
||||||
|
rels_editor = doc['word/_rels/document.xml.rels']
|
||||||
|
next_rid = rels_editor.get_next_rid()
|
||||||
|
rels_editor.append_to(rels_editor.dom.documentElement,
|
||||||
|
f'<Relationship Id="{next_rid}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png"/>')
|
||||||
|
doc['[Content_Types].xml'].append_to(doc['[Content_Types].xml'].dom.documentElement,
|
||||||
|
'<Default Extension="png" ContentType="image/png"/>')
|
||||||
|
|
||||||
|
# Insert image
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:p", line_number=100)
|
||||||
|
doc["word/document.xml"].insert_after(node, f'''<w:p>
|
||||||
|
<w:r>
|
||||||
|
<w:drawing>
|
||||||
|
<wp:inline distT="0" distB="0" distL="0" distR="0">
|
||||||
|
<wp:extent cx="{width_emus}" cy="{height_emus}"/>
|
||||||
|
<wp:docPr id="1" name="Picture 1"/>
|
||||||
|
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
|
||||||
|
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<pic:nvPicPr><pic:cNvPr id="1" name="image1.png"/><pic:cNvPicPr/></pic:nvPicPr>
|
||||||
|
<pic:blipFill><a:blip r:embed="{next_rid}"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill>
|
||||||
|
<pic:spPr><a:xfrm><a:ext cx="{width_emus}" cy="{height_emus}"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr>
|
||||||
|
</pic:pic>
|
||||||
|
</a:graphicData>
|
||||||
|
</a:graphic>
|
||||||
|
</wp:inline>
|
||||||
|
</w:drawing>
|
||||||
|
</w:r>
|
||||||
|
</w:p>''')
|
||||||
|
```
|
||||||
|
|
||||||
|
### Getting Nodes
|
||||||
|
|
||||||
|
```python
|
||||||
|
# By text content
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:p", contains="specific text")
|
||||||
|
|
||||||
|
# By line range
|
||||||
|
para = doc["word/document.xml"].get_node(tag="w:p", line_number=range(100, 150))
|
||||||
|
|
||||||
|
# By attributes
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:del", attrs={"w:id": "1"})
|
||||||
|
|
||||||
|
# By exact line number (must be line number where tag opens)
|
||||||
|
para = doc["word/document.xml"].get_node(tag="w:p", line_number=42)
|
||||||
|
|
||||||
|
# Combine filters
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", line_number=range(40, 60), contains="text")
|
||||||
|
|
||||||
|
# Disambiguate when text appears multiple times - add line_number range
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", contains="Section", line_number=range(2400, 2500))
|
||||||
|
```
|
||||||
|
|
||||||
|
### Saving
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Save with automatic validation (copies back to original directory)
|
||||||
|
doc.save() # Validates by default, raises error if validation fails
|
||||||
|
|
||||||
|
# Save to different location
|
||||||
|
doc.save('modified-unpacked')
|
||||||
|
|
||||||
|
# Skip validation (debugging only - needing this in production indicates XML issues)
|
||||||
|
doc.save(validate=False)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Direct DOM Manipulation
|
||||||
|
|
||||||
|
For complex scenarios not covered by the library:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Access any XML file
|
||||||
|
editor = doc["word/document.xml"]
|
||||||
|
editor = doc["word/comments.xml"]
|
||||||
|
|
||||||
|
# Direct DOM access (defusedxml.minidom.Document)
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:p", line_number=5)
|
||||||
|
parent = node.parentNode
|
||||||
|
parent.removeChild(node)
|
||||||
|
parent.appendChild(node) # Move to end
|
||||||
|
|
||||||
|
# General document manipulation (without tracked changes)
|
||||||
|
old_node = doc["word/document.xml"].get_node(tag="w:p", contains="original text")
|
||||||
|
doc["word/document.xml"].replace_node(old_node, "<w:p><w:r><w:t>replacement text</w:t></w:r></w:p>")
|
||||||
|
|
||||||
|
# Multiple insertions - use return value to maintain order
|
||||||
|
node = doc["word/document.xml"].get_node(tag="w:r", line_number=100)
|
||||||
|
nodes = doc["word/document.xml"].insert_after(node, "<w:r><w:t>A</w:t></w:r>")
|
||||||
|
nodes = doc["word/document.xml"].insert_after(nodes[-1], "<w:r><w:t>B</w:t></w:r>")
|
||||||
|
nodes = doc["word/document.xml"].insert_after(nodes[-1], "<w:r><w:t>C</w:t></w:r>")
|
||||||
|
# Results in: original_node, A, B, C
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tracked Changes (Redlining)
|
||||||
|
|
||||||
|
**Use the Document class above for all tracked changes.** The patterns below are for reference when constructing replacement XML strings.
|
||||||
|
|
||||||
|
### Validation Rules
|
||||||
|
The validator checks that the document text matches the original after reverting Claude's changes. This means:
|
||||||
|
- **NEVER modify text inside another author's `<w:ins>` or `<w:del>` tags**
|
||||||
|
- **ALWAYS use nested deletions** to remove another author's insertions
|
||||||
|
- **Every edit must be properly tracked** with `<w:ins>` or `<w:del>` tags
|
||||||
|
|
||||||
|
### Tracked Change Patterns
|
||||||
|
|
||||||
|
**CRITICAL RULES**:
|
||||||
|
1. Never modify the content inside another author's tracked changes. Always use nested deletions.
|
||||||
|
2. **XML Structure**: Always place `<w:del>` and `<w:ins>` at paragraph level containing complete `<w:r>` elements. Never nest inside `<w:r>` elements - this creates invalid XML that breaks document processing.
|
||||||
|
|
||||||
|
**Text Insertion:**
|
||||||
|
```xml
|
||||||
|
<w:ins w:id="1" w:author="Claude" w:date="2025-07-30T23:05:00Z" w16du:dateUtc="2025-07-31T06:05:00Z">
|
||||||
|
<w:r w:rsidR="00792858">
|
||||||
|
<w:t>inserted text</w:t>
|
||||||
|
</w:r>
|
||||||
|
</w:ins>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Text Deletion:**
|
||||||
|
```xml
|
||||||
|
<w:del w:id="2" w:author="Claude" w:date="2025-07-30T23:05:00Z" w16du:dateUtc="2025-07-31T06:05:00Z">
|
||||||
|
<w:r w:rsidDel="00792858">
|
||||||
|
<w:delText>deleted text</w:delText>
|
||||||
|
</w:r>
|
||||||
|
</w:del>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Deleting Another Author's Insertion (MUST use nested structure):**
|
||||||
|
```xml
|
||||||
|
<!-- Nest deletion inside the original insertion -->
|
||||||
|
<w:ins w:author="Jane Smith" w:id="16">
|
||||||
|
<w:del w:author="Claude" w:id="40">
|
||||||
|
<w:r><w:delText>monthly</w:delText></w:r>
|
||||||
|
</w:del>
|
||||||
|
</w:ins>
|
||||||
|
<w:ins w:author="Claude" w:id="41">
|
||||||
|
<w:r><w:t>weekly</w:t></w:r>
|
||||||
|
</w:ins>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Restoring Another Author's Deletion:**
|
||||||
|
```xml
|
||||||
|
<!-- Leave their deletion unchanged, add new insertion after it -->
|
||||||
|
<w:del w:author="Jane Smith" w:id="50">
|
||||||
|
<w:r><w:delText>within 30 days</w:delText></w:r>
|
||||||
|
</w:del>
|
||||||
|
<w:ins w:author="Claude" w:id="51">
|
||||||
|
<w:r><w:t>within 30 days</w:t></w:r>
|
||||||
|
</w:ins>
|
||||||
|
```
|
||||||
1499
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd
Normal file
1499
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:complexType name="CT_ShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textlink" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ConnectorNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Connector">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional" default=""/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrameNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGraphicFramePr" type="CT_GraphicFrameNonVisual" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ObjectChoices">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_MarkerCoordinate">
|
||||||
|
<xsd:restriction base="xsd:double">
|
||||||
|
<xsd:minInclusive value="0.0"/>
|
||||||
|
<xsd:maxInclusive value="1.0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Marker">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="x" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="y" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RelSizeAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AbsSizeAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_Anchor">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="relSizeAnchor" type="CT_RelSizeAnchor"/>
|
||||||
|
<xsd:element name="absSizeAnchor" type="CT_AbsSizeAnchor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Drawing">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
1085
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd
Normal file
1085
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:element name="lockedCanvas" type="a:CT_GvmlGroupShape"/>
|
||||||
|
</xsd:schema>
|
||||||
3081
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd
Normal file
3081
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:import schemaLocation="shared-relationshipReference.xsd"
|
||||||
|
namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:complexType name="CT_AnchorClientData">
|
||||||
|
<xsd:attribute name="fLocksWithSheet" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPrintsWithSheet" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textlink" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ConnectorNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Connector">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional" default=""/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicalObjectFrameNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicalObjectFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGraphicFramePr" type="CT_GraphicalObjectFrameNonVisual" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ObjectChoices">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_Rel"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Rel">
|
||||||
|
<xsd:attribute ref="r:id" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_ColID">
|
||||||
|
<xsd:restriction base="xsd:int">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RowID">
|
||||||
|
<xsd:restriction base="xsd:int">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Marker">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="col" type="ST_ColID"/>
|
||||||
|
<xsd:element name="colOff" type="a:ST_Coordinate"/>
|
||||||
|
<xsd:element name="row" type="ST_RowID"/>
|
||||||
|
<xsd:element name="rowOff" type="a:ST_Coordinate"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_EditAs">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="twoCell"/>
|
||||||
|
<xsd:enumeration value="oneCell"/>
|
||||||
|
<xsd:enumeration value="absolute"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_TwoCellAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="editAs" type="ST_EditAs" use="optional" default="twoCell"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OneCellAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AbsoluteAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="pos" type="a:CT_Point2D"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_Anchor">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="twoCellAnchor" type="CT_TwoCellAnchor"/>
|
||||||
|
<xsd:element name="oneCellAnchor" type="CT_OneCellAnchor"/>
|
||||||
|
<xsd:element name="absoluteAnchor" type="CT_AbsoluteAnchor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Drawing">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wsDr" type="CT_Drawing"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,287 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
xmlns:dpct="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:import schemaLocation="wml.xsd"
|
||||||
|
namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
schemaLocation="dml-picture.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
schemaLocation="shared-relationshipReference.xsd"/>
|
||||||
|
<xsd:complexType name="CT_EffectExtent">
|
||||||
|
<xsd:attribute name="l" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="t" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="r" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="b" type="a:ST_Coordinate" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_WrapDistance">
|
||||||
|
<xsd:restriction base="xsd:unsignedInt"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Inline">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
<xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_WrapText">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="bothSides"/>
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="largest"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_WrapPath">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="start" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="lineTo" type="a:CT_Point2D" minOccurs="2" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="edited" type="xsd:boolean" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapNone"/>
|
||||||
|
<xsd:complexType name="CT_WrapSquare">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapTight">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapThrough">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapTopBottom">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_WrapType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="wrapNone" type="CT_WrapNone" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapSquare" type="CT_WrapSquare" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapTight" type="CT_WrapTight" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapThrough" type="CT_WrapThrough" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapTopAndBottom" type="CT_WrapTopBottom" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_PositionOffset">
|
||||||
|
<xsd:restriction base="xsd:int"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlignH">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RelFromH">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="column"/>
|
||||||
|
<xsd:enumeration value="character"/>
|
||||||
|
<xsd:enumeration value="leftMargin"/>
|
||||||
|
<xsd:enumeration value="rightMargin"/>
|
||||||
|
<xsd:enumeration value="insideMargin"/>
|
||||||
|
<xsd:enumeration value="outsideMargin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_PosH">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="align" type="ST_AlignH" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="relativeFrom" type="ST_RelFromH" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_AlignV">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RelFromV">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="paragraph"/>
|
||||||
|
<xsd:enumeration value="line"/>
|
||||||
|
<xsd:enumeration value="topMargin"/>
|
||||||
|
<xsd:enumeration value="bottomMargin"/>
|
||||||
|
<xsd:enumeration value="insideMargin"/>
|
||||||
|
<xsd:enumeration value="outsideMargin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_PosV">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="align" type="ST_AlignV" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="relativeFrom" type="ST_RelFromV" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Anchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="simplePos" type="a:CT_Point2D"/>
|
||||||
|
<xsd:element name="positionH" type="CT_PosH"/>
|
||||||
|
<xsd:element name="positionV" type="CT_PosV"/>
|
||||||
|
<xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_WrapType"/>
|
||||||
|
<xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="simplePos" type="xsd:boolean"/>
|
||||||
|
<xsd:attribute name="relativeHeight" type="xsd:unsignedInt" use="required"/>
|
||||||
|
<xsd:attribute name="behindDoc" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="locked" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="layoutInCell" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="hidden" type="xsd:boolean" use="optional"/>
|
||||||
|
<xsd:attribute name="allowOverlap" type="xsd:boolean" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TxbxContent">
|
||||||
|
<xsd:group ref="w:EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TextboxInfo">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="txbxContent" type="CT_TxbxContent" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:unsignedShort" use="optional" default="0"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LinkedTextboxInformation">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:unsignedShort" use="required"/>
|
||||||
|
<xsd:attribute name="seq" type="xsd:unsignedShort" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingShape">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCnPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:element name="txbx" type="CT_TextboxInfo" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="linkedTxbx" type="CT_LinkedTextboxInformation" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="bodyPr" type="a:CT_TextBodyProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="normalEastAsianFlow" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvFrPr" type="a:CT_NonVisualGraphicFrameProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingContentPartNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvContentPartPr" type="a:CT_NonVisualContentPartProperties" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingContentPart">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvContentPartPr" type="CT_WordprocessingContentPartNonVisual" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="bwMode" type="a:ST_BlackWhiteMode" use="optional"/>
|
||||||
|
<xsd:attribute ref="r:id" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingGroup">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="wsp"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_WordprocessingGroup"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element ref="dpct:pic"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_WordprocessingContentPart"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingCanvas">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="bg" type="a:CT_BackgroundFormatting" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="whole" type="a:CT_WholeE2oFormatting" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="wsp"/>
|
||||||
|
<xsd:element ref="dpct:pic"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_WordprocessingContentPart"/>
|
||||||
|
<xsd:element ref="wgp"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wpc" type="CT_WordprocessingCanvas"/>
|
||||||
|
<xsd:element name="wgp" type="CT_WordprocessingGroup"/>
|
||||||
|
<xsd:element name="wsp" type="CT_WordprocessingShape"/>
|
||||||
|
<xsd:element name="inline" type="CT_Inline"/>
|
||||||
|
<xsd:element name="anchor" type="CT_Anchor"/>
|
||||||
|
</xsd:schema>
|
||||||
1676
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd
Normal file
1676
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/characteristics"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/characteristics"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:complexType name="CT_AdditionalCharacteristics">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="characteristic" type="CT_Characteristic" minOccurs="0"
|
||||||
|
maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Characteristic">
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="relation" type="ST_Relation" use="required"/>
|
||||||
|
<xsd:attribute name="val" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="vocabulary" type="xsd:anyURI" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Relation">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="ge"/>
|
||||||
|
<xsd:enumeration value="le"/>
|
||||||
|
<xsd:enumeration value="gt"/>
|
||||||
|
<xsd:enumeration value="lt"/>
|
||||||
|
<xsd:enumeration value="eq"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:element name="additionalCharacteristics" type="CT_AdditionalCharacteristics"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_SourceType">
|
||||||
|
<xsd:restriction base="s:ST_String">
|
||||||
|
<xsd:enumeration value="ArticleInAPeriodical"/>
|
||||||
|
<xsd:enumeration value="Book"/>
|
||||||
|
<xsd:enumeration value="BookSection"/>
|
||||||
|
<xsd:enumeration value="JournalArticle"/>
|
||||||
|
<xsd:enumeration value="ConferenceProceedings"/>
|
||||||
|
<xsd:enumeration value="Report"/>
|
||||||
|
<xsd:enumeration value="SoundRecording"/>
|
||||||
|
<xsd:enumeration value="Performance"/>
|
||||||
|
<xsd:enumeration value="Art"/>
|
||||||
|
<xsd:enumeration value="DocumentFromInternetSite"/>
|
||||||
|
<xsd:enumeration value="InternetSite"/>
|
||||||
|
<xsd:enumeration value="Film"/>
|
||||||
|
<xsd:enumeration value="Interview"/>
|
||||||
|
<xsd:enumeration value="Patent"/>
|
||||||
|
<xsd:enumeration value="ElectronicSource"/>
|
||||||
|
<xsd:enumeration value="Case"/>
|
||||||
|
<xsd:enumeration value="Misc"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_NameListType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Person" type="CT_PersonType" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PersonType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Last" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="First" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="Middle" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NameType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NameOrCorporateType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="Corporate" minOccurs="1" maxOccurs="1" type="s:ST_String"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AuthorType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="Artist" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Author" type="CT_NameOrCorporateType"/>
|
||||||
|
<xsd:element name="BookAuthor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Compiler" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Composer" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Conductor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Counsel" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Director" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Editor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Interviewee" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Interviewer" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Inventor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Performer" type="CT_NameOrCorporateType"/>
|
||||||
|
<xsd:element name="ProducerName" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Translator" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Writer" type="CT_NameType"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SourceType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="AbbreviatedCaseNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="AlbumTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Author" type="CT_AuthorType"/>
|
||||||
|
<xsd:element name="BookTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Broadcaster" type="s:ST_String"/>
|
||||||
|
<xsd:element name="BroadcastTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="CaseNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ChapterNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="City" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Comments" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ConferenceName" type="s:ST_String"/>
|
||||||
|
<xsd:element name="CountryRegion" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Court" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Day" type="s:ST_String"/>
|
||||||
|
<xsd:element name="DayAccessed" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Department" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Distributor" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Edition" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Guid" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Institution" type="s:ST_String"/>
|
||||||
|
<xsd:element name="InternetSiteTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Issue" type="s:ST_String"/>
|
||||||
|
<xsd:element name="JournalName" type="s:ST_String"/>
|
||||||
|
<xsd:element name="LCID" type="s:ST_Lang"/>
|
||||||
|
<xsd:element name="Medium" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Month" type="s:ST_String"/>
|
||||||
|
<xsd:element name="MonthAccessed" type="s:ST_String"/>
|
||||||
|
<xsd:element name="NumberVolumes" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Pages" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PatentNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PeriodicalTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ProductionCompany" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PublicationTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Publisher" type="s:ST_String"/>
|
||||||
|
<xsd:element name="RecordingNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="RefOrder" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Reporter" type="s:ST_String"/>
|
||||||
|
<xsd:element name="SourceType" type="ST_SourceType"/>
|
||||||
|
<xsd:element name="ShortTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="StandardNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="StateProvince" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Station" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Tag" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Theater" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ThesisType" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Title" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Type" type="s:ST_String"/>
|
||||||
|
<xsd:element name="URL" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Version" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Volume" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Year" type="s:ST_String"/>
|
||||||
|
<xsd:element name="YearAccessed" type="s:ST_String"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="Sources" type="CT_Sources"/>
|
||||||
|
<xsd:complexType name="CT_Sources">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Source" type="CT_SourceType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="SelectedStyle" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="StyleName" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="URI" type="s:ST_String"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:simpleType name="ST_Lang">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_HexColorRGB">
|
||||||
|
<xsd:restriction base="xsd:hexBinary">
|
||||||
|
<xsd:length value="3" fixed="true"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Panose">
|
||||||
|
<xsd:restriction base="xsd:hexBinary">
|
||||||
|
<xsd:length value="10"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CalendarType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="gregorian"/>
|
||||||
|
<xsd:enumeration value="gregorianUs"/>
|
||||||
|
<xsd:enumeration value="gregorianMeFrench"/>
|
||||||
|
<xsd:enumeration value="gregorianArabic"/>
|
||||||
|
<xsd:enumeration value="hijri"/>
|
||||||
|
<xsd:enumeration value="hebrew"/>
|
||||||
|
<xsd:enumeration value="taiwan"/>
|
||||||
|
<xsd:enumeration value="japan"/>
|
||||||
|
<xsd:enumeration value="thai"/>
|
||||||
|
<xsd:enumeration value="korea"/>
|
||||||
|
<xsd:enumeration value="saka"/>
|
||||||
|
<xsd:enumeration value="gregorianXlitEnglish"/>
|
||||||
|
<xsd:enumeration value="gregorianXlitFrench"/>
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlgClass">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="hash"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CryptProv">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="rsaAES"/>
|
||||||
|
<xsd:enumeration value="rsaFull"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlgType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="typeAny"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ColorType">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Guid">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:pattern value="\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OnOff">
|
||||||
|
<xsd:union memberTypes="xsd:boolean ST_OnOff1"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OnOff1">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="on"/>
|
||||||
|
<xsd:enumeration value="off"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_String">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_XmlName">
|
||||||
|
<xsd:restriction base="xsd:NCName">
|
||||||
|
<xsd:minLength value="1"/>
|
||||||
|
<xsd:maxLength value="255"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TrueFalse">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TrueFalseBlank">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
<xsd:enumeration value=""/>
|
||||||
|
<xsd:enumeration value="True"/>
|
||||||
|
<xsd:enumeration value="False"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_UnsignedDecimalNumber">
|
||||||
|
<xsd:restriction base="xsd:decimal">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TwipsMeasure">
|
||||||
|
<xsd:union memberTypes="ST_UnsignedDecimalNumber ST_PositiveUniversalMeasure"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_VerticalAlignRun">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="baseline"/>
|
||||||
|
<xsd:enumeration value="superscript"/>
|
||||||
|
<xsd:enumeration value="subscript"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Xstring">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_XAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_YAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="inline"/>
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ConformanceClass">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="strict"/>
|
||||||
|
<xsd:enumeration value="transitional"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_UniversalMeasure">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="-?[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositiveUniversalMeasure">
|
||||||
|
<xsd:restriction base="ST_UniversalMeasure">
|
||||||
|
<xsd:pattern value="[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Percentage">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="-?[0-9]+(\.[0-9]+)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_FixedPercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="-?((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositivePercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="[0-9]+(\.[0-9]+)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositiveFixedPercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/customXml"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/customXml"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:complexType name="CT_DatastoreSchemaRef">
|
||||||
|
<xsd:attribute name="uri" type="xsd:string" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DatastoreSchemaRefs">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="schemaRef" type="CT_DatastoreSchemaRef" minOccurs="0" maxOccurs="unbounded"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DatastoreItem">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="schemaRefs" type="CT_DatastoreSchemaRefs" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="itemID" type="s:ST_Guid" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="datastoreItem" type="CT_DatastoreItem"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/schemaLibrary/2006/main"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/schemaLibrary/2006/main"
|
||||||
|
attributeFormDefault="qualified" elementFormDefault="qualified">
|
||||||
|
<xsd:complexType name="CT_Schema">
|
||||||
|
<xsd:attribute name="uri" type="xsd:string" default=""/>
|
||||||
|
<xsd:attribute name="manifestLocation" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="schemaLocation" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="schemaLanguage" type="xsd:token"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SchemaLibrary">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="schema" type="CT_Schema" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="schemaLibrary" type="CT_SchemaLibrary"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
|
||||||
|
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
|
||||||
|
blockDefault="#all" elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
schemaLocation="shared-documentPropertiesVariantTypes.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:element name="Properties" type="CT_Properties"/>
|
||||||
|
<xsd:complexType name="CT_Properties">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="property" minOccurs="0" maxOccurs="unbounded" type="CT_Property"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Property">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:vector"/>
|
||||||
|
<xsd:element ref="vt:array"/>
|
||||||
|
<xsd:element ref="vt:blob"/>
|
||||||
|
<xsd:element ref="vt:oblob"/>
|
||||||
|
<xsd:element ref="vt:empty"/>
|
||||||
|
<xsd:element ref="vt:null"/>
|
||||||
|
<xsd:element ref="vt:i1"/>
|
||||||
|
<xsd:element ref="vt:i2"/>
|
||||||
|
<xsd:element ref="vt:i4"/>
|
||||||
|
<xsd:element ref="vt:i8"/>
|
||||||
|
<xsd:element ref="vt:int"/>
|
||||||
|
<xsd:element ref="vt:ui1"/>
|
||||||
|
<xsd:element ref="vt:ui2"/>
|
||||||
|
<xsd:element ref="vt:ui4"/>
|
||||||
|
<xsd:element ref="vt:ui8"/>
|
||||||
|
<xsd:element ref="vt:uint"/>
|
||||||
|
<xsd:element ref="vt:r4"/>
|
||||||
|
<xsd:element ref="vt:r8"/>
|
||||||
|
<xsd:element ref="vt:decimal"/>
|
||||||
|
<xsd:element ref="vt:lpstr"/>
|
||||||
|
<xsd:element ref="vt:lpwstr"/>
|
||||||
|
<xsd:element ref="vt:bstr"/>
|
||||||
|
<xsd:element ref="vt:date"/>
|
||||||
|
<xsd:element ref="vt:filetime"/>
|
||||||
|
<xsd:element ref="vt:bool"/>
|
||||||
|
<xsd:element ref="vt:cy"/>
|
||||||
|
<xsd:element ref="vt:error"/>
|
||||||
|
<xsd:element ref="vt:stream"/>
|
||||||
|
<xsd:element ref="vt:ostream"/>
|
||||||
|
<xsd:element ref="vt:storage"/>
|
||||||
|
<xsd:element ref="vt:ostorage"/>
|
||||||
|
<xsd:element ref="vt:vstream"/>
|
||||||
|
<xsd:element ref="vt:clsid"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="fmtid" use="required" type="s:ST_Guid"/>
|
||||||
|
<xsd:attribute name="pid" use="required" type="xsd:int"/>
|
||||||
|
<xsd:attribute name="name" use="optional" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="linkTarget" use="optional" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||||
|
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||||
|
elementFormDefault="qualified" blockDefault="#all">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
schemaLocation="shared-documentPropertiesVariantTypes.xsd"/>
|
||||||
|
<xsd:element name="Properties" type="CT_Properties"/>
|
||||||
|
<xsd:complexType name="CT_Properties">
|
||||||
|
<xsd:all>
|
||||||
|
<xsd:element name="Template" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Manager" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Company" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Pages" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Words" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Characters" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="PresentationFormat" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Lines" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Paragraphs" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Slides" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Notes" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="TotalTime" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="HiddenSlides" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="MMClips" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="ScaleCrop" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="HeadingPairs" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/>
|
||||||
|
<xsd:element name="TitlesOfParts" minOccurs="0" maxOccurs="1" type="CT_VectorLpstr"/>
|
||||||
|
<xsd:element name="LinksUpToDate" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="CharactersWithSpaces" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="SharedDoc" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="HyperlinkBase" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="HLinks" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/>
|
||||||
|
<xsd:element name="HyperlinksChanged" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="DigSig" minOccurs="0" maxOccurs="1" type="CT_DigSigBlob"/>
|
||||||
|
<xsd:element name="Application" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="AppVersion" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="DocSecurity" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
</xsd:all>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_VectorVariant">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:vector"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_VectorLpstr">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:vector"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DigSigBlob">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:blob"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
blockDefault="#all" elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_VectorBaseType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="variant"/>
|
||||||
|
<xsd:enumeration value="i1"/>
|
||||||
|
<xsd:enumeration value="i2"/>
|
||||||
|
<xsd:enumeration value="i4"/>
|
||||||
|
<xsd:enumeration value="i8"/>
|
||||||
|
<xsd:enumeration value="ui1"/>
|
||||||
|
<xsd:enumeration value="ui2"/>
|
||||||
|
<xsd:enumeration value="ui4"/>
|
||||||
|
<xsd:enumeration value="ui8"/>
|
||||||
|
<xsd:enumeration value="r4"/>
|
||||||
|
<xsd:enumeration value="r8"/>
|
||||||
|
<xsd:enumeration value="lpstr"/>
|
||||||
|
<xsd:enumeration value="lpwstr"/>
|
||||||
|
<xsd:enumeration value="bstr"/>
|
||||||
|
<xsd:enumeration value="date"/>
|
||||||
|
<xsd:enumeration value="filetime"/>
|
||||||
|
<xsd:enumeration value="bool"/>
|
||||||
|
<xsd:enumeration value="cy"/>
|
||||||
|
<xsd:enumeration value="error"/>
|
||||||
|
<xsd:enumeration value="clsid"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ArrayBaseType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="variant"/>
|
||||||
|
<xsd:enumeration value="i1"/>
|
||||||
|
<xsd:enumeration value="i2"/>
|
||||||
|
<xsd:enumeration value="i4"/>
|
||||||
|
<xsd:enumeration value="int"/>
|
||||||
|
<xsd:enumeration value="ui1"/>
|
||||||
|
<xsd:enumeration value="ui2"/>
|
||||||
|
<xsd:enumeration value="ui4"/>
|
||||||
|
<xsd:enumeration value="uint"/>
|
||||||
|
<xsd:enumeration value="r4"/>
|
||||||
|
<xsd:enumeration value="r8"/>
|
||||||
|
<xsd:enumeration value="decimal"/>
|
||||||
|
<xsd:enumeration value="bstr"/>
|
||||||
|
<xsd:enumeration value="date"/>
|
||||||
|
<xsd:enumeration value="bool"/>
|
||||||
|
<xsd:enumeration value="cy"/>
|
||||||
|
<xsd:enumeration value="error"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Cy">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="\s*[0-9]*\.[0-9]{4}\s*"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Error">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="\s*0x[0-9A-Za-z]{8}\s*"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Empty"/>
|
||||||
|
<xsd:complexType name="CT_Null"/>
|
||||||
|
<xsd:complexType name="CT_Vector">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="variant"/>
|
||||||
|
<xsd:element ref="i1"/>
|
||||||
|
<xsd:element ref="i2"/>
|
||||||
|
<xsd:element ref="i4"/>
|
||||||
|
<xsd:element ref="i8"/>
|
||||||
|
<xsd:element ref="ui1"/>
|
||||||
|
<xsd:element ref="ui2"/>
|
||||||
|
<xsd:element ref="ui4"/>
|
||||||
|
<xsd:element ref="ui8"/>
|
||||||
|
<xsd:element ref="r4"/>
|
||||||
|
<xsd:element ref="r8"/>
|
||||||
|
<xsd:element ref="lpstr"/>
|
||||||
|
<xsd:element ref="lpwstr"/>
|
||||||
|
<xsd:element ref="bstr"/>
|
||||||
|
<xsd:element ref="date"/>
|
||||||
|
<xsd:element ref="filetime"/>
|
||||||
|
<xsd:element ref="bool"/>
|
||||||
|
<xsd:element ref="cy"/>
|
||||||
|
<xsd:element ref="error"/>
|
||||||
|
<xsd:element ref="clsid"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="baseType" type="ST_VectorBaseType" use="required"/>
|
||||||
|
<xsd:attribute name="size" type="xsd:unsignedInt" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Array">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="variant"/>
|
||||||
|
<xsd:element ref="i1"/>
|
||||||
|
<xsd:element ref="i2"/>
|
||||||
|
<xsd:element ref="i4"/>
|
||||||
|
<xsd:element ref="int"/>
|
||||||
|
<xsd:element ref="ui1"/>
|
||||||
|
<xsd:element ref="ui2"/>
|
||||||
|
<xsd:element ref="ui4"/>
|
||||||
|
<xsd:element ref="uint"/>
|
||||||
|
<xsd:element ref="r4"/>
|
||||||
|
<xsd:element ref="r8"/>
|
||||||
|
<xsd:element ref="decimal"/>
|
||||||
|
<xsd:element ref="bstr"/>
|
||||||
|
<xsd:element ref="date"/>
|
||||||
|
<xsd:element ref="bool"/>
|
||||||
|
<xsd:element ref="error"/>
|
||||||
|
<xsd:element ref="cy"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="lBounds" type="xsd:int" use="required"/>
|
||||||
|
<xsd:attribute name="uBounds" type="xsd:int" use="required"/>
|
||||||
|
<xsd:attribute name="baseType" type="ST_ArrayBaseType" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Variant">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="variant"/>
|
||||||
|
<xsd:element ref="vector"/>
|
||||||
|
<xsd:element ref="array"/>
|
||||||
|
<xsd:element ref="blob"/>
|
||||||
|
<xsd:element ref="oblob"/>
|
||||||
|
<xsd:element ref="empty"/>
|
||||||
|
<xsd:element ref="null"/>
|
||||||
|
<xsd:element ref="i1"/>
|
||||||
|
<xsd:element ref="i2"/>
|
||||||
|
<xsd:element ref="i4"/>
|
||||||
|
<xsd:element ref="i8"/>
|
||||||
|
<xsd:element ref="int"/>
|
||||||
|
<xsd:element ref="ui1"/>
|
||||||
|
<xsd:element ref="ui2"/>
|
||||||
|
<xsd:element ref="ui4"/>
|
||||||
|
<xsd:element ref="ui8"/>
|
||||||
|
<xsd:element ref="uint"/>
|
||||||
|
<xsd:element ref="r4"/>
|
||||||
|
<xsd:element ref="r8"/>
|
||||||
|
<xsd:element ref="decimal"/>
|
||||||
|
<xsd:element ref="lpstr"/>
|
||||||
|
<xsd:element ref="lpwstr"/>
|
||||||
|
<xsd:element ref="bstr"/>
|
||||||
|
<xsd:element ref="date"/>
|
||||||
|
<xsd:element ref="filetime"/>
|
||||||
|
<xsd:element ref="bool"/>
|
||||||
|
<xsd:element ref="cy"/>
|
||||||
|
<xsd:element ref="error"/>
|
||||||
|
<xsd:element ref="stream"/>
|
||||||
|
<xsd:element ref="ostream"/>
|
||||||
|
<xsd:element ref="storage"/>
|
||||||
|
<xsd:element ref="ostorage"/>
|
||||||
|
<xsd:element ref="vstream"/>
|
||||||
|
<xsd:element ref="clsid"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Vstream">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="xsd:base64Binary">
|
||||||
|
<xsd:attribute name="version" type="s:ST_Guid"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="variant" type="CT_Variant"/>
|
||||||
|
<xsd:element name="vector" type="CT_Vector"/>
|
||||||
|
<xsd:element name="array" type="CT_Array"/>
|
||||||
|
<xsd:element name="blob" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="oblob" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="empty" type="CT_Empty"/>
|
||||||
|
<xsd:element name="null" type="CT_Null"/>
|
||||||
|
<xsd:element name="i1" type="xsd:byte"/>
|
||||||
|
<xsd:element name="i2" type="xsd:short"/>
|
||||||
|
<xsd:element name="i4" type="xsd:int"/>
|
||||||
|
<xsd:element name="i8" type="xsd:long"/>
|
||||||
|
<xsd:element name="int" type="xsd:int"/>
|
||||||
|
<xsd:element name="ui1" type="xsd:unsignedByte"/>
|
||||||
|
<xsd:element name="ui2" type="xsd:unsignedShort"/>
|
||||||
|
<xsd:element name="ui4" type="xsd:unsignedInt"/>
|
||||||
|
<xsd:element name="ui8" type="xsd:unsignedLong"/>
|
||||||
|
<xsd:element name="uint" type="xsd:unsignedInt"/>
|
||||||
|
<xsd:element name="r4" type="xsd:float"/>
|
||||||
|
<xsd:element name="r8" type="xsd:double"/>
|
||||||
|
<xsd:element name="decimal" type="xsd:decimal"/>
|
||||||
|
<xsd:element name="lpstr" type="xsd:string"/>
|
||||||
|
<xsd:element name="lpwstr" type="xsd:string"/>
|
||||||
|
<xsd:element name="bstr" type="xsd:string"/>
|
||||||
|
<xsd:element name="date" type="xsd:dateTime"/>
|
||||||
|
<xsd:element name="filetime" type="xsd:dateTime"/>
|
||||||
|
<xsd:element name="bool" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="cy" type="ST_Cy"/>
|
||||||
|
<xsd:element name="error" type="ST_Error"/>
|
||||||
|
<xsd:element name="stream" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="ostream" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="storage" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="ostorage" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="vstream" type="CT_Vstream"/>
|
||||||
|
<xsd:element name="clsid" type="s:ST_Guid"/>
|
||||||
|
</xsd:schema>
|
||||||
582
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd
Normal file
582
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
||||||
|
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/math">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
schemaLocation="wml.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_Integer255">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:minInclusive value="1"/>
|
||||||
|
<xsd:maxInclusive value="255"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Integer255">
|
||||||
|
<xsd:attribute name="val" type="ST_Integer255" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Integer2">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:minInclusive value="-2"/>
|
||||||
|
<xsd:maxInclusive value="2"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Integer2">
|
||||||
|
<xsd:attribute name="val" type="ST_Integer2" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_SpacingRule">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
<xsd:maxInclusive value="4"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_SpacingRule">
|
||||||
|
<xsd:attribute name="val" type="ST_SpacingRule" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_UnSignedInteger">
|
||||||
|
<xsd:restriction base="xsd:unsignedInt"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_UnSignedInteger">
|
||||||
|
<xsd:attribute name="val" type="ST_UnSignedInteger" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Char">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:maxLength value="1"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Char">
|
||||||
|
<xsd:attribute name="val" type="ST_Char" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OnOff">
|
||||||
|
<xsd:attribute name="val" type="s:ST_OnOff"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_String">
|
||||||
|
<xsd:attribute name="val" type="s:ST_String"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_XAlign">
|
||||||
|
<xsd:attribute name="val" type="s:ST_XAlign" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_YAlign">
|
||||||
|
<xsd:attribute name="val" type="s:ST_YAlign" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Shp">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="centered"/>
|
||||||
|
<xsd:enumeration value="match"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Shp">
|
||||||
|
<xsd:attribute name="val" type="ST_Shp" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_FType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="bar"/>
|
||||||
|
<xsd:enumeration value="skw"/>
|
||||||
|
<xsd:enumeration value="lin"/>
|
||||||
|
<xsd:enumeration value="noBar"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_FType">
|
||||||
|
<xsd:attribute name="val" type="ST_FType" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_LimLoc">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="undOvr"/>
|
||||||
|
<xsd:enumeration value="subSup"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_LimLoc">
|
||||||
|
<xsd:attribute name="val" type="ST_LimLoc" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_TopBot">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="bot"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_TopBot">
|
||||||
|
<xsd:attribute name="val" type="ST_TopBot" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Script">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="roman"/>
|
||||||
|
<xsd:enumeration value="script"/>
|
||||||
|
<xsd:enumeration value="fraktur"/>
|
||||||
|
<xsd:enumeration value="double-struck"/>
|
||||||
|
<xsd:enumeration value="sans-serif"/>
|
||||||
|
<xsd:enumeration value="monospace"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Script">
|
||||||
|
<xsd:attribute name="val" type="ST_Script"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Style">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="p"/>
|
||||||
|
<xsd:enumeration value="b"/>
|
||||||
|
<xsd:enumeration value="i"/>
|
||||||
|
<xsd:enumeration value="bi"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Style">
|
||||||
|
<xsd:attribute name="val" type="ST_Style"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ManualBreak">
|
||||||
|
<xsd:attribute name="alnAt" type="ST_Integer255"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ScriptStyle">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="scr" minOccurs="0" type="CT_Script"/>
|
||||||
|
<xsd:element name="sty" minOccurs="0" type="CT_Style"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_RPR">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="lit" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="nor" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ScriptStyle"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="brk" minOccurs="0" type="CT_ManualBreak"/>
|
||||||
|
<xsd:element name="aln" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Text">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="s:ST_String">
|
||||||
|
<xsd:attribute ref="xml:space" use="optional"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_R">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="rPr" type="CT_RPR" minOccurs="0"/>
|
||||||
|
<xsd:group ref="w:EG_RPr" minOccurs="0"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="w:EG_RunInnerContent"/>
|
||||||
|
<xsd:element name="t" type="CT_Text" minOccurs="0"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_CtrlPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="w:EG_RPrMath" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AccPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Acc">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="accPr" type="CT_AccPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BarPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="pos" type="CT_TopBot" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Bar">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="barPr" type="CT_BarPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BoxPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="opEmu" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="noBreak" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="diff" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="brk" type="CT_ManualBreak" minOccurs="0"/>
|
||||||
|
<xsd:element name="aln" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Box">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="boxPr" type="CT_BoxPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BorderBoxPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="hideTop" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="hideBot" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="hideLeft" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="hideRight" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeH" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeV" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeBLTR" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeTLBR" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BorderBox">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="borderBoxPr" type="CT_BorderBoxPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="begChr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="sepChr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="endChr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="grow" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="shp" type="CT_Shp" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_D">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="dPr" type="CT_DPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_EqArrPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/>
|
||||||
|
<xsd:element name="maxDist" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="objDist" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_EqArr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="eqArrPr" type="CT_EqArrPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_FPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="type" type="CT_FType" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_F">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="fPr" type="CT_FPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="num" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="den" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_FuncPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Func">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="funcPr" type="CT_FuncPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="fName" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupChrPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="pos" type="CT_TopBot" minOccurs="0"/>
|
||||||
|
<xsd:element name="vertJc" type="CT_TopBot" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupChr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="groupChrPr" type="CT_GroupChrPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimLowPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimLow">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="limLowPr" type="CT_LimLowPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="lim" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimUppPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimUpp">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="limUppPr" type="CT_LimUppPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="lim" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MCPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="count" type="CT_Integer255" minOccurs="0"/>
|
||||||
|
<xsd:element name="mcJc" type="CT_XAlign" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MC">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mcPr" type="CT_MCPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MCS">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mc" type="CT_MC" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/>
|
||||||
|
<xsd:element name="plcHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||||
|
<xsd:element name="cGpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="cSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="cGp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="mcs" type="CT_MCS" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MR">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_M">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mPr" type="CT_MPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="mr" type="CT_MR" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NaryPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="limLoc" type="CT_LimLoc" minOccurs="0"/>
|
||||||
|
<xsd:element name="grow" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="subHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="supHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Nary">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="naryPr" type="CT_NaryPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PhantPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="show" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="zeroWid" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="zeroAsc" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="zeroDesc" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="transp" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Phant">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="phantPr" type="CT_PhantPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RadPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="degHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Rad">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="radPr" type="CT_RadPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="deg" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SPrePr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SPre">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sPrePr" type="CT_SPrePr" minOccurs="0"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSubPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSub">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sSubPr" type="CT_SSubPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSubSupPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="alnScr" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSubSup">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sSubSupPr" type="CT_SSubSupPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSupPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSup">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sSupPr" type="CT_SSupPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_OMathMathElements">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="acc" type="CT_Acc"/>
|
||||||
|
<xsd:element name="bar" type="CT_Bar"/>
|
||||||
|
<xsd:element name="box" type="CT_Box"/>
|
||||||
|
<xsd:element name="borderBox" type="CT_BorderBox"/>
|
||||||
|
<xsd:element name="d" type="CT_D"/>
|
||||||
|
<xsd:element name="eqArr" type="CT_EqArr"/>
|
||||||
|
<xsd:element name="f" type="CT_F"/>
|
||||||
|
<xsd:element name="func" type="CT_Func"/>
|
||||||
|
<xsd:element name="groupChr" type="CT_GroupChr"/>
|
||||||
|
<xsd:element name="limLow" type="CT_LimLow"/>
|
||||||
|
<xsd:element name="limUpp" type="CT_LimUpp"/>
|
||||||
|
<xsd:element name="m" type="CT_M"/>
|
||||||
|
<xsd:element name="nary" type="CT_Nary"/>
|
||||||
|
<xsd:element name="phant" type="CT_Phant"/>
|
||||||
|
<xsd:element name="rad" type="CT_Rad"/>
|
||||||
|
<xsd:element name="sPre" type="CT_SPre"/>
|
||||||
|
<xsd:element name="sSub" type="CT_SSub"/>
|
||||||
|
<xsd:element name="sSubSup" type="CT_SSubSup"/>
|
||||||
|
<xsd:element name="sSup" type="CT_SSup"/>
|
||||||
|
<xsd:element name="r" type="CT_R"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:group name="EG_OMathElements">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:group ref="EG_OMathMathElements"/>
|
||||||
|
<xsd:group ref="w:EG_PContentMath"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_OMathArgPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="argSz" type="CT_Integer2" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OMathArg">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="argPr" type="CT_OMathArgPr" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Jc">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="centerGroup"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_OMathJc">
|
||||||
|
<xsd:attribute name="val" type="ST_Jc"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OMathParaPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="jc" type="CT_OMathJc" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TwipsMeasure">
|
||||||
|
<xsd:attribute name="val" type="s:ST_TwipsMeasure" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_BreakBin">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="before"/>
|
||||||
|
<xsd:enumeration value="after"/>
|
||||||
|
<xsd:enumeration value="repeat"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_BreakBin">
|
||||||
|
<xsd:attribute name="val" type="ST_BreakBin"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_BreakBinSub">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="--"/>
|
||||||
|
<xsd:enumeration value="-+"/>
|
||||||
|
<xsd:enumeration value="+-"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_BreakBinSub">
|
||||||
|
<xsd:attribute name="val" type="ST_BreakBinSub"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MathPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mathFont" type="CT_String" minOccurs="0"/>
|
||||||
|
<xsd:element name="brkBin" type="CT_BreakBin" minOccurs="0"/>
|
||||||
|
<xsd:element name="brkBinSub" type="CT_BreakBinSub" minOccurs="0"/>
|
||||||
|
<xsd:element name="smallFrac" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="dispDef" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="lMargin" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="rMargin" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="defJc" type="CT_OMathJc" minOccurs="0"/>
|
||||||
|
<xsd:element name="preSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="postSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="interSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="intraSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:choice minOccurs="0">
|
||||||
|
<xsd:element name="wrapIndent" type="CT_TwipsMeasure"/>
|
||||||
|
<xsd:element name="wrapRight" type="CT_OnOff"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="intLim" type="CT_LimLoc" minOccurs="0"/>
|
||||||
|
<xsd:element name="naryLim" type="CT_LimLoc" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="mathPr" type="CT_MathPr"/>
|
||||||
|
<xsd:complexType name="CT_OMathPara">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="oMathParaPr" type="CT_OMathParaPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="oMath" type="CT_OMath" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OMath">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="oMathPara" type="CT_OMathPara"/>
|
||||||
|
<xsd:element name="oMath" type="CT_OMath"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
blockDefault="#all">
|
||||||
|
<xsd:simpleType name="ST_RelationshipId">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:attribute name="id" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="embed" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="link" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="dm" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="lo" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="qs" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="cs" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="blip" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="pict" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="href" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="topLeft" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="topRight" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="bottomLeft" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="bottomRight" type="ST_RelationshipId"/>
|
||||||
|
</xsd:schema>
|
||||||
4439
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd
Normal file
4439
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd
Normal file
File diff suppressed because it is too large
Load Diff
570
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd
Normal file
570
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd
Normal file
@@ -0,0 +1,570 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:vml"
|
||||||
|
xmlns:pvml="urn:schemas-microsoft-com:office:powerpoint"
|
||||||
|
xmlns:o="urn:schemas-microsoft-com:office:office"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
xmlns:w10="urn:schemas-microsoft-com:office:word"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns:x="urn:schemas-microsoft-com:office:excel"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="urn:schemas-microsoft-com:vml" elementFormDefault="qualified"
|
||||||
|
attributeFormDefault="unqualified">
|
||||||
|
<xsd:import namespace="urn:schemas-microsoft-com:office:office"
|
||||||
|
schemaLocation="vml-officeDrawing.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
schemaLocation="wml.xsd"/>
|
||||||
|
<xsd:import namespace="urn:schemas-microsoft-com:office:word"
|
||||||
|
schemaLocation="vml-wordprocessingDrawing.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
schemaLocation="shared-relationshipReference.xsd"/>
|
||||||
|
<xsd:import namespace="urn:schemas-microsoft-com:office:excel"
|
||||||
|
schemaLocation="vml-spreadsheetDrawing.xsd"/>
|
||||||
|
<xsd:import namespace="urn:schemas-microsoft-com:office:powerpoint"
|
||||||
|
schemaLocation="vml-presentationDrawing.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:attributeGroup name="AG_Id">
|
||||||
|
<xsd:attribute name="id" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Style">
|
||||||
|
<xsd:attribute name="style" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Type">
|
||||||
|
<xsd:attribute name="type" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Adj">
|
||||||
|
<xsd:attribute name="adj" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Path">
|
||||||
|
<xsd:attribute name="path" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Fill">
|
||||||
|
<xsd:attribute name="filled" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="fillcolor" type="s:ST_ColorType" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Chromakey">
|
||||||
|
<xsd:attribute name="chromakey" type="s:ST_ColorType" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_Ext">
|
||||||
|
<xsd:attribute name="ext" form="qualified" type="ST_Ext"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_CoreAttributes">
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Style"/>
|
||||||
|
<xsd:attribute name="href" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="target" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="class" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="title" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="alt" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="coordsize" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="coordorigin" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="wrapcoords" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="print" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_ShapeAttributes">
|
||||||
|
<xsd:attributeGroup ref="AG_Chromakey"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Fill"/>
|
||||||
|
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="stroked" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="strokecolor" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="strokeweight" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_OfficeCoreAttributes">
|
||||||
|
<xsd:attribute ref="o:spid"/>
|
||||||
|
<xsd:attribute ref="o:oned"/>
|
||||||
|
<xsd:attribute ref="o:regroupid"/>
|
||||||
|
<xsd:attribute ref="o:doubleclicknotify"/>
|
||||||
|
<xsd:attribute ref="o:button"/>
|
||||||
|
<xsd:attribute ref="o:userhidden"/>
|
||||||
|
<xsd:attribute ref="o:bullet"/>
|
||||||
|
<xsd:attribute ref="o:hr"/>
|
||||||
|
<xsd:attribute ref="o:hrstd"/>
|
||||||
|
<xsd:attribute ref="o:hrnoshade"/>
|
||||||
|
<xsd:attribute ref="o:hrpct"/>
|
||||||
|
<xsd:attribute ref="o:hralign"/>
|
||||||
|
<xsd:attribute ref="o:allowincell"/>
|
||||||
|
<xsd:attribute ref="o:allowoverlap"/>
|
||||||
|
<xsd:attribute ref="o:userdrawn"/>
|
||||||
|
<xsd:attribute ref="o:bordertopcolor"/>
|
||||||
|
<xsd:attribute ref="o:borderleftcolor"/>
|
||||||
|
<xsd:attribute ref="o:borderbottomcolor"/>
|
||||||
|
<xsd:attribute ref="o:borderrightcolor"/>
|
||||||
|
<xsd:attribute ref="o:dgmlayout"/>
|
||||||
|
<xsd:attribute ref="o:dgmnodekind"/>
|
||||||
|
<xsd:attribute ref="o:dgmlayoutmru"/>
|
||||||
|
<xsd:attribute ref="o:insetmode"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_OfficeShapeAttributes">
|
||||||
|
<xsd:attribute ref="o:spt"/>
|
||||||
|
<xsd:attribute ref="o:connectortype"/>
|
||||||
|
<xsd:attribute ref="o:bwmode"/>
|
||||||
|
<xsd:attribute ref="o:bwpure"/>
|
||||||
|
<xsd:attribute ref="o:bwnormal"/>
|
||||||
|
<xsd:attribute ref="o:forcedash"/>
|
||||||
|
<xsd:attribute ref="o:oleicon"/>
|
||||||
|
<xsd:attribute ref="o:ole"/>
|
||||||
|
<xsd:attribute ref="o:preferrelative"/>
|
||||||
|
<xsd:attribute ref="o:cliptowrap"/>
|
||||||
|
<xsd:attribute ref="o:clip"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_AllCoreAttributes">
|
||||||
|
<xsd:attributeGroup ref="AG_CoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_OfficeCoreAttributes"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_AllShapeAttributes">
|
||||||
|
<xsd:attributeGroup ref="AG_ShapeAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_OfficeShapeAttributes"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_ImageAttributes">
|
||||||
|
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="cropleft" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="croptop" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="cropright" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="cropbottom" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="gain" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="blacklevel" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="gamma" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="grayscale" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="bilevel" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attributeGroup name="AG_StrokeAttributes">
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="weight" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="linestyle" type="ST_StrokeLineStyle" use="optional"/>
|
||||||
|
<xsd:attribute name="miterlimit" type="xsd:decimal" use="optional"/>
|
||||||
|
<xsd:attribute name="joinstyle" type="ST_StrokeJoinStyle" use="optional"/>
|
||||||
|
<xsd:attribute name="endcap" type="ST_StrokeEndCap" use="optional"/>
|
||||||
|
<xsd:attribute name="dashstyle" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="filltype" type="ST_FillType" use="optional"/>
|
||||||
|
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="imageaspect" type="ST_ImageAspect" use="optional"/>
|
||||||
|
<xsd:attribute name="imagesize" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="imagealignshape" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="startarrow" type="ST_StrokeArrowType" use="optional"/>
|
||||||
|
<xsd:attribute name="startarrowwidth" type="ST_StrokeArrowWidth" use="optional"/>
|
||||||
|
<xsd:attribute name="startarrowlength" type="ST_StrokeArrowLength" use="optional"/>
|
||||||
|
<xsd:attribute name="endarrow" type="ST_StrokeArrowType" use="optional"/>
|
||||||
|
<xsd:attribute name="endarrowwidth" type="ST_StrokeArrowWidth" use="optional"/>
|
||||||
|
<xsd:attribute name="endarrowlength" type="ST_StrokeArrowLength" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:href"/>
|
||||||
|
<xsd:attribute ref="o:althref"/>
|
||||||
|
<xsd:attribute ref="o:title"/>
|
||||||
|
<xsd:attribute ref="o:forcedash"/>
|
||||||
|
<xsd:attribute ref="r:id" use="optional"/>
|
||||||
|
<xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:relid"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:group name="EG_ShapeElements">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element ref="path"/>
|
||||||
|
<xsd:element ref="formulas"/>
|
||||||
|
<xsd:element ref="handles"/>
|
||||||
|
<xsd:element ref="fill"/>
|
||||||
|
<xsd:element ref="stroke"/>
|
||||||
|
<xsd:element ref="shadow"/>
|
||||||
|
<xsd:element ref="textbox"/>
|
||||||
|
<xsd:element ref="textpath"/>
|
||||||
|
<xsd:element ref="imagedata"/>
|
||||||
|
<xsd:element ref="o:skew"/>
|
||||||
|
<xsd:element ref="o:extrusion"/>
|
||||||
|
<xsd:element ref="o:callout"/>
|
||||||
|
<xsd:element ref="o:lock"/>
|
||||||
|
<xsd:element ref="o:clippath"/>
|
||||||
|
<xsd:element ref="o:signatureline"/>
|
||||||
|
<xsd:element ref="w10:wrap"/>
|
||||||
|
<xsd:element ref="w10:anchorlock"/>
|
||||||
|
<xsd:element ref="w10:bordertop"/>
|
||||||
|
<xsd:element ref="w10:borderbottom"/>
|
||||||
|
<xsd:element ref="w10:borderleft"/>
|
||||||
|
<xsd:element ref="w10:borderright"/>
|
||||||
|
<xsd:element ref="x:ClientData" minOccurs="0"/>
|
||||||
|
<xsd:element ref="pvml:textdata" minOccurs="0"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:element name="shape" type="CT_Shape"/>
|
||||||
|
<xsd:element name="shapetype" type="CT_Shapetype"/>
|
||||||
|
<xsd:element name="group" type="CT_Group"/>
|
||||||
|
<xsd:element name="background" type="CT_Background"/>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="EG_ShapeElements"/>
|
||||||
|
<xsd:element ref="o:ink"/>
|
||||||
|
<xsd:element ref="pvml:iscomment"/>
|
||||||
|
<xsd:element ref="o:equationxml"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Type"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Adj"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Path"/>
|
||||||
|
<xsd:attribute ref="o:gfxdata"/>
|
||||||
|
<xsd:attribute name="equationxml" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shapetype">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element ref="o:complex" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Adj"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Path"/>
|
||||||
|
<xsd:attribute ref="o:master"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Group">
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="EG_ShapeElements"/>
|
||||||
|
<xsd:element ref="group"/>
|
||||||
|
<xsd:element ref="shape"/>
|
||||||
|
<xsd:element ref="shapetype"/>
|
||||||
|
<xsd:element ref="arc"/>
|
||||||
|
<xsd:element ref="curve"/>
|
||||||
|
<xsd:element ref="image"/>
|
||||||
|
<xsd:element ref="line"/>
|
||||||
|
<xsd:element ref="oval"/>
|
||||||
|
<xsd:element ref="polyline"/>
|
||||||
|
<xsd:element ref="rect"/>
|
||||||
|
<xsd:element ref="roundrect"/>
|
||||||
|
<xsd:element ref="o:diagram"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Fill"/>
|
||||||
|
<xsd:attribute name="editas" type="ST_EditAs" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:tableproperties"/>
|
||||||
|
<xsd:attribute ref="o:tablelimits"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Background">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element ref="fill" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Fill"/>
|
||||||
|
<xsd:attribute ref="o:bwmode"/>
|
||||||
|
<xsd:attribute ref="o:bwpure"/>
|
||||||
|
<xsd:attribute ref="o:bwnormal"/>
|
||||||
|
<xsd:attribute ref="o:targetscreensize"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="fill" type="CT_Fill"/>
|
||||||
|
<xsd:element name="formulas" type="CT_Formulas"/>
|
||||||
|
<xsd:element name="handles" type="CT_Handles"/>
|
||||||
|
<xsd:element name="imagedata" type="CT_ImageData"/>
|
||||||
|
<xsd:element name="path" type="CT_Path"/>
|
||||||
|
<xsd:element name="textbox" type="CT_Textbox"/>
|
||||||
|
<xsd:element name="shadow" type="CT_Shadow"/>
|
||||||
|
<xsd:element name="stroke" type="CT_Stroke"/>
|
||||||
|
<xsd:element name="textpath" type="CT_TextPath"/>
|
||||||
|
<xsd:complexType name="CT_Fill">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element ref="o:fill" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attribute name="type" type="ST_FillType" use="optional"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:href"/>
|
||||||
|
<xsd:attribute ref="o:althref"/>
|
||||||
|
<xsd:attribute name="size" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="origin" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="position" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="aspect" type="ST_ImageAspect" use="optional"/>
|
||||||
|
<xsd:attribute name="colors" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="angle" type="xsd:decimal" use="optional"/>
|
||||||
|
<xsd:attribute name="alignshape" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="focus" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="focussize" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="focusposition" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="method" type="ST_FillMethod" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:detectmouseclick"/>
|
||||||
|
<xsd:attribute ref="o:title"/>
|
||||||
|
<xsd:attribute ref="o:opacity2"/>
|
||||||
|
<xsd:attribute name="recolor" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="rotate" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute ref="r:id" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:relid" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Formulas">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="f" type="CT_F" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_F">
|
||||||
|
<xsd:attribute name="eqn" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Handles">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="h" type="CT_H" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_H">
|
||||||
|
<xsd:attribute name="position" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="polar" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="map" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="invx" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="invy" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="switch" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:attribute name="xrange" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="yrange" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="radiusrange" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ImageData">
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attributeGroup ref="AG_ImageAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Chromakey"/>
|
||||||
|
<xsd:attribute name="embosscolor" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="recolortarget" type="s:ST_ColorType"/>
|
||||||
|
<xsd:attribute ref="o:href"/>
|
||||||
|
<xsd:attribute ref="o:althref"/>
|
||||||
|
<xsd:attribute ref="o:title"/>
|
||||||
|
<xsd:attribute ref="o:oleid"/>
|
||||||
|
<xsd:attribute ref="o:detectmouseclick"/>
|
||||||
|
<xsd:attribute ref="o:movie"/>
|
||||||
|
<xsd:attribute ref="o:relid"/>
|
||||||
|
<xsd:attribute ref="r:id"/>
|
||||||
|
<xsd:attribute ref="r:pict"/>
|
||||||
|
<xsd:attribute ref="r:href"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Path">
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attribute name="v" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="limo" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textboxrect" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fillok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="strokeok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="shadowok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="arrowok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="gradientshapeok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="textpathok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="insetpenok" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:connecttype"/>
|
||||||
|
<xsd:attribute ref="o:connectlocs"/>
|
||||||
|
<xsd:attribute ref="o:connectangles"/>
|
||||||
|
<xsd:attribute ref="o:extrusionok"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shadow">
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="type" type="ST_ShadowType" use="optional"/>
|
||||||
|
<xsd:attribute name="obscured" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="offset" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="offset2" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="origin" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="matrix" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Stroke">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element ref="o:left" minOccurs="0"/>
|
||||||
|
<xsd:element ref="o:top" minOccurs="0"/>
|
||||||
|
<xsd:element ref="o:right" minOccurs="0"/>
|
||||||
|
<xsd:element ref="o:bottom" minOccurs="0"/>
|
||||||
|
<xsd:element ref="o:column" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attributeGroup ref="AG_StrokeAttributes"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Textbox">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element ref="w:txbxContent" minOccurs="0"/>
|
||||||
|
<xsd:any namespace="##local" processContents="skip"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Style"/>
|
||||||
|
<xsd:attribute name="inset" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute ref="o:singleclick"/>
|
||||||
|
<xsd:attribute ref="o:insetmode"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TextPath">
|
||||||
|
<xsd:attributeGroup ref="AG_Id"/>
|
||||||
|
<xsd:attributeGroup ref="AG_Style"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="fitshape" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="fitpath" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="trim" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="xscale" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="string" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="arc" type="CT_Arc"/>
|
||||||
|
<xsd:element name="curve" type="CT_Curve"/>
|
||||||
|
<xsd:element name="image" type="CT_Image"/>
|
||||||
|
<xsd:element name="line" type="CT_Line"/>
|
||||||
|
<xsd:element name="oval" type="CT_Oval"/>
|
||||||
|
<xsd:element name="polyline" type="CT_PolyLine"/>
|
||||||
|
<xsd:element name="rect" type="CT_Rect"/>
|
||||||
|
<xsd:element name="roundrect" type="CT_RoundRect"/>
|
||||||
|
<xsd:complexType name="CT_Arc">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attribute name="startAngle" type="xsd:decimal" use="optional"/>
|
||||||
|
<xsd:attribute name="endAngle" type="xsd:decimal" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Curve">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attribute name="from" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="control1" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="control2" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="to" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Image">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_ImageAttributes"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Line">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attribute name="from" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="to" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Oval">
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PolyLine">
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="EG_ShapeElements"/>
|
||||||
|
<xsd:element ref="o:ink"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attribute name="points" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Rect">
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RoundRect">
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="EG_ShapeElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attributeGroup ref="AG_AllCoreAttributes"/>
|
||||||
|
<xsd:attributeGroup ref="AG_AllShapeAttributes"/>
|
||||||
|
<xsd:attribute name="arcsize" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Ext">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="view"/>
|
||||||
|
<xsd:enumeration value="edit"/>
|
||||||
|
<xsd:enumeration value="backwardCompatible"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_FillType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="solid"/>
|
||||||
|
<xsd:enumeration value="gradient"/>
|
||||||
|
<xsd:enumeration value="gradientRadial"/>
|
||||||
|
<xsd:enumeration value="tile"/>
|
||||||
|
<xsd:enumeration value="pattern"/>
|
||||||
|
<xsd:enumeration value="frame"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_FillMethod">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="linear"/>
|
||||||
|
<xsd:enumeration value="sigma"/>
|
||||||
|
<xsd:enumeration value="any"/>
|
||||||
|
<xsd:enumeration value="linear sigma"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ShadowType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="single"/>
|
||||||
|
<xsd:enumeration value="double"/>
|
||||||
|
<xsd:enumeration value="emboss"/>
|
||||||
|
<xsd:enumeration value="perspective"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_StrokeLineStyle">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="single"/>
|
||||||
|
<xsd:enumeration value="thinThin"/>
|
||||||
|
<xsd:enumeration value="thinThick"/>
|
||||||
|
<xsd:enumeration value="thickThin"/>
|
||||||
|
<xsd:enumeration value="thickBetweenThin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_StrokeJoinStyle">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="round"/>
|
||||||
|
<xsd:enumeration value="bevel"/>
|
||||||
|
<xsd:enumeration value="miter"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_StrokeEndCap">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="flat"/>
|
||||||
|
<xsd:enumeration value="square"/>
|
||||||
|
<xsd:enumeration value="round"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_StrokeArrowLength">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="short"/>
|
||||||
|
<xsd:enumeration value="medium"/>
|
||||||
|
<xsd:enumeration value="long"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_StrokeArrowWidth">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="narrow"/>
|
||||||
|
<xsd:enumeration value="medium"/>
|
||||||
|
<xsd:enumeration value="wide"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_StrokeArrowType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="block"/>
|
||||||
|
<xsd:enumeration value="classic"/>
|
||||||
|
<xsd:enumeration value="oval"/>
|
||||||
|
<xsd:enumeration value="diamond"/>
|
||||||
|
<xsd:enumeration value="open"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ImageAspect">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="ignore"/>
|
||||||
|
<xsd:enumeration value="atMost"/>
|
||||||
|
<xsd:enumeration value="atLeast"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_EditAs">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="canvas"/>
|
||||||
|
<xsd:enumeration value="orgchart"/>
|
||||||
|
<xsd:enumeration value="radial"/>
|
||||||
|
<xsd:enumeration value="cycle"/>
|
||||||
|
<xsd:enumeration value="stacked"/>
|
||||||
|
<xsd:enumeration value="venn"/>
|
||||||
|
<xsd:enumeration value="bullseye"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,509 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="urn:schemas-microsoft-com:office:office" elementFormDefault="qualified"
|
||||||
|
attributeFormDefault="unqualified">
|
||||||
|
<xsd:import namespace="urn:schemas-microsoft-com:vml" schemaLocation="vml-main.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
schemaLocation="shared-relationshipReference.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:attribute name="bwmode" type="ST_BWMode"/>
|
||||||
|
<xsd:attribute name="bwpure" type="ST_BWMode"/>
|
||||||
|
<xsd:attribute name="bwnormal" type="ST_BWMode"/>
|
||||||
|
<xsd:attribute name="targetscreensize" type="ST_ScreenSize"/>
|
||||||
|
<xsd:attribute name="insetmode" type="ST_InsetMode" default="custom"/>
|
||||||
|
<xsd:attribute name="spt" type="xsd:float"/>
|
||||||
|
<xsd:attribute name="wrapcoords" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="oned" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="regroupid" type="xsd:integer"/>
|
||||||
|
<xsd:attribute name="doubleclicknotify" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="connectortype" type="ST_ConnectorType" default="straight"/>
|
||||||
|
<xsd:attribute name="button" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="userhidden" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="forcedash" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="oleicon" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="ole" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:attribute name="preferrelative" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="cliptowrap" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="clip" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="bullet" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="hr" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="hrstd" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="hrnoshade" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="hrpct" type="xsd:float"/>
|
||||||
|
<xsd:attribute name="hralign" type="ST_HrAlign" default="left"/>
|
||||||
|
<xsd:attribute name="allowincell" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="allowoverlap" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="userdrawn" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="bordertopcolor" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="borderleftcolor" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="borderbottomcolor" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="borderrightcolor" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="connecttype" type="ST_ConnectType"/>
|
||||||
|
<xsd:attribute name="connectlocs" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="connectangles" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="master" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="extrusionok" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="href" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="althref" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="title" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="singleclick" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="oleid" type="xsd:float"/>
|
||||||
|
<xsd:attribute name="detectmouseclick" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="movie" type="xsd:float"/>
|
||||||
|
<xsd:attribute name="spid" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="opacity2" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="relid" type="r:ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="dgmlayout" type="ST_DiagramLayout"/>
|
||||||
|
<xsd:attribute name="dgmnodekind" type="xsd:integer"/>
|
||||||
|
<xsd:attribute name="dgmlayoutmru" type="ST_DiagramLayout"/>
|
||||||
|
<xsd:attribute name="gfxdata" type="xsd:base64Binary"/>
|
||||||
|
<xsd:attribute name="tableproperties" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="tablelimits" type="xsd:string"/>
|
||||||
|
<xsd:element name="shapedefaults" type="CT_ShapeDefaults"/>
|
||||||
|
<xsd:element name="shapelayout" type="CT_ShapeLayout"/>
|
||||||
|
<xsd:element name="signatureline" type="CT_SignatureLine"/>
|
||||||
|
<xsd:element name="ink" type="CT_Ink"/>
|
||||||
|
<xsd:element name="diagram" type="CT_Diagram"/>
|
||||||
|
<xsd:element name="equationxml" type="CT_EquationXml"/>
|
||||||
|
<xsd:complexType name="CT_ShapeDefaults">
|
||||||
|
<xsd:all minOccurs="0">
|
||||||
|
<xsd:element ref="v:fill" minOccurs="0"/>
|
||||||
|
<xsd:element ref="v:stroke" minOccurs="0"/>
|
||||||
|
<xsd:element ref="v:textbox" minOccurs="0"/>
|
||||||
|
<xsd:element ref="v:shadow" minOccurs="0"/>
|
||||||
|
<xsd:element ref="skew" minOccurs="0"/>
|
||||||
|
<xsd:element ref="extrusion" minOccurs="0"/>
|
||||||
|
<xsd:element ref="callout" minOccurs="0"/>
|
||||||
|
<xsd:element ref="lock" minOccurs="0"/>
|
||||||
|
<xsd:element name="colormru" minOccurs="0" type="CT_ColorMru"/>
|
||||||
|
<xsd:element name="colormenu" minOccurs="0" type="CT_ColorMenu"/>
|
||||||
|
</xsd:all>
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="spidmax" type="xsd:integer" use="optional"/>
|
||||||
|
<xsd:attribute name="style" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fill" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="fillcolor" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="stroke" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="strokecolor" type="s:ST_ColorType"/>
|
||||||
|
<xsd:attribute name="allowincell" form="qualified" type="s:ST_TrueFalse"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Ink">
|
||||||
|
<xsd:sequence/>
|
||||||
|
<xsd:attribute name="i" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="annotation" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="contentType" type="ST_ContentType" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SignatureLine">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="issignatureline" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="id" type="s:ST_Guid"/>
|
||||||
|
<xsd:attribute name="provid" type="s:ST_Guid"/>
|
||||||
|
<xsd:attribute name="signinginstructionsset" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="allowcomments" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="showsigndate" type="s:ST_TrueFalse"/>
|
||||||
|
<xsd:attribute name="suggestedsigner" type="xsd:string" form="qualified"/>
|
||||||
|
<xsd:attribute name="suggestedsigner2" type="xsd:string" form="qualified"/>
|
||||||
|
<xsd:attribute name="suggestedsigneremail" type="xsd:string" form="qualified"/>
|
||||||
|
<xsd:attribute name="signinginstructions" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="addlxml" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="sigprovurl" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ShapeLayout">
|
||||||
|
<xsd:all>
|
||||||
|
<xsd:element name="idmap" type="CT_IdMap" minOccurs="0"/>
|
||||||
|
<xsd:element name="regrouptable" type="CT_RegroupTable" minOccurs="0"/>
|
||||||
|
<xsd:element name="rules" type="CT_Rules" minOccurs="0"/>
|
||||||
|
</xsd:all>
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_IdMap">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="data" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RegroupTable">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="entry" type="CT_Entry" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Entry">
|
||||||
|
<xsd:attribute name="new" type="xsd:int" use="optional"/>
|
||||||
|
<xsd:attribute name="old" type="xsd:int" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Rules">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="r" type="CT_R" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_R">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="proxy" type="CT_Proxy" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="type" type="ST_RType" use="optional"/>
|
||||||
|
<xsd:attribute name="how" type="ST_How" use="optional"/>
|
||||||
|
<xsd:attribute name="idref" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Proxy">
|
||||||
|
<xsd:attribute name="start" type="s:ST_TrueFalseBlank" use="optional" default="false"/>
|
||||||
|
<xsd:attribute name="end" type="s:ST_TrueFalseBlank" use="optional" default="false"/>
|
||||||
|
<xsd:attribute name="idref" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="connectloc" type="xsd:int" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Diagram">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="relationtable" type="CT_RelationTable" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="dgmstyle" type="xsd:integer" use="optional"/>
|
||||||
|
<xsd:attribute name="autoformat" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="reverse" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="autolayout" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="dgmscalex" type="xsd:integer" use="optional"/>
|
||||||
|
<xsd:attribute name="dgmscaley" type="xsd:integer" use="optional"/>
|
||||||
|
<xsd:attribute name="dgmfontsize" type="xsd:integer" use="optional"/>
|
||||||
|
<xsd:attribute name="constrainbounds" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="dgmbasetextscale" type="xsd:integer" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_EquationXml">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:any namespace="##any"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="contentType" type="ST_AlternateMathContentType" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_AlternateMathContentType">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_RelationTable">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="rel" type="CT_Relation" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Relation">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="idsrc" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="iddest" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="idcntr" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ColorMru">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="colors" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ColorMenu">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="strokecolor" type="s:ST_ColorType"/>
|
||||||
|
<xsd:attribute name="fillcolor" type="s:ST_ColorType"/>
|
||||||
|
<xsd:attribute name="shadowcolor" type="s:ST_ColorType"/>
|
||||||
|
<xsd:attribute name="extrusioncolor" type="s:ST_ColorType"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="skew" type="CT_Skew"/>
|
||||||
|
<xsd:element name="extrusion" type="CT_Extrusion"/>
|
||||||
|
<xsd:element name="callout" type="CT_Callout"/>
|
||||||
|
<xsd:element name="lock" type="CT_Lock"/>
|
||||||
|
<xsd:element name="OLEObject" type="CT_OLEObject"/>
|
||||||
|
<xsd:element name="complex" type="CT_Complex"/>
|
||||||
|
<xsd:element name="left" type="CT_StrokeChild"/>
|
||||||
|
<xsd:element name="top" type="CT_StrokeChild"/>
|
||||||
|
<xsd:element name="right" type="CT_StrokeChild"/>
|
||||||
|
<xsd:element name="bottom" type="CT_StrokeChild"/>
|
||||||
|
<xsd:element name="column" type="CT_StrokeChild"/>
|
||||||
|
<xsd:element name="clippath" type="CT_ClipPath"/>
|
||||||
|
<xsd:element name="fill" type="CT_Fill"/>
|
||||||
|
<xsd:complexType name="CT_Skew">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="id" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="offset" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="origin" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="matrix" type="xsd:string" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Extrusion">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="type" type="ST_ExtrusionType" default="parallel" use="optional"/>
|
||||||
|
<xsd:attribute name="render" type="ST_ExtrusionRender" default="solid" use="optional"/>
|
||||||
|
<xsd:attribute name="viewpointorigin" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="viewpoint" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="plane" type="ST_ExtrusionPlane" default="XY" use="optional"/>
|
||||||
|
<xsd:attribute name="skewangle" type="xsd:float" use="optional"/>
|
||||||
|
<xsd:attribute name="skewamt" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="foredepth" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="backdepth" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="orientation" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="orientationangle" type="xsd:float" use="optional"/>
|
||||||
|
<xsd:attribute name="lockrotationcenter" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="autorotationcenter" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="rotationcenter" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="rotationangle" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="colormode" type="ST_ColorMode" use="optional"/>
|
||||||
|
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="shininess" type="xsd:float" use="optional"/>
|
||||||
|
<xsd:attribute name="specularity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="diffusity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="metal" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="edge" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="facet" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lightface" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="brightness" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lightposition" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lightlevel" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lightharsh" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="lightposition2" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lightlevel2" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lightharsh2" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Callout">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="gap" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="angle" type="ST_Angle" use="optional"/>
|
||||||
|
<xsd:attribute name="dropauto" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="drop" type="ST_CalloutDrop" use="optional"/>
|
||||||
|
<xsd:attribute name="distance" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="lengthspecified" type="s:ST_TrueFalse" default="f" use="optional"/>
|
||||||
|
<xsd:attribute name="length" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="accentbar" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="textborder" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="minusx" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="minusy" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Lock">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="position" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="selection" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="grouping" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="ungrouping" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="rotation" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="cropping" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="verticies" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="adjusthandles" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="text" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="aspectratio" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="shapetype" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OLEObject">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="LinkType" type="ST_OLELinkType" minOccurs="0"/>
|
||||||
|
<xsd:element name="LockedField" type="s:ST_TrueFalseBlank" minOccurs="0"/>
|
||||||
|
<xsd:element name="FieldCodes" type="xsd:string" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="Type" type="ST_OLEType" use="optional"/>
|
||||||
|
<xsd:attribute name="ProgID" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="ShapeID" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="DrawAspect" type="ST_OLEDrawAspect" use="optional"/>
|
||||||
|
<xsd:attribute name="ObjectID" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute ref="r:id" use="optional"/>
|
||||||
|
<xsd:attribute name="UpdateMode" type="ST_OLEUpdateMode" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Complex">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_StrokeChild">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="on" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="weight" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="color" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="color2" type="s:ST_ColorType" use="optional"/>
|
||||||
|
<xsd:attribute name="opacity" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="linestyle" type="v:ST_StrokeLineStyle" use="optional"/>
|
||||||
|
<xsd:attribute name="miterlimit" type="xsd:decimal" use="optional"/>
|
||||||
|
<xsd:attribute name="joinstyle" type="v:ST_StrokeJoinStyle" use="optional"/>
|
||||||
|
<xsd:attribute name="endcap" type="v:ST_StrokeEndCap" use="optional"/>
|
||||||
|
<xsd:attribute name="dashstyle" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="insetpen" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="filltype" type="v:ST_FillType" use="optional"/>
|
||||||
|
<xsd:attribute name="src" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="imageaspect" type="v:ST_ImageAspect" use="optional"/>
|
||||||
|
<xsd:attribute name="imagesize" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="imagealignshape" type="s:ST_TrueFalse" use="optional"/>
|
||||||
|
<xsd:attribute name="startarrow" type="v:ST_StrokeArrowType" use="optional"/>
|
||||||
|
<xsd:attribute name="startarrowwidth" type="v:ST_StrokeArrowWidth" use="optional"/>
|
||||||
|
<xsd:attribute name="startarrowlength" type="v:ST_StrokeArrowLength" use="optional"/>
|
||||||
|
<xsd:attribute name="endarrow" type="v:ST_StrokeArrowType" use="optional"/>
|
||||||
|
<xsd:attribute name="endarrowwidth" type="v:ST_StrokeArrowWidth" use="optional"/>
|
||||||
|
<xsd:attribute name="endarrowlength" type="v:ST_StrokeArrowLength" use="optional"/>
|
||||||
|
<xsd:attribute ref="href"/>
|
||||||
|
<xsd:attribute ref="althref"/>
|
||||||
|
<xsd:attribute ref="title"/>
|
||||||
|
<xsd:attribute ref="forcedash"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ClipPath">
|
||||||
|
<xsd:attribute name="v" type="xsd:string" use="required" form="qualified"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Fill">
|
||||||
|
<xsd:attributeGroup ref="v:AG_Ext"/>
|
||||||
|
<xsd:attribute name="type" type="ST_FillType"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_RType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="arc"/>
|
||||||
|
<xsd:enumeration value="callout"/>
|
||||||
|
<xsd:enumeration value="connector"/>
|
||||||
|
<xsd:enumeration value="align"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_How">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="middle"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_BWMode">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="color"/>
|
||||||
|
<xsd:enumeration value="auto"/>
|
||||||
|
<xsd:enumeration value="grayScale"/>
|
||||||
|
<xsd:enumeration value="lightGrayscale"/>
|
||||||
|
<xsd:enumeration value="inverseGray"/>
|
||||||
|
<xsd:enumeration value="grayOutline"/>
|
||||||
|
<xsd:enumeration value="highContrast"/>
|
||||||
|
<xsd:enumeration value="black"/>
|
||||||
|
<xsd:enumeration value="white"/>
|
||||||
|
<xsd:enumeration value="hide"/>
|
||||||
|
<xsd:enumeration value="undrawn"/>
|
||||||
|
<xsd:enumeration value="blackTextAndLines"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ScreenSize">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="544,376"/>
|
||||||
|
<xsd:enumeration value="640,480"/>
|
||||||
|
<xsd:enumeration value="720,512"/>
|
||||||
|
<xsd:enumeration value="800,600"/>
|
||||||
|
<xsd:enumeration value="1024,768"/>
|
||||||
|
<xsd:enumeration value="1152,862"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_InsetMode">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="auto"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ColorMode">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="auto"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ContentType">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_DiagramLayout">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:enumeration value="0"/>
|
||||||
|
<xsd:enumeration value="1"/>
|
||||||
|
<xsd:enumeration value="2"/>
|
||||||
|
<xsd:enumeration value="3"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ExtrusionType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="perspective"/>
|
||||||
|
<xsd:enumeration value="parallel"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ExtrusionRender">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="solid"/>
|
||||||
|
<xsd:enumeration value="wireFrame"/>
|
||||||
|
<xsd:enumeration value="boundingCube"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ExtrusionPlane">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="XY"/>
|
||||||
|
<xsd:enumeration value="ZX"/>
|
||||||
|
<xsd:enumeration value="YZ"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Angle">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="any"/>
|
||||||
|
<xsd:enumeration value="30"/>
|
||||||
|
<xsd:enumeration value="45"/>
|
||||||
|
<xsd:enumeration value="60"/>
|
||||||
|
<xsd:enumeration value="90"/>
|
||||||
|
<xsd:enumeration value="auto"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CalloutDrop">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CalloutPlacement">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="user"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ConnectorType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="straight"/>
|
||||||
|
<xsd:enumeration value="elbow"/>
|
||||||
|
<xsd:enumeration value="curved"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_HrAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ConnectType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="rect"/>
|
||||||
|
<xsd:enumeration value="segments"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OLELinkType">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OLEType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="Embed"/>
|
||||||
|
<xsd:enumeration value="Link"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OLEDrawAspect">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="Content"/>
|
||||||
|
<xsd:enumeration value="Icon"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OLEUpdateMode">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="Always"/>
|
||||||
|
<xsd:enumeration value="OnCall"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_FillType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="gradientCenter"/>
|
||||||
|
<xsd:enumeration value="solid"/>
|
||||||
|
<xsd:enumeration value="pattern"/>
|
||||||
|
<xsd:enumeration value="tile"/>
|
||||||
|
<xsd:enumeration value="frame"/>
|
||||||
|
<xsd:enumeration value="gradientUnscaled"/>
|
||||||
|
<xsd:enumeration value="gradientRadial"/>
|
||||||
|
<xsd:enumeration value="gradient"/>
|
||||||
|
<xsd:enumeration value="background"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="urn:schemas-microsoft-com:office:powerpoint"
|
||||||
|
targetNamespace="urn:schemas-microsoft-com:office:powerpoint" elementFormDefault="qualified"
|
||||||
|
attributeFormDefault="unqualified">
|
||||||
|
<xsd:element name="iscomment" type="CT_Empty"/>
|
||||||
|
<xsd:element name="textdata" type="CT_Rel"/>
|
||||||
|
<xsd:complexType name="CT_Empty"/>
|
||||||
|
<xsd:complexType name="CT_Rel">
|
||||||
|
<xsd:attribute name="id" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="urn:schemas-microsoft-com:office:excel"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="urn:schemas-microsoft-com:office:excel" elementFormDefault="qualified"
|
||||||
|
attributeFormDefault="unqualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:element name="ClientData" type="CT_ClientData"/>
|
||||||
|
<xsd:complexType name="CT_ClientData">
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="MoveWithCells" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="SizeWithCells" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Anchor" type="xsd:string"/>
|
||||||
|
<xsd:element name="Locked" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="DefaultSize" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="PrintObject" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Disabled" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="AutoFill" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="AutoLine" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="AutoPict" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="FmlaMacro" type="xsd:string"/>
|
||||||
|
<xsd:element name="TextHAlign" type="xsd:string"/>
|
||||||
|
<xsd:element name="TextVAlign" type="xsd:string"/>
|
||||||
|
<xsd:element name="LockText" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="JustLastX" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="SecretEdit" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Default" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Help" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Cancel" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Dismiss" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Accel" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Accel2" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Row" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Column" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Visible" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="RowHidden" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="ColHidden" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="VTEdit" type="xsd:integer"/>
|
||||||
|
<xsd:element name="MultiLine" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="VScroll" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="ValidIds" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="FmlaRange" type="xsd:string"/>
|
||||||
|
<xsd:element name="WidthMin" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Sel" type="xsd:integer"/>
|
||||||
|
<xsd:element name="NoThreeD2" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="SelType" type="xsd:string"/>
|
||||||
|
<xsd:element name="MultiSel" type="xsd:string"/>
|
||||||
|
<xsd:element name="LCT" type="xsd:string"/>
|
||||||
|
<xsd:element name="ListItem" type="xsd:string"/>
|
||||||
|
<xsd:element name="DropStyle" type="xsd:string"/>
|
||||||
|
<xsd:element name="Colored" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="DropLines" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Checked" type="xsd:integer"/>
|
||||||
|
<xsd:element name="FmlaLink" type="xsd:string"/>
|
||||||
|
<xsd:element name="FmlaPict" type="xsd:string"/>
|
||||||
|
<xsd:element name="NoThreeD" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="FirstButton" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="FmlaGroup" type="xsd:string"/>
|
||||||
|
<xsd:element name="Val" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Min" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Max" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Inc" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Page" type="xsd:integer"/>
|
||||||
|
<xsd:element name="Horiz" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="Dx" type="xsd:integer"/>
|
||||||
|
<xsd:element name="MapOCX" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="CF" type="ST_CF"/>
|
||||||
|
<xsd:element name="Camera" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="RecalcAlways" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="AutoScale" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="DDE" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="UIObj" type="s:ST_TrueFalseBlank"/>
|
||||||
|
<xsd:element name="ScriptText" type="xsd:string"/>
|
||||||
|
<xsd:element name="ScriptExtended" type="xsd:string"/>
|
||||||
|
<xsd:element name="ScriptLanguage" type="xsd:nonNegativeInteger"/>
|
||||||
|
<xsd:element name="ScriptLocation" type="xsd:nonNegativeInteger"/>
|
||||||
|
<xsd:element name="FmlaTxbx" type="xsd:string"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="ObjectType" type="ST_ObjectType" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_CF">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ObjectType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="Button"/>
|
||||||
|
<xsd:enumeration value="Checkbox"/>
|
||||||
|
<xsd:enumeration value="Dialog"/>
|
||||||
|
<xsd:enumeration value="Drop"/>
|
||||||
|
<xsd:enumeration value="Edit"/>
|
||||||
|
<xsd:enumeration value="GBox"/>
|
||||||
|
<xsd:enumeration value="Label"/>
|
||||||
|
<xsd:enumeration value="LineA"/>
|
||||||
|
<xsd:enumeration value="List"/>
|
||||||
|
<xsd:enumeration value="Movie"/>
|
||||||
|
<xsd:enumeration value="Note"/>
|
||||||
|
<xsd:enumeration value="Pict"/>
|
||||||
|
<xsd:enumeration value="Radio"/>
|
||||||
|
<xsd:enumeration value="RectA"/>
|
||||||
|
<xsd:enumeration value="Scroll"/>
|
||||||
|
<xsd:enumeration value="Spin"/>
|
||||||
|
<xsd:enumeration value="Shape"/>
|
||||||
|
<xsd:enumeration value="Group"/>
|
||||||
|
<xsd:enumeration value="Rect"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="urn:schemas-microsoft-com:office:word"
|
||||||
|
targetNamespace="urn:schemas-microsoft-com:office:word" elementFormDefault="qualified"
|
||||||
|
attributeFormDefault="unqualified">
|
||||||
|
<xsd:element name="bordertop" type="CT_Border"/>
|
||||||
|
<xsd:element name="borderleft" type="CT_Border"/>
|
||||||
|
<xsd:element name="borderright" type="CT_Border"/>
|
||||||
|
<xsd:element name="borderbottom" type="CT_Border"/>
|
||||||
|
<xsd:complexType name="CT_Border">
|
||||||
|
<xsd:attribute name="type" type="ST_BorderType" use="optional"/>
|
||||||
|
<xsd:attribute name="width" type="xsd:positiveInteger" use="optional"/>
|
||||||
|
<xsd:attribute name="shadow" type="ST_BorderShadow" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wrap" type="CT_Wrap"/>
|
||||||
|
<xsd:complexType name="CT_Wrap">
|
||||||
|
<xsd:attribute name="type" type="ST_WrapType" use="optional"/>
|
||||||
|
<xsd:attribute name="side" type="ST_WrapSide" use="optional"/>
|
||||||
|
<xsd:attribute name="anchorx" type="ST_HorizontalAnchor" use="optional"/>
|
||||||
|
<xsd:attribute name="anchory" type="ST_VerticalAnchor" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="anchorlock" type="CT_AnchorLock"/>
|
||||||
|
<xsd:complexType name="CT_AnchorLock"/>
|
||||||
|
<xsd:simpleType name="ST_BorderType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="single"/>
|
||||||
|
<xsd:enumeration value="thick"/>
|
||||||
|
<xsd:enumeration value="double"/>
|
||||||
|
<xsd:enumeration value="hairline"/>
|
||||||
|
<xsd:enumeration value="dot"/>
|
||||||
|
<xsd:enumeration value="dash"/>
|
||||||
|
<xsd:enumeration value="dotDash"/>
|
||||||
|
<xsd:enumeration value="dashDotDot"/>
|
||||||
|
<xsd:enumeration value="triple"/>
|
||||||
|
<xsd:enumeration value="thinThickSmall"/>
|
||||||
|
<xsd:enumeration value="thickThinSmall"/>
|
||||||
|
<xsd:enumeration value="thickBetweenThinSmall"/>
|
||||||
|
<xsd:enumeration value="thinThick"/>
|
||||||
|
<xsd:enumeration value="thickThin"/>
|
||||||
|
<xsd:enumeration value="thickBetweenThin"/>
|
||||||
|
<xsd:enumeration value="thinThickLarge"/>
|
||||||
|
<xsd:enumeration value="thickThinLarge"/>
|
||||||
|
<xsd:enumeration value="thickBetweenThinLarge"/>
|
||||||
|
<xsd:enumeration value="wave"/>
|
||||||
|
<xsd:enumeration value="doubleWave"/>
|
||||||
|
<xsd:enumeration value="dashedSmall"/>
|
||||||
|
<xsd:enumeration value="dashDotStroked"/>
|
||||||
|
<xsd:enumeration value="threeDEmboss"/>
|
||||||
|
<xsd:enumeration value="threeDEngrave"/>
|
||||||
|
<xsd:enumeration value="HTMLOutset"/>
|
||||||
|
<xsd:enumeration value="HTMLInset"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_BorderShadow">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_WrapType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="topAndBottom"/>
|
||||||
|
<xsd:enumeration value="square"/>
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="tight"/>
|
||||||
|
<xsd:enumeration value="through"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_WrapSide">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="both"/>
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="largest"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_HorizontalAnchor">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="text"/>
|
||||||
|
<xsd:enumeration value="char"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_VerticalAnchor">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="text"/>
|
||||||
|
<xsd:enumeration value="line"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
3646
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd
Normal file
3646
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd
Normal file
File diff suppressed because it is too large
Load Diff
116
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd
Normal file
116
skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
<?xml version='1.0'?>
|
||||||
|
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
|
||||||
|
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
See http://www.w3.org/XML/1998/namespace.html and
|
||||||
|
http://www.w3.org/TR/REC-xml for information about this namespace.
|
||||||
|
|
||||||
|
This schema document describes the XML namespace, in a form
|
||||||
|
suitable for import by other schema documents.
|
||||||
|
|
||||||
|
Note that local names in this namespace are intended to be defined
|
||||||
|
only by the World Wide Web Consortium or its subgroups. The
|
||||||
|
following names are currently defined in this namespace and should
|
||||||
|
not be used with conflicting semantics by any Working Group,
|
||||||
|
specification, or document instance:
|
||||||
|
|
||||||
|
base (as an attribute name): denotes an attribute whose value
|
||||||
|
provides a URI to be used as the base for interpreting any
|
||||||
|
relative URIs in the scope of the element on which it
|
||||||
|
appears; its value is inherited. This name is reserved
|
||||||
|
by virtue of its definition in the XML Base specification.
|
||||||
|
|
||||||
|
lang (as an attribute name): denotes an attribute whose value
|
||||||
|
is a language code for the natural language of the content of
|
||||||
|
any element; its value is inherited. This name is reserved
|
||||||
|
by virtue of its definition in the XML specification.
|
||||||
|
|
||||||
|
space (as an attribute name): denotes an attribute whose
|
||||||
|
value is a keyword indicating what whitespace processing
|
||||||
|
discipline is intended for the content of the element; its
|
||||||
|
value is inherited. This name is reserved by virtue of its
|
||||||
|
definition in the XML specification.
|
||||||
|
|
||||||
|
Father (in any context at all): denotes Jon Bosak, the chair of
|
||||||
|
the original XML Working Group. This name is reserved by
|
||||||
|
the following decision of the W3C XML Plenary and
|
||||||
|
XML Coordination groups:
|
||||||
|
|
||||||
|
In appreciation for his vision, leadership and dedication
|
||||||
|
the W3C XML Plenary on this 10th day of February, 2000
|
||||||
|
reserves for Jon Bosak in perpetuity the XML name
|
||||||
|
xml:Father
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>This schema defines attributes and an attribute group
|
||||||
|
suitable for use by
|
||||||
|
schemas wishing to allow xml:base, xml:lang or xml:space attributes
|
||||||
|
on elements they define.
|
||||||
|
|
||||||
|
To enable this, such a schema must import this schema
|
||||||
|
for the XML namespace, e.g. as follows:
|
||||||
|
<schema . . .>
|
||||||
|
. . .
|
||||||
|
<import namespace="http://www.w3.org/XML/1998/namespace"
|
||||||
|
schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
|
||||||
|
|
||||||
|
Subsequently, qualified reference to any of the attributes
|
||||||
|
or the group defined below will have the desired effect, e.g.
|
||||||
|
|
||||||
|
<type . . .>
|
||||||
|
. . .
|
||||||
|
<attributeGroup ref="xml:specialAttrs"/>
|
||||||
|
|
||||||
|
will define a type which will schema-validate an instance
|
||||||
|
element with any of those attributes</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>In keeping with the XML Schema WG's standard versioning
|
||||||
|
policy, this schema document will persist at
|
||||||
|
http://www.w3.org/2001/03/xml.xsd.
|
||||||
|
At the date of issue it can also be found at
|
||||||
|
http://www.w3.org/2001/xml.xsd.
|
||||||
|
The schema document at that URI may however change in the future,
|
||||||
|
in order to remain compatible with the latest version of XML Schema
|
||||||
|
itself. In other words, if the XML Schema namespace changes, the version
|
||||||
|
of this document at
|
||||||
|
http://www.w3.org/2001/xml.xsd will change
|
||||||
|
accordingly; the version at
|
||||||
|
http://www.w3.org/2001/03/xml.xsd will not change.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
|
||||||
|
<xs:attribute name="lang" type="xs:language">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter
|
||||||
|
codes as the enumerated possible values . . .</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="space" default="preserve">
|
||||||
|
<xs:simpleType>
|
||||||
|
<xs:restriction base="xs:NCName">
|
||||||
|
<xs:enumeration value="default"/>
|
||||||
|
<xs:enumeration value="preserve"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attribute name="base" type="xs:anyURI">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>See http://www.w3.org/TR/xmlbase/ for
|
||||||
|
information about this attribute.</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:attribute>
|
||||||
|
|
||||||
|
<xs:attributeGroup name="specialAttrs">
|
||||||
|
<xs:attribute ref="xml:base"/>
|
||||||
|
<xs:attribute ref="xml:lang"/>
|
||||||
|
<xs:attribute ref="xml:space"/>
|
||||||
|
</xs:attributeGroup>
|
||||||
|
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<xs:schema xmlns="http://schemas.openxmlformats.org/package/2006/content-types"
|
||||||
|
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/package/2006/content-types"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all">
|
||||||
|
|
||||||
|
<xs:element name="Types" type="CT_Types"/>
|
||||||
|
<xs:element name="Default" type="CT_Default"/>
|
||||||
|
<xs:element name="Override" type="CT_Override"/>
|
||||||
|
|
||||||
|
<xs:complexType name="CT_Types">
|
||||||
|
<xs:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xs:element ref="Default"/>
|
||||||
|
<xs:element ref="Override"/>
|
||||||
|
</xs:choice>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="CT_Default">
|
||||||
|
<xs:attribute name="Extension" type="ST_Extension" use="required"/>
|
||||||
|
<xs:attribute name="ContentType" type="ST_ContentType" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="CT_Override">
|
||||||
|
<xs:attribute name="ContentType" type="ST_ContentType" use="required"/>
|
||||||
|
<xs:attribute name="PartName" type="xs:anyURI" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:simpleType name="ST_ContentType">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:pattern
|
||||||
|
value="(((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+))/((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+))((\s+)*;(\s+)*(((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+))=((([\p{IsBasicLatin}-[\p{Cc}\(\)<>@,;:\\"/\[\]\?=\{\}\s\t]])+)|("(([\p{IsLatin-1Supplement}\p{IsBasicLatin}-[\p{Cc}"\n\r]]|(\s+))|(\\[\p{IsBasicLatin}]))*"))))*)"
|
||||||
|
/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="ST_Extension">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:pattern
|
||||||
|
value="([!$&'\(\)\*\+,:=]|(%[0-9a-fA-F][0-9a-fA-F])|[:@]|[a-zA-Z0-9\-_~])+"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<xs:schema targetNamespace="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
|
||||||
|
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:dcterms="http://purl.org/dc/terms/" elementFormDefault="qualified" blockDefault="#all">
|
||||||
|
|
||||||
|
<xs:import namespace="http://purl.org/dc/elements/1.1/"
|
||||||
|
schemaLocation="http://dublincore.org/schemas/xmls/qdc/2003/04/02/dc.xsd"/>
|
||||||
|
<xs:import namespace="http://purl.org/dc/terms/"
|
||||||
|
schemaLocation="http://dublincore.org/schemas/xmls/qdc/2003/04/02/dcterms.xsd"/>
|
||||||
|
<xs:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"/>
|
||||||
|
|
||||||
|
<xs:element name="coreProperties" type="CT_CoreProperties"/>
|
||||||
|
|
||||||
|
<xs:complexType name="CT_CoreProperties">
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="category" minOccurs="0" maxOccurs="1" type="xs:string"/>
|
||||||
|
<xs:element name="contentStatus" minOccurs="0" maxOccurs="1" type="xs:string"/>
|
||||||
|
<xs:element ref="dcterms:created" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element ref="dc:creator" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element ref="dc:description" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element ref="dc:identifier" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element name="keywords" minOccurs="0" maxOccurs="1" type="CT_Keywords"/>
|
||||||
|
<xs:element ref="dc:language" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element name="lastModifiedBy" minOccurs="0" maxOccurs="1" type="xs:string"/>
|
||||||
|
<xs:element name="lastPrinted" minOccurs="0" maxOccurs="1" type="xs:dateTime"/>
|
||||||
|
<xs:element ref="dcterms:modified" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element name="revision" minOccurs="0" maxOccurs="1" type="xs:string"/>
|
||||||
|
<xs:element ref="dc:subject" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element ref="dc:title" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xs:element name="version" minOccurs="0" maxOccurs="1" type="xs:string"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="CT_Keywords" mixed="true">
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="value" minOccurs="0" maxOccurs="unbounded" type="CT_Keyword"/>
|
||||||
|
</xs:sequence>
|
||||||
|
<xs:attribute ref="xml:lang" use="optional"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="CT_Keyword">
|
||||||
|
<xs:simpleContent>
|
||||||
|
<xs:extension base="xs:string">
|
||||||
|
<xs:attribute ref="xml:lang" use="optional"/>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:simpleContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
</xs:schema>
|
||||||
49
skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd
Normal file
49
skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<xsd:schema xmlns="http://schemas.openxmlformats.org/package/2006/digital-signature"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/package/2006/digital-signature"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all">
|
||||||
|
|
||||||
|
<xsd:element name="SignatureTime" type="CT_SignatureTime"/>
|
||||||
|
<xsd:element name="RelationshipReference" type="CT_RelationshipReference"/>
|
||||||
|
<xsd:element name="RelationshipsGroupReference" type="CT_RelationshipsGroupReference"/>
|
||||||
|
|
||||||
|
<xsd:complexType name="CT_SignatureTime">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Format" type="ST_Format"/>
|
||||||
|
<xsd:element name="Value" type="ST_Value"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="CT_RelationshipReference">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="xsd:string">
|
||||||
|
<xsd:attribute name="SourceId" type="xsd:string" use="required"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="CT_RelationshipsGroupReference">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="xsd:string">
|
||||||
|
<xsd:attribute name="SourceType" type="xsd:anyURI" use="required"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:simpleType name="ST_Format">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern
|
||||||
|
value="(YYYY)|(YYYY-MM)|(YYYY-MM-DD)|(YYYY-MM-DDThh:mmTZD)|(YYYY-MM-DDThh:mm:ssTZD)|(YYYY-MM-DDThh:mm:ss.sTZD)"
|
||||||
|
/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
|
||||||
|
<xsd:simpleType name="ST_Value">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern
|
||||||
|
value="(([0-9][0-9][0-9][0-9]))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2))))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1))))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1)))T((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))(((\+|-)((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])))|Z))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1)))T((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))(((\+|-)((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])))|Z))|(([0-9][0-9][0-9][0-9])-((0[1-9])|(1(0|1|2)))-((0[1-9])|(1[0-9])|(2[0-9])|(3(0|1)))T((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])):(((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9]))\.[0-9])(((\+|-)((0[0-9])|(1[0-9])|(2(0|1|2|3))):((0[0-9])|(1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])))|Z))"
|
||||||
|
/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<xsd:schema xmlns="http://schemas.openxmlformats.org/package/2006/relationships"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/package/2006/relationships"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all">
|
||||||
|
|
||||||
|
<xsd:element name="Relationships" type="CT_Relationships"/>
|
||||||
|
<xsd:element name="Relationship" type="CT_Relationship"/>
|
||||||
|
|
||||||
|
<xsd:complexType name="CT_Relationships">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element ref="Relationship" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:complexType name="CT_Relationship">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="xsd:string">
|
||||||
|
<xsd:attribute name="TargetMode" type="ST_TargetMode" use="optional"/>
|
||||||
|
<xsd:attribute name="Target" type="xsd:anyURI" use="required"/>
|
||||||
|
<xsd:attribute name="Type" type="xsd:anyURI" use="required"/>
|
||||||
|
<xsd:attribute name="Id" type="xsd:ID" use="required"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
|
||||||
|
<xsd:simpleType name="ST_TargetMode">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="External"/>
|
||||||
|
<xsd:enumeration value="Internal"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
75
skills/docx/ooxml/schemas/mce/mc.xsd
Normal file
75
skills/docx/ooxml/schemas/mce/mc.xsd
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
attributeFormDefault="unqualified" elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This XSD is a modified version of the one found at:
|
||||||
|
https://github.com/plutext/docx4j/blob/master/xsd/mce/markup-compatibility-2006-MINIMAL.xsd
|
||||||
|
|
||||||
|
This XSD has 2 objectives:
|
||||||
|
|
||||||
|
1. round tripping @mc:Ignorable
|
||||||
|
|
||||||
|
<w:document
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
mc:Ignorable="w14 w15 wp14">
|
||||||
|
|
||||||
|
2. enabling AlternateContent to be manipulated in certain elements
|
||||||
|
(in the unusual case where the content model is xsd:any, it doesn't have to be explicitly added)
|
||||||
|
|
||||||
|
See further ECMA-376, 4th Edition, Office Open XML File Formats
|
||||||
|
Part 3 : Markup Compatibility and Extensibility
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Objective 1 -->
|
||||||
|
<xsd:attribute name="Ignorable" type="xsd:string" />
|
||||||
|
|
||||||
|
<!-- Objective 2 -->
|
||||||
|
<xsd:attribute name="MustUnderstand" type="xsd:string" />
|
||||||
|
<xsd:attribute name="ProcessContent" type="xsd:string" />
|
||||||
|
|
||||||
|
<!-- An AlternateContent element shall contain one or more Choice child elements, optionally followed by a
|
||||||
|
Fallback child element. If present, there shall be only one Fallback element, and it shall follow all Choice
|
||||||
|
elements. -->
|
||||||
|
<xsd:element name="AlternateContent">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Choice" minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:any minOccurs="0" maxOccurs="unbounded"
|
||||||
|
processContents="strict">
|
||||||
|
</xsd:any>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="Requires" type="xsd:string" use="required" />
|
||||||
|
<xsd:attribute ref="mc:Ignorable" use="optional" />
|
||||||
|
<xsd:attribute ref="mc:MustUnderstand" use="optional" />
|
||||||
|
<xsd:attribute ref="mc:ProcessContent" use="optional" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="Fallback" minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:any minOccurs="0" maxOccurs="unbounded"
|
||||||
|
processContents="strict">
|
||||||
|
</xsd:any>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute ref="mc:Ignorable" use="optional" />
|
||||||
|
<xsd:attribute ref="mc:MustUnderstand" use="optional" />
|
||||||
|
<xsd:attribute ref="mc:ProcessContent" use="optional" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:sequence>
|
||||||
|
<!-- AlternateContent elements might include the attributes Ignorable,
|
||||||
|
MustUnderstand and ProcessContent described in this Part of ECMA-376. These
|
||||||
|
attributes’ qualified names shall be prefixed when associated with an AlternateContent
|
||||||
|
element. -->
|
||||||
|
<xsd:attribute ref="mc:Ignorable" use="optional" />
|
||||||
|
<xsd:attribute ref="mc:MustUnderstand" use="optional" />
|
||||||
|
<xsd:attribute ref="mc:ProcessContent" use="optional" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
560
skills/docx/ooxml/schemas/microsoft/wml-2010.xsd
Normal file
560
skills/docx/ooxml/schemas/microsoft/wml-2010.xsd
Normal file
@@ -0,0 +1,560 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns="http://schemas.microsoft.com/office/word/2010/wordml" targetNamespace="http://schemas.microsoft.com/office/word/2010/wordml">
|
||||||
|
<!-- <xsd:import id="rel" namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships" schemaLocation="orel.xsd"/> -->
|
||||||
|
<xsd:import id="w" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<!-- <xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" schemaLocation="oartbasetypes.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main" schemaLocation="oartsplineproperties.xsd"/> -->
|
||||||
|
<xsd:complexType name="CT_LongHexNumber">
|
||||||
|
<xsd:attribute name="val" type="w:ST_LongHexNumber" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_OnOff">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
<xsd:enumeration value="0"/>
|
||||||
|
<xsd:enumeration value="1"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_OnOff">
|
||||||
|
<xsd:attribute name="val" type="ST_OnOff"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="docId" type="CT_LongHexNumber"/>
|
||||||
|
<xsd:element name="conflictMode" type="CT_OnOff"/>
|
||||||
|
<xsd:attributeGroup name="AG_Parids">
|
||||||
|
<xsd:attribute name="paraId" type="w:ST_LongHexNumber"/>
|
||||||
|
<xsd:attribute name="textId" type="w:ST_LongHexNumber"/>
|
||||||
|
</xsd:attributeGroup>
|
||||||
|
<xsd:attribute name="anchorId" type="w:ST_LongHexNumber"/>
|
||||||
|
<xsd:attribute name="noSpellErr" type="ST_OnOff"/>
|
||||||
|
<xsd:element name="customXmlConflictInsRangeStart" type="w:CT_TrackChange"/>
|
||||||
|
<xsd:element name="customXmlConflictInsRangeEnd" type="w:CT_Markup"/>
|
||||||
|
<xsd:element name="customXmlConflictDelRangeStart" type="w:CT_TrackChange"/>
|
||||||
|
<xsd:element name="customXmlConflictDelRangeEnd" type="w:CT_Markup"/>
|
||||||
|
<xsd:group name="EG_RunLevelConflicts">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="conflictIns" type="w:CT_RunTrackChange" minOccurs="0"/>
|
||||||
|
<xsd:element name="conflictDel" type="w:CT_RunTrackChange" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:group name="EG_Conflicts">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="conflictIns" type="w:CT_TrackChange" minOccurs="0"/>
|
||||||
|
<xsd:element name="conflictDel" type="w:CT_TrackChange" minOccurs="0"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Percentage">
|
||||||
|
<xsd:attribute name="val" type="a:ST_Percentage" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PositiveFixedPercentage">
|
||||||
|
<xsd:attribute name="val" type="a:ST_PositiveFixedPercentage" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PositivePercentage">
|
||||||
|
<xsd:attribute name="val" type="a:ST_PositivePercentage" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_SchemeColorVal">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="bg1"/>
|
||||||
|
<xsd:enumeration value="tx1"/>
|
||||||
|
<xsd:enumeration value="bg2"/>
|
||||||
|
<xsd:enumeration value="tx2"/>
|
||||||
|
<xsd:enumeration value="accent1"/>
|
||||||
|
<xsd:enumeration value="accent2"/>
|
||||||
|
<xsd:enumeration value="accent3"/>
|
||||||
|
<xsd:enumeration value="accent4"/>
|
||||||
|
<xsd:enumeration value="accent5"/>
|
||||||
|
<xsd:enumeration value="accent6"/>
|
||||||
|
<xsd:enumeration value="hlink"/>
|
||||||
|
<xsd:enumeration value="folHlink"/>
|
||||||
|
<xsd:enumeration value="dk1"/>
|
||||||
|
<xsd:enumeration value="lt1"/>
|
||||||
|
<xsd:enumeration value="dk2"/>
|
||||||
|
<xsd:enumeration value="lt2"/>
|
||||||
|
<xsd:enumeration value="phClr"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RectAlignment">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="tl"/>
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="tr"/>
|
||||||
|
<xsd:enumeration value="l"/>
|
||||||
|
<xsd:enumeration value="ctr"/>
|
||||||
|
<xsd:enumeration value="r"/>
|
||||||
|
<xsd:enumeration value="bl"/>
|
||||||
|
<xsd:enumeration value="b"/>
|
||||||
|
<xsd:enumeration value="br"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PathShadeType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="shape"/>
|
||||||
|
<xsd:enumeration value="circle"/>
|
||||||
|
<xsd:enumeration value="rect"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_LineCap">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="rnd"/>
|
||||||
|
<xsd:enumeration value="sq"/>
|
||||||
|
<xsd:enumeration value="flat"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PresetLineDashVal">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="solid"/>
|
||||||
|
<xsd:enumeration value="dot"/>
|
||||||
|
<xsd:enumeration value="sysDot"/>
|
||||||
|
<xsd:enumeration value="dash"/>
|
||||||
|
<xsd:enumeration value="sysDash"/>
|
||||||
|
<xsd:enumeration value="lgDash"/>
|
||||||
|
<xsd:enumeration value="dashDot"/>
|
||||||
|
<xsd:enumeration value="sysDashDot"/>
|
||||||
|
<xsd:enumeration value="lgDashDot"/>
|
||||||
|
<xsd:enumeration value="lgDashDotDot"/>
|
||||||
|
<xsd:enumeration value="sysDashDotDot"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PenAlignment">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="ctr"/>
|
||||||
|
<xsd:enumeration value="in"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CompoundLine">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="sng"/>
|
||||||
|
<xsd:enumeration value="dbl"/>
|
||||||
|
<xsd:enumeration value="thickThin"/>
|
||||||
|
<xsd:enumeration value="thinThick"/>
|
||||||
|
<xsd:enumeration value="tri"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_RelativeRect">
|
||||||
|
<xsd:attribute name="l" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="t" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="r" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="b" use="optional" type="a:ST_Percentage"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ColorTransform">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="tint" type="CT_PositiveFixedPercentage"/>
|
||||||
|
<xsd:element name="shade" type="CT_PositiveFixedPercentage"/>
|
||||||
|
<xsd:element name="alpha" type="CT_PositiveFixedPercentage"/>
|
||||||
|
<xsd:element name="hueMod" type="CT_PositivePercentage"/>
|
||||||
|
<xsd:element name="sat" type="CT_Percentage"/>
|
||||||
|
<xsd:element name="satOff" type="CT_Percentage"/>
|
||||||
|
<xsd:element name="satMod" type="CT_Percentage"/>
|
||||||
|
<xsd:element name="lum" type="CT_Percentage"/>
|
||||||
|
<xsd:element name="lumOff" type="CT_Percentage"/>
|
||||||
|
<xsd:element name="lumMod" type="CT_Percentage"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_SRgbColor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="val" type="s:ST_HexColorRGB" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SchemeColor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorTransform" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="val" type="ST_SchemeColorVal" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ColorChoice">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="srgbClr" type="CT_SRgbColor"/>
|
||||||
|
<xsd:element name="schemeClr" type="CT_SchemeColor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Color">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorChoice"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GradientStop">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorChoice"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="pos" type="a:ST_PositiveFixedPercentage" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GradientStopList">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="gs" type="CT_GradientStop" minOccurs="2" maxOccurs="10"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LinearShadeProperties">
|
||||||
|
<xsd:attribute name="ang" type="a:ST_PositiveFixedAngle" use="optional"/>
|
||||||
|
<xsd:attribute name="scaled" type="ST_OnOff" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PathShadeProperties">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="fillToRect" type="CT_RelativeRect" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="path" type="ST_PathShadeType" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ShadeProperties">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="lin" type="CT_LinearShadeProperties"/>
|
||||||
|
<xsd:element name="path" type="CT_PathShadeProperties"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_SolidColorFillProperties">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorChoice" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GradientFillProperties">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="gsLst" type="CT_GradientStopList" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_ShadeProperties" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_FillProperties">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="noFill" type="w:CT_Empty"/>
|
||||||
|
<xsd:element name="solidFill" type="CT_SolidColorFillProperties"/>
|
||||||
|
<xsd:element name="gradFill" type="CT_GradientFillProperties"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_PresetLineDashProperties">
|
||||||
|
<xsd:attribute name="val" type="ST_PresetLineDashVal" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_LineDashProperties">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="prstDash" type="CT_PresetLineDashProperties"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_LineJoinMiterProperties">
|
||||||
|
<xsd:attribute name="lim" type="a:ST_PositivePercentage" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_LineJoinProperties">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="round" type="w:CT_Empty"/>
|
||||||
|
<xsd:element name="bevel" type="w:CT_Empty"/>
|
||||||
|
<xsd:element name="miter" type="CT_LineJoinMiterProperties"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_PresetCameraType">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="legacyObliqueTopLeft"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueTop"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueTopRight"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueLeft"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueFront"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueRight"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueBottomLeft"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueBottom"/>
|
||||||
|
<xsd:enumeration value="legacyObliqueBottomRight"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveTopLeft"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveTop"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveTopRight"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveLeft"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveFront"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveRight"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveBottomLeft"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveBottom"/>
|
||||||
|
<xsd:enumeration value="legacyPerspectiveBottomRight"/>
|
||||||
|
<xsd:enumeration value="orthographicFront"/>
|
||||||
|
<xsd:enumeration value="isometricTopUp"/>
|
||||||
|
<xsd:enumeration value="isometricTopDown"/>
|
||||||
|
<xsd:enumeration value="isometricBottomUp"/>
|
||||||
|
<xsd:enumeration value="isometricBottomDown"/>
|
||||||
|
<xsd:enumeration value="isometricLeftUp"/>
|
||||||
|
<xsd:enumeration value="isometricLeftDown"/>
|
||||||
|
<xsd:enumeration value="isometricRightUp"/>
|
||||||
|
<xsd:enumeration value="isometricRightDown"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis1Left"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis1Right"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis1Top"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis2Left"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis2Right"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis2Top"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis3Left"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis3Right"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis3Bottom"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis4Left"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis4Right"/>
|
||||||
|
<xsd:enumeration value="isometricOffAxis4Bottom"/>
|
||||||
|
<xsd:enumeration value="obliqueTopLeft"/>
|
||||||
|
<xsd:enumeration value="obliqueTop"/>
|
||||||
|
<xsd:enumeration value="obliqueTopRight"/>
|
||||||
|
<xsd:enumeration value="obliqueLeft"/>
|
||||||
|
<xsd:enumeration value="obliqueRight"/>
|
||||||
|
<xsd:enumeration value="obliqueBottomLeft"/>
|
||||||
|
<xsd:enumeration value="obliqueBottom"/>
|
||||||
|
<xsd:enumeration value="obliqueBottomRight"/>
|
||||||
|
<xsd:enumeration value="perspectiveFront"/>
|
||||||
|
<xsd:enumeration value="perspectiveLeft"/>
|
||||||
|
<xsd:enumeration value="perspectiveRight"/>
|
||||||
|
<xsd:enumeration value="perspectiveAbove"/>
|
||||||
|
<xsd:enumeration value="perspectiveBelow"/>
|
||||||
|
<xsd:enumeration value="perspectiveAboveLeftFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveAboveRightFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveContrastingLeftFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveContrastingRightFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveHeroicLeftFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveHeroicRightFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveHeroicExtremeLeftFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveHeroicExtremeRightFacing"/>
|
||||||
|
<xsd:enumeration value="perspectiveRelaxed"/>
|
||||||
|
<xsd:enumeration value="perspectiveRelaxedModerately"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Camera">
|
||||||
|
<xsd:attribute name="prst" use="required" type="ST_PresetCameraType"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SphereCoords">
|
||||||
|
<xsd:attribute name="lat" type="a:ST_PositiveFixedAngle" use="required"/>
|
||||||
|
<xsd:attribute name="lon" type="a:ST_PositiveFixedAngle" use="required"/>
|
||||||
|
<xsd:attribute name="rev" type="a:ST_PositiveFixedAngle" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_LightRigType">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="legacyFlat1"/>
|
||||||
|
<xsd:enumeration value="legacyFlat2"/>
|
||||||
|
<xsd:enumeration value="legacyFlat3"/>
|
||||||
|
<xsd:enumeration value="legacyFlat4"/>
|
||||||
|
<xsd:enumeration value="legacyNormal1"/>
|
||||||
|
<xsd:enumeration value="legacyNormal2"/>
|
||||||
|
<xsd:enumeration value="legacyNormal3"/>
|
||||||
|
<xsd:enumeration value="legacyNormal4"/>
|
||||||
|
<xsd:enumeration value="legacyHarsh1"/>
|
||||||
|
<xsd:enumeration value="legacyHarsh2"/>
|
||||||
|
<xsd:enumeration value="legacyHarsh3"/>
|
||||||
|
<xsd:enumeration value="legacyHarsh4"/>
|
||||||
|
<xsd:enumeration value="threePt"/>
|
||||||
|
<xsd:enumeration value="balanced"/>
|
||||||
|
<xsd:enumeration value="soft"/>
|
||||||
|
<xsd:enumeration value="harsh"/>
|
||||||
|
<xsd:enumeration value="flood"/>
|
||||||
|
<xsd:enumeration value="contrasting"/>
|
||||||
|
<xsd:enumeration value="morning"/>
|
||||||
|
<xsd:enumeration value="sunrise"/>
|
||||||
|
<xsd:enumeration value="sunset"/>
|
||||||
|
<xsd:enumeration value="chilly"/>
|
||||||
|
<xsd:enumeration value="freezing"/>
|
||||||
|
<xsd:enumeration value="flat"/>
|
||||||
|
<xsd:enumeration value="twoPt"/>
|
||||||
|
<xsd:enumeration value="glow"/>
|
||||||
|
<xsd:enumeration value="brightRoom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_LightRigDirection">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="tl"/>
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="tr"/>
|
||||||
|
<xsd:enumeration value="l"/>
|
||||||
|
<xsd:enumeration value="r"/>
|
||||||
|
<xsd:enumeration value="bl"/>
|
||||||
|
<xsd:enumeration value="b"/>
|
||||||
|
<xsd:enumeration value="br"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_LightRig">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="rot" type="CT_SphereCoords" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="rig" type="ST_LightRigType" use="required"/>
|
||||||
|
<xsd:attribute name="dir" type="ST_LightRigDirection" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_BevelPresetType">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="relaxedInset"/>
|
||||||
|
<xsd:enumeration value="circle"/>
|
||||||
|
<xsd:enumeration value="slope"/>
|
||||||
|
<xsd:enumeration value="cross"/>
|
||||||
|
<xsd:enumeration value="angle"/>
|
||||||
|
<xsd:enumeration value="softRound"/>
|
||||||
|
<xsd:enumeration value="convex"/>
|
||||||
|
<xsd:enumeration value="coolSlant"/>
|
||||||
|
<xsd:enumeration value="divot"/>
|
||||||
|
<xsd:enumeration value="riblet"/>
|
||||||
|
<xsd:enumeration value="hardEdge"/>
|
||||||
|
<xsd:enumeration value="artDeco"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Bevel">
|
||||||
|
<xsd:attribute name="w" type="a:ST_PositiveCoordinate" use="optional"/>
|
||||||
|
<xsd:attribute name="h" type="a:ST_PositiveCoordinate" use="optional"/>
|
||||||
|
<xsd:attribute name="prst" type="ST_BevelPresetType" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_PresetMaterialType">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="legacyMatte"/>
|
||||||
|
<xsd:enumeration value="legacyPlastic"/>
|
||||||
|
<xsd:enumeration value="legacyMetal"/>
|
||||||
|
<xsd:enumeration value="legacyWireframe"/>
|
||||||
|
<xsd:enumeration value="matte"/>
|
||||||
|
<xsd:enumeration value="plastic"/>
|
||||||
|
<xsd:enumeration value="metal"/>
|
||||||
|
<xsd:enumeration value="warmMatte"/>
|
||||||
|
<xsd:enumeration value="translucentPowder"/>
|
||||||
|
<xsd:enumeration value="powder"/>
|
||||||
|
<xsd:enumeration value="dkEdge"/>
|
||||||
|
<xsd:enumeration value="softEdge"/>
|
||||||
|
<xsd:enumeration value="clear"/>
|
||||||
|
<xsd:enumeration value="flat"/>
|
||||||
|
<xsd:enumeration value="softmetal"/>
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Glow">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorChoice"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="rad" use="optional" type="a:ST_PositiveCoordinate"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shadow">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ColorChoice"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="blurRad" use="optional" type="a:ST_PositiveCoordinate"/>
|
||||||
|
<xsd:attribute name="dist" use="optional" type="a:ST_PositiveCoordinate"/>
|
||||||
|
<xsd:attribute name="dir" use="optional" type="a:ST_PositiveFixedAngle"/>
|
||||||
|
<xsd:attribute name="sx" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="sy" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="kx" use="optional" type="a:ST_FixedAngle"/>
|
||||||
|
<xsd:attribute name="ky" use="optional" type="a:ST_FixedAngle"/>
|
||||||
|
<xsd:attribute name="algn" use="optional" type="ST_RectAlignment"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Reflection">
|
||||||
|
<xsd:attribute name="blurRad" use="optional" type="a:ST_PositiveCoordinate"/>
|
||||||
|
<xsd:attribute name="stA" use="optional" type="a:ST_PositiveFixedPercentage"/>
|
||||||
|
<xsd:attribute name="stPos" use="optional" type="a:ST_PositiveFixedPercentage"/>
|
||||||
|
<xsd:attribute name="endA" use="optional" type="a:ST_PositiveFixedPercentage"/>
|
||||||
|
<xsd:attribute name="endPos" use="optional" type="a:ST_PositiveFixedPercentage"/>
|
||||||
|
<xsd:attribute name="dist" use="optional" type="a:ST_PositiveCoordinate"/>
|
||||||
|
<xsd:attribute name="dir" use="optional" type="a:ST_PositiveFixedAngle"/>
|
||||||
|
<xsd:attribute name="fadeDir" use="optional" type="a:ST_PositiveFixedAngle"/>
|
||||||
|
<xsd:attribute name="sx" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="sy" use="optional" type="a:ST_Percentage"/>
|
||||||
|
<xsd:attribute name="kx" use="optional" type="a:ST_FixedAngle"/>
|
||||||
|
<xsd:attribute name="ky" use="optional" type="a:ST_FixedAngle"/>
|
||||||
|
<xsd:attribute name="algn" use="optional" type="ST_RectAlignment"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_FillTextEffect">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_FillProperties" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TextOutlineEffect">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_FillProperties" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_LineDashProperties" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_LineJoinProperties" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="w" use="optional" type="a:ST_LineWidth"/>
|
||||||
|
<xsd:attribute name="cap" use="optional" type="ST_LineCap"/>
|
||||||
|
<xsd:attribute name="cmpd" use="optional" type="ST_CompoundLine"/>
|
||||||
|
<xsd:attribute name="algn" use="optional" type="ST_PenAlignment"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Scene3D">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="camera" type="CT_Camera"/>
|
||||||
|
<xsd:element name="lightRig" type="CT_LightRig"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Props3D">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="bevelT" type="CT_Bevel" minOccurs="0"/>
|
||||||
|
<xsd:element name="bevelB" type="CT_Bevel" minOccurs="0"/>
|
||||||
|
<xsd:element name="extrusionClr" type="CT_Color" minOccurs="0"/>
|
||||||
|
<xsd:element name="contourClr" type="CT_Color" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="extrusionH" type="a:ST_PositiveCoordinate" use="optional"/>
|
||||||
|
<xsd:attribute name="contourW" type="a:ST_PositiveCoordinate" use="optional"/>
|
||||||
|
<xsd:attribute name="prstMaterial" type="ST_PresetMaterialType" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_RPrTextEffects">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="glow" minOccurs="0" type="CT_Glow"/>
|
||||||
|
<xsd:element name="shadow" minOccurs="0" type="CT_Shadow"/>
|
||||||
|
<xsd:element name="reflection" minOccurs="0" type="CT_Reflection"/>
|
||||||
|
<xsd:element name="textOutline" minOccurs="0" type="CT_TextOutlineEffect"/>
|
||||||
|
<xsd:element name="textFill" minOccurs="0" type="CT_FillTextEffect"/>
|
||||||
|
<xsd:element name="scene3d" minOccurs="0" type="CT_Scene3D"/>
|
||||||
|
<xsd:element name="props3d" minOccurs="0" type="CT_Props3D"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_Ligatures">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
<xsd:enumeration value="standard"/>
|
||||||
|
<xsd:enumeration value="contextual"/>
|
||||||
|
<xsd:enumeration value="historical"/>
|
||||||
|
<xsd:enumeration value="discretional"/>
|
||||||
|
<xsd:enumeration value="standardContextual"/>
|
||||||
|
<xsd:enumeration value="standardHistorical"/>
|
||||||
|
<xsd:enumeration value="contextualHistorical"/>
|
||||||
|
<xsd:enumeration value="standardDiscretional"/>
|
||||||
|
<xsd:enumeration value="contextualDiscretional"/>
|
||||||
|
<xsd:enumeration value="historicalDiscretional"/>
|
||||||
|
<xsd:enumeration value="standardContextualHistorical"/>
|
||||||
|
<xsd:enumeration value="standardContextualDiscretional"/>
|
||||||
|
<xsd:enumeration value="standardHistoricalDiscretional"/>
|
||||||
|
<xsd:enumeration value="contextualHistoricalDiscretional"/>
|
||||||
|
<xsd:enumeration value="all"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Ligatures">
|
||||||
|
<xsd:attribute name="val" type="ST_Ligatures" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_NumForm">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="default"/>
|
||||||
|
<xsd:enumeration value="lining"/>
|
||||||
|
<xsd:enumeration value="oldStyle"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_NumForm">
|
||||||
|
<xsd:attribute name="val" type="ST_NumForm" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_NumSpacing">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="default"/>
|
||||||
|
<xsd:enumeration value="proportional"/>
|
||||||
|
<xsd:enumeration value="tabular"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_NumSpacing">
|
||||||
|
<xsd:attribute name="val" type="ST_NumSpacing" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_StyleSet">
|
||||||
|
<xsd:attribute name="id" type="s:ST_UnsignedDecimalNumber" use="required"/>
|
||||||
|
<xsd:attribute name="val" type="ST_OnOff" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_StylisticSets">
|
||||||
|
<xsd:sequence minOccurs="0">
|
||||||
|
<xsd:element name="styleSet" minOccurs="0" maxOccurs="unbounded" type="CT_StyleSet"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_RPrOpenType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ligatures" minOccurs="0" type="CT_Ligatures"/>
|
||||||
|
<xsd:element name="numForm" minOccurs="0" type="CT_NumForm"/>
|
||||||
|
<xsd:element name="numSpacing" minOccurs="0" type="CT_NumSpacing"/>
|
||||||
|
<xsd:element name="stylisticSets" minOccurs="0" type="CT_StylisticSets"/>
|
||||||
|
<xsd:element name="cntxtAlts" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:element name="discardImageEditingData" type="CT_OnOff"/>
|
||||||
|
<xsd:element name="defaultImageDpi" type="CT_DefaultImageDpi"/>
|
||||||
|
<xsd:complexType name="CT_DefaultImageDpi">
|
||||||
|
<xsd:attribute name="val" type="w:ST_DecimalNumber" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="entityPicker" type="w:CT_Empty"/>
|
||||||
|
<xsd:complexType name="CT_SdtCheckboxSymbol">
|
||||||
|
<xsd:attribute name="font" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="val" type="w:ST_ShortHexNumber"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SdtCheckbox">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="checked" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="checkedState" type="CT_SdtCheckboxSymbol" minOccurs="0"/>
|
||||||
|
<xsd:element name="uncheckedState" type="CT_SdtCheckboxSymbol" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="checkbox" type="CT_SdtCheckbox"/>
|
||||||
|
</xsd:schema>
|
||||||
67
skills/docx/ooxml/schemas/microsoft/wml-2012.xsd
Normal file
67
skills/docx/ooxml/schemas/microsoft/wml-2012.xsd
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2012/wordml" targetNamespace="http://schemas.microsoft.com/office/word/2012/wordml">
|
||||||
|
<xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" schemaLocation="../ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:element name="color" type="w12:CT_Color"/>
|
||||||
|
<xsd:simpleType name="ST_SdtAppearance">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="boundingBox"/>
|
||||||
|
<xsd:enumeration value="tags"/>
|
||||||
|
<xsd:enumeration value="hidden"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:element name="dataBinding" type="w12:CT_DataBinding"/>
|
||||||
|
<xsd:complexType name="CT_SdtAppearance">
|
||||||
|
<xsd:attribute name="val" type="ST_SdtAppearance"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="appearance" type="CT_SdtAppearance"/>
|
||||||
|
<xsd:complexType name="CT_CommentsEx">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="commentEx" type="CT_CommentEx" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_CommentEx">
|
||||||
|
<xsd:attribute name="paraId" type="w12:ST_LongHexNumber" use="required"/>
|
||||||
|
<xsd:attribute name="paraIdParent" type="w12:ST_LongHexNumber" use="optional"/>
|
||||||
|
<xsd:attribute name="done" type="s:ST_OnOff" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="commentsEx" type="CT_CommentsEx"/>
|
||||||
|
<xsd:complexType name="CT_People">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="person" type="CT_Person" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PresenceInfo">
|
||||||
|
<xsd:attribute name="providerId" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="userId" type="xsd:string" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Person">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="presenceInfo" type="CT_PresenceInfo" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="author" type="s:ST_String" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="people" type="CT_People"/>
|
||||||
|
<xsd:complexType name="CT_SdtRepeatedSection">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sectionTitle" type="w12:CT_String" minOccurs="0"/>
|
||||||
|
<xsd:element name="doNotAllowInsertDeleteSection" type="w12:CT_OnOff" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Guid">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:pattern value="\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Guid">
|
||||||
|
<xsd:attribute name="val" type="ST_Guid"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="repeatingSection" type="CT_SdtRepeatedSection"/>
|
||||||
|
<xsd:element name="repeatingSectionItem" type="w12:CT_Empty"/>
|
||||||
|
<xsd:element name="chartTrackingRefBased" type="w12:CT_OnOff"/>
|
||||||
|
<xsd:element name="collapsed" type="w12:CT_OnOff"/>
|
||||||
|
<xsd:element name="docId" type="CT_Guid"/>
|
||||||
|
<xsd:element name="footnoteColumns" type="w12:CT_DecimalNumber"/>
|
||||||
|
<xsd:element name="webExtensionLinked" type="w12:CT_OnOff"/>
|
||||||
|
<xsd:element name="webExtensionCreated" type="w12:CT_OnOff"/>
|
||||||
|
<xsd:attribute name="restartNumberingAfterBreak" type="s:ST_OnOff"/>
|
||||||
|
</xsd:schema>
|
||||||
14
skills/docx/ooxml/schemas/microsoft/wml-2018.xsd
Normal file
14
skills/docx/ooxml/schemas/microsoft/wml-2018.xsd
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2018/wordml" targetNamespace="http://schemas.microsoft.com/office/word/2018/wordml">
|
||||||
|
<xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<xsd:complexType name="CT_Extension">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:any processContents="lax"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="uri" type="xsd:token"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ExtensionList">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ext" type="CT_Extension" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
20
skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd
Normal file
20
skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2018/wordml/cex" targetNamespace="http://schemas.microsoft.com/office/word/2018/wordml/cex">
|
||||||
|
<xsd:import id="w16" namespace="http://schemas.microsoft.com/office/word/2018/wordml" schemaLocation="wml-2018.xsd"/>
|
||||||
|
<xsd:import id="w" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<xsd:import id="s" namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes" schemaLocation="../ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:complexType name="CT_CommentsExtensible">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="commentExtensible" type="CT_CommentExtensible" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="extLst" type="w16:CT_ExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_CommentExtensible">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extLst" type="w16:CT_ExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="durableId" type="w:ST_LongHexNumber" use="required"/>
|
||||||
|
<xsd:attribute name="dateUtc" type="w:ST_DateTime" use="optional"/>
|
||||||
|
<xsd:attribute name="intelligentPlaceholder" type="s:ST_OnOff" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="commentsExtensible" type="CT_CommentsExtensible"/>
|
||||||
|
</xsd:schema>
|
||||||
13
skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd
Normal file
13
skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2016/wordml/cid" targetNamespace="http://schemas.microsoft.com/office/word/2016/wordml/cid">
|
||||||
|
<xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<xsd:complexType name="CT_CommentsIds">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="commentId" type="CT_CommentId" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_CommentId">
|
||||||
|
<xsd:attribute name="paraId" type="w12:ST_LongHexNumber" use="required"/>
|
||||||
|
<xsd:attribute name="durableId" type="w12:ST_LongHexNumber" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="commentsIds" type="CT_CommentsIds"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" targetNamespace="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash">
|
||||||
|
<xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<xsd:attribute name="storeItemChecksum" type="w12:ST_String"/>
|
||||||
|
</xsd:schema>
|
||||||
8
skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd
Normal file
8
skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:w12="http://schemas.openxmlformats.org/wordprocessingml/2006/main" elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all" xmlns="http://schemas.microsoft.com/office/word/2015/wordml/symex" targetNamespace="http://schemas.microsoft.com/office/word/2015/wordml/symex">
|
||||||
|
<xsd:import id="w12" namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main" schemaLocation="../ISO-IEC29500-4_2016/wml.xsd"/>
|
||||||
|
<xsd:complexType name="CT_SymEx">
|
||||||
|
<xsd:attribute name="font" type="w12:ST_String"/>
|
||||||
|
<xsd:attribute name="char" type="w12:ST_LongHexNumber"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="symEx" type="CT_SymEx"/>
|
||||||
|
</xsd:schema>
|
||||||
159
skills/docx/ooxml/scripts/pack.py
Normal file
159
skills/docx/ooxml/scripts/pack.py
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Tool to pack a directory into a .docx, .pptx, or .xlsx file with XML formatting undone.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
python pack.py <input_directory> <office_file> [--force]
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import defusedxml.minidom
|
||||||
|
import zipfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Pack a directory into an Office file")
|
||||||
|
parser.add_argument("input_directory", help="Unpacked Office document directory")
|
||||||
|
parser.add_argument("output_file", help="Output Office file (.docx/.pptx/.xlsx)")
|
||||||
|
parser.add_argument("--force", action="store_true", help="Skip validation")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
try:
|
||||||
|
success = pack_document(
|
||||||
|
args.input_directory, args.output_file, validate=not args.force
|
||||||
|
)
|
||||||
|
|
||||||
|
# Show warning if validation was skipped
|
||||||
|
if args.force:
|
||||||
|
print("Warning: Skipped validation, file may be corrupt", file=sys.stderr)
|
||||||
|
# Exit with error if validation failed
|
||||||
|
elif not success:
|
||||||
|
print("Contents would produce a corrupt file.", file=sys.stderr)
|
||||||
|
print("Please validate XML before repacking.", file=sys.stderr)
|
||||||
|
print("Use --force to skip validation and pack anyway.", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
except ValueError as e:
|
||||||
|
sys.exit(f"Error: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
def pack_document(input_dir, output_file, validate=False):
|
||||||
|
"""Pack a directory into an Office file (.docx/.pptx/.xlsx).
|
||||||
|
|
||||||
|
Args:
|
||||||
|
input_dir: Path to unpacked Office document directory
|
||||||
|
output_file: Path to output Office file
|
||||||
|
validate: If True, validates with soffice (default: False)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if successful, False if validation failed
|
||||||
|
"""
|
||||||
|
input_dir = Path(input_dir)
|
||||||
|
output_file = Path(output_file)
|
||||||
|
|
||||||
|
if not input_dir.is_dir():
|
||||||
|
raise ValueError(f"{input_dir} is not a directory")
|
||||||
|
if output_file.suffix.lower() not in {".docx", ".pptx", ".xlsx"}:
|
||||||
|
raise ValueError(f"{output_file} must be a .docx, .pptx, or .xlsx file")
|
||||||
|
|
||||||
|
# Work in temporary directory to avoid modifying original
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
temp_content_dir = Path(temp_dir) / "content"
|
||||||
|
shutil.copytree(input_dir, temp_content_dir)
|
||||||
|
|
||||||
|
# Process XML files to remove pretty-printing whitespace
|
||||||
|
for pattern in ["*.xml", "*.rels"]:
|
||||||
|
for xml_file in temp_content_dir.rglob(pattern):
|
||||||
|
condense_xml(xml_file)
|
||||||
|
|
||||||
|
# Create final Office file as zip archive
|
||||||
|
output_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
with zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED) as zf:
|
||||||
|
for f in temp_content_dir.rglob("*"):
|
||||||
|
if f.is_file():
|
||||||
|
zf.write(f, f.relative_to(temp_content_dir))
|
||||||
|
|
||||||
|
# Validate if requested
|
||||||
|
if validate:
|
||||||
|
if not validate_document(output_file):
|
||||||
|
output_file.unlink() # Delete the corrupt file
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def validate_document(doc_path):
|
||||||
|
"""Validate document by converting to HTML with soffice."""
|
||||||
|
# Determine the correct filter based on file extension
|
||||||
|
match doc_path.suffix.lower():
|
||||||
|
case ".docx":
|
||||||
|
filter_name = "html:HTML"
|
||||||
|
case ".pptx":
|
||||||
|
filter_name = "html:impress_html_Export"
|
||||||
|
case ".xlsx":
|
||||||
|
filter_name = "html:HTML (StarCalc)"
|
||||||
|
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
[
|
||||||
|
"soffice",
|
||||||
|
"--headless",
|
||||||
|
"--convert-to",
|
||||||
|
filter_name,
|
||||||
|
"--outdir",
|
||||||
|
temp_dir,
|
||||||
|
str(doc_path),
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
timeout=10,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
if not (Path(temp_dir) / f"{doc_path.stem}.html").exists():
|
||||||
|
error_msg = result.stderr.strip() or "Document validation failed"
|
||||||
|
print(f"Validation error: {error_msg}", file=sys.stderr)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("Warning: soffice not found. Skipping validation.", file=sys.stderr)
|
||||||
|
return True
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
print("Validation error: Timeout during conversion", file=sys.stderr)
|
||||||
|
return False
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Validation error: {e}", file=sys.stderr)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def condense_xml(xml_file):
|
||||||
|
"""Strip unnecessary whitespace and remove comments."""
|
||||||
|
with open(xml_file, "r", encoding="utf-8") as f:
|
||||||
|
dom = defusedxml.minidom.parse(f)
|
||||||
|
|
||||||
|
# Process each element to remove whitespace and comments
|
||||||
|
for element in dom.getElementsByTagName("*"):
|
||||||
|
# Skip w:t elements and their processing
|
||||||
|
if element.tagName.endswith(":t"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Remove whitespace-only text nodes and comment nodes
|
||||||
|
for child in list(element.childNodes):
|
||||||
|
if (
|
||||||
|
child.nodeType == child.TEXT_NODE
|
||||||
|
and child.nodeValue
|
||||||
|
and child.nodeValue.strip() == ""
|
||||||
|
) or child.nodeType == child.COMMENT_NODE:
|
||||||
|
element.removeChild(child)
|
||||||
|
|
||||||
|
# Write back the condensed XML
|
||||||
|
with open(xml_file, "wb") as f:
|
||||||
|
f.write(dom.toxml(encoding="UTF-8"))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
29
skills/docx/ooxml/scripts/unpack.py
Normal file
29
skills/docx/ooxml/scripts/unpack.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Unpack and format XML contents of Office files (.docx, .pptx, .xlsx)"""
|
||||||
|
|
||||||
|
import random
|
||||||
|
import sys
|
||||||
|
import defusedxml.minidom
|
||||||
|
import zipfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Get command line arguments
|
||||||
|
assert len(sys.argv) == 3, "Usage: python unpack.py <office_file> <output_dir>"
|
||||||
|
input_file, output_dir = sys.argv[1], sys.argv[2]
|
||||||
|
|
||||||
|
# Extract and format
|
||||||
|
output_path = Path(output_dir)
|
||||||
|
output_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
zipfile.ZipFile(input_file).extractall(output_path)
|
||||||
|
|
||||||
|
# Pretty print all XML files
|
||||||
|
xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels"))
|
||||||
|
for xml_file in xml_files:
|
||||||
|
content = xml_file.read_text(encoding="utf-8")
|
||||||
|
dom = defusedxml.minidom.parseString(content)
|
||||||
|
xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="ascii"))
|
||||||
|
|
||||||
|
# For .docx files, suggest an RSID for tracked changes
|
||||||
|
if input_file.endswith(".docx"):
|
||||||
|
suggested_rsid = "".join(random.choices("0123456789ABCDEF", k=8))
|
||||||
|
print(f"Suggested RSID for edit session: {suggested_rsid}")
|
||||||
69
skills/docx/ooxml/scripts/validate.py
Normal file
69
skills/docx/ooxml/scripts/validate.py
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Command line tool to validate Office document XML files against XSD schemas and tracked changes.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python validate.py <dir> --original <original_file>
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from validation import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Validate Office document XML files")
|
||||||
|
parser.add_argument(
|
||||||
|
"unpacked_dir",
|
||||||
|
help="Path to unpacked Office document directory",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--original",
|
||||||
|
required=True,
|
||||||
|
help="Path to original file (.docx/.pptx/.xlsx)",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-v",
|
||||||
|
"--verbose",
|
||||||
|
action="store_true",
|
||||||
|
help="Enable verbose output",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Validate paths
|
||||||
|
unpacked_dir = Path(args.unpacked_dir)
|
||||||
|
original_file = Path(args.original)
|
||||||
|
file_extension = original_file.suffix.lower()
|
||||||
|
assert unpacked_dir.is_dir(), f"Error: {unpacked_dir} is not a directory"
|
||||||
|
assert original_file.is_file(), f"Error: {original_file} is not a file"
|
||||||
|
assert file_extension in [".docx", ".pptx", ".xlsx"], (
|
||||||
|
f"Error: {original_file} must be a .docx, .pptx, or .xlsx file"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Run validations
|
||||||
|
match file_extension:
|
||||||
|
case ".docx":
|
||||||
|
validators = [DOCXSchemaValidator, RedliningValidator]
|
||||||
|
case ".pptx":
|
||||||
|
validators = [PPTXSchemaValidator]
|
||||||
|
case _:
|
||||||
|
print(f"Error: Validation not supported for file type {file_extension}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Run validators
|
||||||
|
success = True
|
||||||
|
for V in validators:
|
||||||
|
validator = V(unpacked_dir, original_file, verbose=args.verbose)
|
||||||
|
if not validator.validate():
|
||||||
|
success = False
|
||||||
|
|
||||||
|
if success:
|
||||||
|
print("All validations PASSED!")
|
||||||
|
|
||||||
|
sys.exit(0 if success else 1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
15
skills/docx/ooxml/scripts/validation/__init__.py
Normal file
15
skills/docx/ooxml/scripts/validation/__init__.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
"""
|
||||||
|
Validation modules for Word document processing.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .base import BaseSchemaValidator
|
||||||
|
from .docx import DOCXSchemaValidator
|
||||||
|
from .pptx import PPTXSchemaValidator
|
||||||
|
from .redlining import RedliningValidator
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"BaseSchemaValidator",
|
||||||
|
"DOCXSchemaValidator",
|
||||||
|
"PPTXSchemaValidator",
|
||||||
|
"RedliningValidator",
|
||||||
|
]
|
||||||
951
skills/docx/ooxml/scripts/validation/base.py
Normal file
951
skills/docx/ooxml/scripts/validation/base.py
Normal file
@@ -0,0 +1,951 @@
|
|||||||
|
"""
|
||||||
|
Base validator with common validation logic for document files.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
|
||||||
|
class BaseSchemaValidator:
|
||||||
|
"""Base validator with common validation logic for document files."""
|
||||||
|
|
||||||
|
# Elements whose 'id' attributes must be unique within their file
|
||||||
|
# Format: element_name -> (attribute_name, scope)
|
||||||
|
# scope can be 'file' (unique within file) or 'global' (unique across all files)
|
||||||
|
UNIQUE_ID_REQUIREMENTS = {
|
||||||
|
# Word elements
|
||||||
|
"comment": ("id", "file"), # Comment IDs in comments.xml
|
||||||
|
"commentrangestart": ("id", "file"), # Must match comment IDs
|
||||||
|
"commentrangeend": ("id", "file"), # Must match comment IDs
|
||||||
|
"bookmarkstart": ("id", "file"), # Bookmark start IDs
|
||||||
|
"bookmarkend": ("id", "file"), # Bookmark end IDs
|
||||||
|
# Note: ins and del (track changes) can share IDs when part of same revision
|
||||||
|
# PowerPoint elements
|
||||||
|
"sldid": ("id", "file"), # Slide IDs in presentation.xml
|
||||||
|
"sldmasterid": ("id", "global"), # Slide master IDs must be globally unique
|
||||||
|
"sldlayoutid": ("id", "global"), # Slide layout IDs must be globally unique
|
||||||
|
"cm": ("authorid", "file"), # Comment author IDs
|
||||||
|
# Excel elements
|
||||||
|
"sheet": ("sheetid", "file"), # Sheet IDs in workbook.xml
|
||||||
|
"definedname": ("id", "file"), # Named range IDs
|
||||||
|
# Drawing/Shape elements (all formats)
|
||||||
|
"cxnsp": ("id", "file"), # Connection shape IDs
|
||||||
|
"sp": ("id", "file"), # Shape IDs
|
||||||
|
"pic": ("id", "file"), # Picture IDs
|
||||||
|
"grpsp": ("id", "file"), # Group shape IDs
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mapping of element names to expected relationship types
|
||||||
|
# Subclasses should override this with format-specific mappings
|
||||||
|
ELEMENT_RELATIONSHIP_TYPES = {}
|
||||||
|
|
||||||
|
# Unified schema mappings for all Office document types
|
||||||
|
SCHEMA_MAPPINGS = {
|
||||||
|
# Document type specific schemas
|
||||||
|
"word": "ISO-IEC29500-4_2016/wml.xsd", # Word documents
|
||||||
|
"ppt": "ISO-IEC29500-4_2016/pml.xsd", # PowerPoint presentations
|
||||||
|
"xl": "ISO-IEC29500-4_2016/sml.xsd", # Excel spreadsheets
|
||||||
|
# Common file types
|
||||||
|
"[Content_Types].xml": "ecma/fouth-edition/opc-contentTypes.xsd",
|
||||||
|
"app.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd",
|
||||||
|
"core.xml": "ecma/fouth-edition/opc-coreProperties.xsd",
|
||||||
|
"custom.xml": "ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd",
|
||||||
|
".rels": "ecma/fouth-edition/opc-relationships.xsd",
|
||||||
|
# Word-specific files
|
||||||
|
"people.xml": "microsoft/wml-2012.xsd",
|
||||||
|
"commentsIds.xml": "microsoft/wml-cid-2016.xsd",
|
||||||
|
"commentsExtensible.xml": "microsoft/wml-cex-2018.xsd",
|
||||||
|
"commentsExtended.xml": "microsoft/wml-2012.xsd",
|
||||||
|
# Chart files (common across document types)
|
||||||
|
"chart": "ISO-IEC29500-4_2016/dml-chart.xsd",
|
||||||
|
# Theme files (common across document types)
|
||||||
|
"theme": "ISO-IEC29500-4_2016/dml-main.xsd",
|
||||||
|
# Drawing and media files
|
||||||
|
"drawing": "ISO-IEC29500-4_2016/dml-main.xsd",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Unified namespace constants
|
||||||
|
MC_NAMESPACE = "http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
|
||||||
|
|
||||||
|
# Common OOXML namespaces used across validators
|
||||||
|
PACKAGE_RELATIONSHIPS_NAMESPACE = (
|
||||||
|
"http://schemas.openxmlformats.org/package/2006/relationships"
|
||||||
|
)
|
||||||
|
OFFICE_RELATIONSHIPS_NAMESPACE = (
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
)
|
||||||
|
CONTENT_TYPES_NAMESPACE = (
|
||||||
|
"http://schemas.openxmlformats.org/package/2006/content-types"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Folders where we should clean ignorable namespaces
|
||||||
|
MAIN_CONTENT_FOLDERS = {"word", "ppt", "xl"}
|
||||||
|
|
||||||
|
# All allowed OOXML namespaces (superset of all document types)
|
||||||
|
OOXML_NAMESPACES = {
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/math",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
||||||
|
"http://schemas.openxmlformats.org/schemaLibrary/2006/main",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/main",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/chart",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/chartDrawing",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/diagram",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/picture",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing",
|
||||||
|
"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
|
||||||
|
"http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
||||||
|
"http://schemas.openxmlformats.org/presentationml/2006/main",
|
||||||
|
"http://schemas.openxmlformats.org/spreadsheetml/2006/main",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes",
|
||||||
|
"http://www.w3.org/XML/1998/namespace",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, unpacked_dir, original_file, verbose=False):
|
||||||
|
self.unpacked_dir = Path(unpacked_dir).resolve()
|
||||||
|
self.original_file = Path(original_file)
|
||||||
|
self.verbose = verbose
|
||||||
|
|
||||||
|
# Set schemas directory
|
||||||
|
self.schemas_dir = Path(__file__).parent.parent.parent / "schemas"
|
||||||
|
|
||||||
|
# Get all XML and .rels files
|
||||||
|
patterns = ["*.xml", "*.rels"]
|
||||||
|
self.xml_files = [
|
||||||
|
f for pattern in patterns for f in self.unpacked_dir.rglob(pattern)
|
||||||
|
]
|
||||||
|
|
||||||
|
if not self.xml_files:
|
||||||
|
print(f"Warning: No XML files found in {self.unpacked_dir}")
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
"""Run all validation checks and return True if all pass."""
|
||||||
|
raise NotImplementedError("Subclasses must implement the validate method")
|
||||||
|
|
||||||
|
def validate_xml(self):
|
||||||
|
"""Validate that all XML files are well-formed."""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
try:
|
||||||
|
# Try to parse the XML file
|
||||||
|
lxml.etree.parse(str(xml_file))
|
||||||
|
except lxml.etree.XMLSyntaxError as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {e.lineno}: {e.msg}"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Unexpected error: {str(e)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} XML violations:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All XML files are well-formed")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_namespaces(self):
|
||||||
|
"""Validate that namespace prefixes in Ignorable attributes are declared."""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
declared = set(root.nsmap.keys()) - {None} # Exclude default namespace
|
||||||
|
|
||||||
|
for attr_val in [
|
||||||
|
v for k, v in root.attrib.items() if k.endswith("Ignorable")
|
||||||
|
]:
|
||||||
|
undeclared = set(attr_val.split()) - declared
|
||||||
|
errors.extend(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Namespace '{ns}' in Ignorable but not declared"
|
||||||
|
for ns in undeclared
|
||||||
|
)
|
||||||
|
except lxml.etree.XMLSyntaxError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - {len(errors)} namespace issues:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All namespace prefixes properly declared")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_unique_ids(self):
|
||||||
|
"""Validate that specific IDs are unique according to OOXML requirements."""
|
||||||
|
errors = []
|
||||||
|
global_ids = {} # Track globally unique IDs across all files
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
file_ids = {} # Track IDs that must be unique within this file
|
||||||
|
|
||||||
|
# Remove all mc:AlternateContent elements from the tree
|
||||||
|
mc_elements = root.xpath(
|
||||||
|
".//mc:AlternateContent", namespaces={"mc": self.MC_NAMESPACE}
|
||||||
|
)
|
||||||
|
for elem in mc_elements:
|
||||||
|
elem.getparent().remove(elem)
|
||||||
|
|
||||||
|
# Now check IDs in the cleaned tree
|
||||||
|
for elem in root.iter():
|
||||||
|
# Get the element name without namespace
|
||||||
|
tag = (
|
||||||
|
elem.tag.split("}")[-1].lower()
|
||||||
|
if "}" in elem.tag
|
||||||
|
else elem.tag.lower()
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if this element type has ID uniqueness requirements
|
||||||
|
if tag in self.UNIQUE_ID_REQUIREMENTS:
|
||||||
|
attr_name, scope = self.UNIQUE_ID_REQUIREMENTS[tag]
|
||||||
|
|
||||||
|
# Look for the specified attribute
|
||||||
|
id_value = None
|
||||||
|
for attr, value in elem.attrib.items():
|
||||||
|
attr_local = (
|
||||||
|
attr.split("}")[-1].lower()
|
||||||
|
if "}" in attr
|
||||||
|
else attr.lower()
|
||||||
|
)
|
||||||
|
if attr_local == attr_name:
|
||||||
|
id_value = value
|
||||||
|
break
|
||||||
|
|
||||||
|
if id_value is not None:
|
||||||
|
if scope == "global":
|
||||||
|
# Check global uniqueness
|
||||||
|
if id_value in global_ids:
|
||||||
|
prev_file, prev_line, prev_tag = global_ids[
|
||||||
|
id_value
|
||||||
|
]
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {elem.sourceline}: Global ID '{id_value}' in <{tag}> "
|
||||||
|
f"already used in {prev_file} at line {prev_line} in <{prev_tag}>"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
global_ids[id_value] = (
|
||||||
|
xml_file.relative_to(self.unpacked_dir),
|
||||||
|
elem.sourceline,
|
||||||
|
tag,
|
||||||
|
)
|
||||||
|
elif scope == "file":
|
||||||
|
# Check file-level uniqueness
|
||||||
|
key = (tag, attr_name)
|
||||||
|
if key not in file_ids:
|
||||||
|
file_ids[key] = {}
|
||||||
|
|
||||||
|
if id_value in file_ids[key]:
|
||||||
|
prev_line = file_ids[key][id_value]
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {elem.sourceline}: Duplicate {attr_name}='{id_value}' in <{tag}> "
|
||||||
|
f"(first occurrence at line {prev_line})"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
file_ids[key][id_value] = elem.sourceline
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} ID uniqueness violations:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All required IDs are unique")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_file_references(self):
|
||||||
|
"""
|
||||||
|
Validate that all .rels files properly reference files and that all files are referenced.
|
||||||
|
"""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
# Find all .rels files
|
||||||
|
rels_files = list(self.unpacked_dir.rglob("*.rels"))
|
||||||
|
|
||||||
|
if not rels_files:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - No .rels files found")
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Get all files in the unpacked directory (excluding reference files)
|
||||||
|
all_files = []
|
||||||
|
for file_path in self.unpacked_dir.rglob("*"):
|
||||||
|
if (
|
||||||
|
file_path.is_file()
|
||||||
|
and file_path.name != "[Content_Types].xml"
|
||||||
|
and not file_path.name.endswith(".rels")
|
||||||
|
): # This file is not referenced by .rels
|
||||||
|
all_files.append(file_path.resolve())
|
||||||
|
|
||||||
|
# Track all files that are referenced by any .rels file
|
||||||
|
all_referenced_files = set()
|
||||||
|
|
||||||
|
if self.verbose:
|
||||||
|
print(
|
||||||
|
f"Found {len(rels_files)} .rels files and {len(all_files)} target files"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check each .rels file
|
||||||
|
for rels_file in rels_files:
|
||||||
|
try:
|
||||||
|
# Parse relationships file
|
||||||
|
rels_root = lxml.etree.parse(str(rels_file)).getroot()
|
||||||
|
|
||||||
|
# Get the directory where this .rels file is located
|
||||||
|
rels_dir = rels_file.parent
|
||||||
|
|
||||||
|
# Find all relationships and their targets
|
||||||
|
referenced_files = set()
|
||||||
|
broken_refs = []
|
||||||
|
|
||||||
|
for rel in rels_root.findall(
|
||||||
|
".//ns:Relationship",
|
||||||
|
namespaces={"ns": self.PACKAGE_RELATIONSHIPS_NAMESPACE},
|
||||||
|
):
|
||||||
|
target = rel.get("Target")
|
||||||
|
if target and not target.startswith(
|
||||||
|
("http", "mailto:")
|
||||||
|
): # Skip external URLs
|
||||||
|
# Resolve the target path relative to the .rels file location
|
||||||
|
if rels_file.name == ".rels":
|
||||||
|
# Root .rels file - targets are relative to unpacked_dir
|
||||||
|
target_path = self.unpacked_dir / target
|
||||||
|
else:
|
||||||
|
# Other .rels files - targets are relative to their parent's parent
|
||||||
|
# e.g., word/_rels/document.xml.rels -> targets relative to word/
|
||||||
|
base_dir = rels_dir.parent
|
||||||
|
target_path = base_dir / target
|
||||||
|
|
||||||
|
# Normalize the path and check if it exists
|
||||||
|
try:
|
||||||
|
target_path = target_path.resolve()
|
||||||
|
if target_path.exists() and target_path.is_file():
|
||||||
|
referenced_files.add(target_path)
|
||||||
|
all_referenced_files.add(target_path)
|
||||||
|
else:
|
||||||
|
broken_refs.append((target, rel.sourceline))
|
||||||
|
except (OSError, ValueError):
|
||||||
|
broken_refs.append((target, rel.sourceline))
|
||||||
|
|
||||||
|
# Report broken references
|
||||||
|
if broken_refs:
|
||||||
|
rel_path = rels_file.relative_to(self.unpacked_dir)
|
||||||
|
for broken_ref, line_num in broken_refs:
|
||||||
|
errors.append(
|
||||||
|
f" {rel_path}: Line {line_num}: Broken reference to {broken_ref}"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
rel_path = rels_file.relative_to(self.unpacked_dir)
|
||||||
|
errors.append(f" Error parsing {rel_path}: {e}")
|
||||||
|
|
||||||
|
# Check for unreferenced files (files that exist but are not referenced anywhere)
|
||||||
|
unreferenced_files = set(all_files) - all_referenced_files
|
||||||
|
|
||||||
|
if unreferenced_files:
|
||||||
|
for unref_file in sorted(unreferenced_files):
|
||||||
|
unref_rel_path = unref_file.relative_to(self.unpacked_dir)
|
||||||
|
errors.append(f" Unreferenced file: {unref_rel_path}")
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} relationship validation errors:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
print(
|
||||||
|
"CRITICAL: These errors will cause the document to appear corrupt. "
|
||||||
|
+ "Broken references MUST be fixed, "
|
||||||
|
+ "and unreferenced files MUST be referenced or removed."
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print(
|
||||||
|
"PASSED - All references are valid and all files are properly referenced"
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_all_relationship_ids(self):
|
||||||
|
"""
|
||||||
|
Validate that all r:id attributes in XML files reference existing IDs
|
||||||
|
in their corresponding .rels files, and optionally validate relationship types.
|
||||||
|
"""
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
# Process each XML file that might contain r:id references
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
# Skip .rels files themselves
|
||||||
|
if xml_file.suffix == ".rels":
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Determine the corresponding .rels file
|
||||||
|
# For dir/file.xml, it's dir/_rels/file.xml.rels
|
||||||
|
rels_dir = xml_file.parent / "_rels"
|
||||||
|
rels_file = rels_dir / f"{xml_file.name}.rels"
|
||||||
|
|
||||||
|
# Skip if there's no corresponding .rels file (that's okay)
|
||||||
|
if not rels_file.exists():
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Parse the .rels file to get valid relationship IDs and their types
|
||||||
|
rels_root = lxml.etree.parse(str(rels_file)).getroot()
|
||||||
|
rid_to_type = {}
|
||||||
|
|
||||||
|
for rel in rels_root.findall(
|
||||||
|
f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
|
||||||
|
):
|
||||||
|
rid = rel.get("Id")
|
||||||
|
rel_type = rel.get("Type", "")
|
||||||
|
if rid:
|
||||||
|
# Check for duplicate rIds
|
||||||
|
if rid in rid_to_type:
|
||||||
|
rels_rel_path = rels_file.relative_to(self.unpacked_dir)
|
||||||
|
errors.append(
|
||||||
|
f" {rels_rel_path}: Line {rel.sourceline}: "
|
||||||
|
f"Duplicate relationship ID '{rid}' (IDs must be unique)"
|
||||||
|
)
|
||||||
|
# Extract just the type name from the full URL
|
||||||
|
type_name = (
|
||||||
|
rel_type.split("/")[-1] if "/" in rel_type else rel_type
|
||||||
|
)
|
||||||
|
rid_to_type[rid] = type_name
|
||||||
|
|
||||||
|
# Parse the XML file to find all r:id references
|
||||||
|
xml_root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
|
||||||
|
# Find all elements with r:id attributes
|
||||||
|
for elem in xml_root.iter():
|
||||||
|
# Check for r:id attribute (relationship ID)
|
||||||
|
rid_attr = elem.get(f"{{{self.OFFICE_RELATIONSHIPS_NAMESPACE}}}id")
|
||||||
|
if rid_attr:
|
||||||
|
xml_rel_path = xml_file.relative_to(self.unpacked_dir)
|
||||||
|
elem_name = (
|
||||||
|
elem.tag.split("}")[-1] if "}" in elem.tag else elem.tag
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the ID exists
|
||||||
|
if rid_attr not in rid_to_type:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_rel_path}: Line {elem.sourceline}: "
|
||||||
|
f"<{elem_name}> references non-existent relationship '{rid_attr}' "
|
||||||
|
f"(valid IDs: {', '.join(sorted(rid_to_type.keys())[:5])}{'...' if len(rid_to_type) > 5 else ''})"
|
||||||
|
)
|
||||||
|
# Check if we have type expectations for this element
|
||||||
|
elif self.ELEMENT_RELATIONSHIP_TYPES:
|
||||||
|
expected_type = self._get_expected_relationship_type(
|
||||||
|
elem_name
|
||||||
|
)
|
||||||
|
if expected_type:
|
||||||
|
actual_type = rid_to_type[rid_attr]
|
||||||
|
# Check if the actual type matches or contains the expected type
|
||||||
|
if expected_type not in actual_type.lower():
|
||||||
|
errors.append(
|
||||||
|
f" {xml_rel_path}: Line {elem.sourceline}: "
|
||||||
|
f"<{elem_name}> references '{rid_attr}' which points to '{actual_type}' "
|
||||||
|
f"but should point to a '{expected_type}' relationship"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
xml_rel_path = xml_file.relative_to(self.unpacked_dir)
|
||||||
|
errors.append(f" Error processing {xml_rel_path}: {e}")
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} relationship ID reference errors:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
print("\nThese ID mismatches will cause the document to appear corrupt!")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All relationship ID references are valid")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _get_expected_relationship_type(self, element_name):
|
||||||
|
"""
|
||||||
|
Get the expected relationship type for an element.
|
||||||
|
First checks the explicit mapping, then tries pattern detection.
|
||||||
|
"""
|
||||||
|
# Normalize element name to lowercase
|
||||||
|
elem_lower = element_name.lower()
|
||||||
|
|
||||||
|
# Check explicit mapping first
|
||||||
|
if elem_lower in self.ELEMENT_RELATIONSHIP_TYPES:
|
||||||
|
return self.ELEMENT_RELATIONSHIP_TYPES[elem_lower]
|
||||||
|
|
||||||
|
# Try pattern detection for common patterns
|
||||||
|
# Pattern 1: Elements ending in "Id" often expect a relationship of the prefix type
|
||||||
|
if elem_lower.endswith("id") and len(elem_lower) > 2:
|
||||||
|
# e.g., "sldId" -> "sld", "sldMasterId" -> "sldMaster"
|
||||||
|
prefix = elem_lower[:-2] # Remove "id"
|
||||||
|
# Check if this might be a compound like "sldMasterId"
|
||||||
|
if prefix.endswith("master"):
|
||||||
|
return prefix.lower()
|
||||||
|
elif prefix.endswith("layout"):
|
||||||
|
return prefix.lower()
|
||||||
|
else:
|
||||||
|
# Simple case like "sldId" -> "slide"
|
||||||
|
# Common transformations
|
||||||
|
if prefix == "sld":
|
||||||
|
return "slide"
|
||||||
|
return prefix.lower()
|
||||||
|
|
||||||
|
# Pattern 2: Elements ending in "Reference" expect a relationship of the prefix type
|
||||||
|
if elem_lower.endswith("reference") and len(elem_lower) > 9:
|
||||||
|
prefix = elem_lower[:-9] # Remove "reference"
|
||||||
|
return prefix.lower()
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def validate_content_types(self):
|
||||||
|
"""Validate that all content files are properly declared in [Content_Types].xml."""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
# Find [Content_Types].xml file
|
||||||
|
content_types_file = self.unpacked_dir / "[Content_Types].xml"
|
||||||
|
if not content_types_file.exists():
|
||||||
|
print("FAILED - [Content_Types].xml file not found")
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Parse and get all declared parts and extensions
|
||||||
|
root = lxml.etree.parse(str(content_types_file)).getroot()
|
||||||
|
declared_parts = set()
|
||||||
|
declared_extensions = set()
|
||||||
|
|
||||||
|
# Get Override declarations (specific files)
|
||||||
|
for override in root.findall(
|
||||||
|
f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Override"
|
||||||
|
):
|
||||||
|
part_name = override.get("PartName")
|
||||||
|
if part_name is not None:
|
||||||
|
declared_parts.add(part_name.lstrip("/"))
|
||||||
|
|
||||||
|
# Get Default declarations (by extension)
|
||||||
|
for default in root.findall(
|
||||||
|
f".//{{{self.CONTENT_TYPES_NAMESPACE}}}Default"
|
||||||
|
):
|
||||||
|
extension = default.get("Extension")
|
||||||
|
if extension is not None:
|
||||||
|
declared_extensions.add(extension.lower())
|
||||||
|
|
||||||
|
# Root elements that require content type declaration
|
||||||
|
declarable_roots = {
|
||||||
|
"sld",
|
||||||
|
"sldLayout",
|
||||||
|
"sldMaster",
|
||||||
|
"presentation", # PowerPoint
|
||||||
|
"document", # Word
|
||||||
|
"workbook",
|
||||||
|
"worksheet", # Excel
|
||||||
|
"theme", # Common
|
||||||
|
}
|
||||||
|
|
||||||
|
# Common media file extensions that should be declared
|
||||||
|
media_extensions = {
|
||||||
|
"png": "image/png",
|
||||||
|
"jpg": "image/jpeg",
|
||||||
|
"jpeg": "image/jpeg",
|
||||||
|
"gif": "image/gif",
|
||||||
|
"bmp": "image/bmp",
|
||||||
|
"tiff": "image/tiff",
|
||||||
|
"wmf": "image/x-wmf",
|
||||||
|
"emf": "image/x-emf",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get all files in the unpacked directory
|
||||||
|
all_files = list(self.unpacked_dir.rglob("*"))
|
||||||
|
all_files = [f for f in all_files if f.is_file()]
|
||||||
|
|
||||||
|
# Check all XML files for Override declarations
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
path_str = str(xml_file.relative_to(self.unpacked_dir)).replace(
|
||||||
|
"\\", "/"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Skip non-content files
|
||||||
|
if any(
|
||||||
|
skip in path_str
|
||||||
|
for skip in [".rels", "[Content_Types]", "docProps/", "_rels/"]
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
root_tag = lxml.etree.parse(str(xml_file)).getroot().tag
|
||||||
|
root_name = root_tag.split("}")[-1] if "}" in root_tag else root_tag
|
||||||
|
|
||||||
|
if root_name in declarable_roots and path_str not in declared_parts:
|
||||||
|
errors.append(
|
||||||
|
f" {path_str}: File with <{root_name}> root not declared in [Content_Types].xml"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
continue # Skip unparseable files
|
||||||
|
|
||||||
|
# Check all non-XML files for Default extension declarations
|
||||||
|
for file_path in all_files:
|
||||||
|
# Skip XML files and metadata files (already checked above)
|
||||||
|
if file_path.suffix.lower() in {".xml", ".rels"}:
|
||||||
|
continue
|
||||||
|
if file_path.name == "[Content_Types].xml":
|
||||||
|
continue
|
||||||
|
if "_rels" in file_path.parts or "docProps" in file_path.parts:
|
||||||
|
continue
|
||||||
|
|
||||||
|
extension = file_path.suffix.lstrip(".").lower()
|
||||||
|
if extension and extension not in declared_extensions:
|
||||||
|
# Check if it's a known media extension that should be declared
|
||||||
|
if extension in media_extensions:
|
||||||
|
relative_path = file_path.relative_to(self.unpacked_dir)
|
||||||
|
errors.append(
|
||||||
|
f' {relative_path}: File with extension \'{extension}\' not declared in [Content_Types].xml - should add: <Default Extension="{extension}" ContentType="{media_extensions[extension]}"/>'
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
errors.append(f" Error parsing [Content_Types].xml: {e}")
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} content type declaration errors:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print(
|
||||||
|
"PASSED - All content files are properly declared in [Content_Types].xml"
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_file_against_xsd(self, xml_file, verbose=False):
|
||||||
|
"""Validate a single XML file against XSD schema, comparing with original.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
xml_file: Path to XML file to validate
|
||||||
|
verbose: Enable verbose output
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
tuple: (is_valid, new_errors_set) where is_valid is True/False/None (skipped)
|
||||||
|
"""
|
||||||
|
# Resolve both paths to handle symlinks
|
||||||
|
xml_file = Path(xml_file).resolve()
|
||||||
|
unpacked_dir = self.unpacked_dir.resolve()
|
||||||
|
|
||||||
|
# Validate current file
|
||||||
|
is_valid, current_errors = self._validate_single_file_xsd(
|
||||||
|
xml_file, unpacked_dir
|
||||||
|
)
|
||||||
|
|
||||||
|
if is_valid is None:
|
||||||
|
return None, set() # Skipped
|
||||||
|
elif is_valid:
|
||||||
|
return True, set() # Valid, no errors
|
||||||
|
|
||||||
|
# Get errors from original file for this specific file
|
||||||
|
original_errors = self._get_original_file_errors(xml_file)
|
||||||
|
|
||||||
|
# Compare with original (both are guaranteed to be sets here)
|
||||||
|
assert current_errors is not None
|
||||||
|
new_errors = current_errors - original_errors
|
||||||
|
|
||||||
|
if new_errors:
|
||||||
|
if verbose:
|
||||||
|
relative_path = xml_file.relative_to(unpacked_dir)
|
||||||
|
print(f"FAILED - {relative_path}: {len(new_errors)} new error(s)")
|
||||||
|
for error in list(new_errors)[:3]:
|
||||||
|
truncated = error[:250] + "..." if len(error) > 250 else error
|
||||||
|
print(f" - {truncated}")
|
||||||
|
return False, new_errors
|
||||||
|
else:
|
||||||
|
# All errors existed in original
|
||||||
|
if verbose:
|
||||||
|
print(
|
||||||
|
f"PASSED - No new errors (original had {len(current_errors)} errors)"
|
||||||
|
)
|
||||||
|
return True, set()
|
||||||
|
|
||||||
|
def validate_against_xsd(self):
|
||||||
|
"""Validate XML files against XSD schemas, showing only new errors compared to original."""
|
||||||
|
new_errors = []
|
||||||
|
original_error_count = 0
|
||||||
|
valid_count = 0
|
||||||
|
skipped_count = 0
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
relative_path = str(xml_file.relative_to(self.unpacked_dir))
|
||||||
|
is_valid, new_file_errors = self.validate_file_against_xsd(
|
||||||
|
xml_file, verbose=False
|
||||||
|
)
|
||||||
|
|
||||||
|
if is_valid is None:
|
||||||
|
skipped_count += 1
|
||||||
|
continue
|
||||||
|
elif is_valid and not new_file_errors:
|
||||||
|
valid_count += 1
|
||||||
|
continue
|
||||||
|
elif is_valid:
|
||||||
|
# Had errors but all existed in original
|
||||||
|
original_error_count += 1
|
||||||
|
valid_count += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Has new errors
|
||||||
|
new_errors.append(f" {relative_path}: {len(new_file_errors)} new error(s)")
|
||||||
|
for error in list(new_file_errors)[:3]: # Show first 3 errors
|
||||||
|
new_errors.append(
|
||||||
|
f" - {error[:250]}..." if len(error) > 250 else f" - {error}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Print summary
|
||||||
|
if self.verbose:
|
||||||
|
print(f"Validated {len(self.xml_files)} files:")
|
||||||
|
print(f" - Valid: {valid_count}")
|
||||||
|
print(f" - Skipped (no schema): {skipped_count}")
|
||||||
|
if original_error_count:
|
||||||
|
print(f" - With original errors (ignored): {original_error_count}")
|
||||||
|
print(
|
||||||
|
f" - With NEW errors: {len(new_errors) > 0 and len([e for e in new_errors if not e.startswith(' ')]) or 0}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if new_errors:
|
||||||
|
print("\nFAILED - Found NEW validation errors:")
|
||||||
|
for error in new_errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("\nPASSED - No new XSD validation errors introduced")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _get_schema_path(self, xml_file):
|
||||||
|
"""Determine the appropriate schema path for an XML file."""
|
||||||
|
# Check exact filename match
|
||||||
|
if xml_file.name in self.SCHEMA_MAPPINGS:
|
||||||
|
return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.name]
|
||||||
|
|
||||||
|
# Check .rels files
|
||||||
|
if xml_file.suffix == ".rels":
|
||||||
|
return self.schemas_dir / self.SCHEMA_MAPPINGS[".rels"]
|
||||||
|
|
||||||
|
# Check chart files
|
||||||
|
if "charts/" in str(xml_file) and xml_file.name.startswith("chart"):
|
||||||
|
return self.schemas_dir / self.SCHEMA_MAPPINGS["chart"]
|
||||||
|
|
||||||
|
# Check theme files
|
||||||
|
if "theme/" in str(xml_file) and xml_file.name.startswith("theme"):
|
||||||
|
return self.schemas_dir / self.SCHEMA_MAPPINGS["theme"]
|
||||||
|
|
||||||
|
# Check if file is in a main content folder and use appropriate schema
|
||||||
|
if xml_file.parent.name in self.MAIN_CONTENT_FOLDERS:
|
||||||
|
return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.parent.name]
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _clean_ignorable_namespaces(self, xml_doc):
|
||||||
|
"""Remove attributes and elements not in allowed namespaces."""
|
||||||
|
# Create a clean copy
|
||||||
|
xml_string = lxml.etree.tostring(xml_doc, encoding="unicode")
|
||||||
|
xml_copy = lxml.etree.fromstring(xml_string)
|
||||||
|
|
||||||
|
# Remove attributes not in allowed namespaces
|
||||||
|
for elem in xml_copy.iter():
|
||||||
|
attrs_to_remove = []
|
||||||
|
|
||||||
|
for attr in elem.attrib:
|
||||||
|
# Check if attribute is from a namespace other than allowed ones
|
||||||
|
if "{" in attr:
|
||||||
|
ns = attr.split("}")[0][1:]
|
||||||
|
if ns not in self.OOXML_NAMESPACES:
|
||||||
|
attrs_to_remove.append(attr)
|
||||||
|
|
||||||
|
# Remove collected attributes
|
||||||
|
for attr in attrs_to_remove:
|
||||||
|
del elem.attrib[attr]
|
||||||
|
|
||||||
|
# Remove elements not in allowed namespaces
|
||||||
|
self._remove_ignorable_elements(xml_copy)
|
||||||
|
|
||||||
|
return lxml.etree.ElementTree(xml_copy)
|
||||||
|
|
||||||
|
def _remove_ignorable_elements(self, root):
|
||||||
|
"""Recursively remove all elements not in allowed namespaces."""
|
||||||
|
elements_to_remove = []
|
||||||
|
|
||||||
|
# Find elements to remove
|
||||||
|
for elem in list(root):
|
||||||
|
# Skip non-element nodes (comments, processing instructions, etc.)
|
||||||
|
if not hasattr(elem, "tag") or callable(elem.tag):
|
||||||
|
continue
|
||||||
|
|
||||||
|
tag_str = str(elem.tag)
|
||||||
|
if tag_str.startswith("{"):
|
||||||
|
ns = tag_str.split("}")[0][1:]
|
||||||
|
if ns not in self.OOXML_NAMESPACES:
|
||||||
|
elements_to_remove.append(elem)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Recursively clean child elements
|
||||||
|
self._remove_ignorable_elements(elem)
|
||||||
|
|
||||||
|
# Remove collected elements
|
||||||
|
for elem in elements_to_remove:
|
||||||
|
root.remove(elem)
|
||||||
|
|
||||||
|
def _preprocess_for_mc_ignorable(self, xml_doc):
|
||||||
|
"""Preprocess XML to handle mc:Ignorable attribute properly."""
|
||||||
|
# Remove mc:Ignorable attributes before validation
|
||||||
|
root = xml_doc.getroot()
|
||||||
|
|
||||||
|
# Remove mc:Ignorable attribute from root
|
||||||
|
if f"{{{self.MC_NAMESPACE}}}Ignorable" in root.attrib:
|
||||||
|
del root.attrib[f"{{{self.MC_NAMESPACE}}}Ignorable"]
|
||||||
|
|
||||||
|
return xml_doc
|
||||||
|
|
||||||
|
def _validate_single_file_xsd(self, xml_file, base_path):
|
||||||
|
"""Validate a single XML file against XSD schema. Returns (is_valid, errors_set)."""
|
||||||
|
schema_path = self._get_schema_path(xml_file)
|
||||||
|
if not schema_path:
|
||||||
|
return None, None # Skip file
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Load schema
|
||||||
|
with open(schema_path, "rb") as xsd_file:
|
||||||
|
parser = lxml.etree.XMLParser()
|
||||||
|
xsd_doc = lxml.etree.parse(
|
||||||
|
xsd_file, parser=parser, base_url=str(schema_path)
|
||||||
|
)
|
||||||
|
schema = lxml.etree.XMLSchema(xsd_doc)
|
||||||
|
|
||||||
|
# Load and preprocess XML
|
||||||
|
with open(xml_file, "r") as f:
|
||||||
|
xml_doc = lxml.etree.parse(f)
|
||||||
|
|
||||||
|
xml_doc, _ = self._remove_template_tags_from_text_nodes(xml_doc)
|
||||||
|
xml_doc = self._preprocess_for_mc_ignorable(xml_doc)
|
||||||
|
|
||||||
|
# Clean ignorable namespaces if needed
|
||||||
|
relative_path = xml_file.relative_to(base_path)
|
||||||
|
if (
|
||||||
|
relative_path.parts
|
||||||
|
and relative_path.parts[0] in self.MAIN_CONTENT_FOLDERS
|
||||||
|
):
|
||||||
|
xml_doc = self._clean_ignorable_namespaces(xml_doc)
|
||||||
|
|
||||||
|
# Validate
|
||||||
|
if schema.validate(xml_doc):
|
||||||
|
return True, set()
|
||||||
|
else:
|
||||||
|
errors = set()
|
||||||
|
for error in schema.error_log:
|
||||||
|
# Store normalized error message (without line numbers for comparison)
|
||||||
|
errors.add(error.message)
|
||||||
|
return False, errors
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return False, {str(e)}
|
||||||
|
|
||||||
|
def _get_original_file_errors(self, xml_file):
|
||||||
|
"""Get XSD validation errors from a single file in the original document.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
xml_file: Path to the XML file in unpacked_dir to check
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
set: Set of error messages from the original file
|
||||||
|
"""
|
||||||
|
import tempfile
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
# Resolve both paths to handle symlinks (e.g., /var vs /private/var on macOS)
|
||||||
|
xml_file = Path(xml_file).resolve()
|
||||||
|
unpacked_dir = self.unpacked_dir.resolve()
|
||||||
|
relative_path = xml_file.relative_to(unpacked_dir)
|
||||||
|
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
temp_path = Path(temp_dir)
|
||||||
|
|
||||||
|
# Extract original file
|
||||||
|
with zipfile.ZipFile(self.original_file, "r") as zip_ref:
|
||||||
|
zip_ref.extractall(temp_path)
|
||||||
|
|
||||||
|
# Find corresponding file in original
|
||||||
|
original_xml_file = temp_path / relative_path
|
||||||
|
|
||||||
|
if not original_xml_file.exists():
|
||||||
|
# File didn't exist in original, so no original errors
|
||||||
|
return set()
|
||||||
|
|
||||||
|
# Validate the specific file in original
|
||||||
|
is_valid, errors = self._validate_single_file_xsd(
|
||||||
|
original_xml_file, temp_path
|
||||||
|
)
|
||||||
|
return errors if errors else set()
|
||||||
|
|
||||||
|
def _remove_template_tags_from_text_nodes(self, xml_doc):
|
||||||
|
"""Remove template tags from XML text nodes and collect warnings.
|
||||||
|
|
||||||
|
Template tags follow the pattern {{ ... }} and are used as placeholders
|
||||||
|
for content replacement. They should be removed from text content before
|
||||||
|
XSD validation while preserving XML structure.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
tuple: (cleaned_xml_doc, warnings_list)
|
||||||
|
"""
|
||||||
|
warnings = []
|
||||||
|
template_pattern = re.compile(r"\{\{[^}]*\}\}")
|
||||||
|
|
||||||
|
# Create a copy of the document to avoid modifying the original
|
||||||
|
xml_string = lxml.etree.tostring(xml_doc, encoding="unicode")
|
||||||
|
xml_copy = lxml.etree.fromstring(xml_string)
|
||||||
|
|
||||||
|
def process_text_content(text, content_type):
|
||||||
|
if not text:
|
||||||
|
return text
|
||||||
|
matches = list(template_pattern.finditer(text))
|
||||||
|
if matches:
|
||||||
|
for match in matches:
|
||||||
|
warnings.append(
|
||||||
|
f"Found template tag in {content_type}: {match.group()}"
|
||||||
|
)
|
||||||
|
return template_pattern.sub("", text)
|
||||||
|
return text
|
||||||
|
|
||||||
|
# Process all text nodes in the document
|
||||||
|
for elem in xml_copy.iter():
|
||||||
|
# Skip processing if this is a w:t element
|
||||||
|
if not hasattr(elem, "tag") or callable(elem.tag):
|
||||||
|
continue
|
||||||
|
tag_str = str(elem.tag)
|
||||||
|
if tag_str.endswith("}t") or tag_str == "t":
|
||||||
|
continue
|
||||||
|
|
||||||
|
elem.text = process_text_content(elem.text, "text content")
|
||||||
|
elem.tail = process_text_content(elem.tail, "tail content")
|
||||||
|
|
||||||
|
return lxml.etree.ElementTree(xml_copy), warnings
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise RuntimeError("This module should not be run directly.")
|
||||||
274
skills/docx/ooxml/scripts/validation/docx.py
Normal file
274
skills/docx/ooxml/scripts/validation/docx.py
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
"""
|
||||||
|
Validator for Word document XML files against XSD schemas.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import tempfile
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
from .base import BaseSchemaValidator
|
||||||
|
|
||||||
|
|
||||||
|
class DOCXSchemaValidator(BaseSchemaValidator):
|
||||||
|
"""Validator for Word document XML files against XSD schemas."""
|
||||||
|
|
||||||
|
# Word-specific namespace
|
||||||
|
WORD_2006_NAMESPACE = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
|
||||||
|
# Word-specific element to relationship type mappings
|
||||||
|
# Start with empty mapping - add specific cases as we discover them
|
||||||
|
ELEMENT_RELATIONSHIP_TYPES = {}
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
"""Run all validation checks and return True if all pass."""
|
||||||
|
# Test 0: XML well-formedness
|
||||||
|
if not self.validate_xml():
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Test 1: Namespace declarations
|
||||||
|
all_valid = True
|
||||||
|
if not self.validate_namespaces():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 2: Unique IDs
|
||||||
|
if not self.validate_unique_ids():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 3: Relationship and file reference validation
|
||||||
|
if not self.validate_file_references():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 4: Content type declarations
|
||||||
|
if not self.validate_content_types():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 5: XSD schema validation
|
||||||
|
if not self.validate_against_xsd():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 6: Whitespace preservation
|
||||||
|
if not self.validate_whitespace_preservation():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 7: Deletion validation
|
||||||
|
if not self.validate_deletions():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 8: Insertion validation
|
||||||
|
if not self.validate_insertions():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 9: Relationship ID reference validation
|
||||||
|
if not self.validate_all_relationship_ids():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Count and compare paragraphs
|
||||||
|
self.compare_paragraph_counts()
|
||||||
|
|
||||||
|
return all_valid
|
||||||
|
|
||||||
|
def validate_whitespace_preservation(self):
|
||||||
|
"""
|
||||||
|
Validate that w:t elements with whitespace have xml:space='preserve'.
|
||||||
|
"""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
# Only check document.xml files
|
||||||
|
if xml_file.name != "document.xml":
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
|
||||||
|
# Find all w:t elements
|
||||||
|
for elem in root.iter(f"{{{self.WORD_2006_NAMESPACE}}}t"):
|
||||||
|
if elem.text:
|
||||||
|
text = elem.text
|
||||||
|
# Check if text starts or ends with whitespace
|
||||||
|
if re.match(r"^\s.*", text) or re.match(r".*\s$", text):
|
||||||
|
# Check if xml:space="preserve" attribute exists
|
||||||
|
xml_space_attr = f"{{{self.XML_NAMESPACE}}}space"
|
||||||
|
if (
|
||||||
|
xml_space_attr not in elem.attrib
|
||||||
|
or elem.attrib[xml_space_attr] != "preserve"
|
||||||
|
):
|
||||||
|
# Show a preview of the text
|
||||||
|
text_preview = (
|
||||||
|
repr(text)[:50] + "..."
|
||||||
|
if len(repr(text)) > 50
|
||||||
|
else repr(text)
|
||||||
|
)
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {elem.sourceline}: w:t element with whitespace missing xml:space='preserve': {text_preview}"
|
||||||
|
)
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} whitespace preservation violations:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All whitespace is properly preserved")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_deletions(self):
|
||||||
|
"""
|
||||||
|
Validate that w:t elements are not within w:del elements.
|
||||||
|
For some reason, XSD validation does not catch this, so we do it manually.
|
||||||
|
"""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
# Only check document.xml files
|
||||||
|
if xml_file.name != "document.xml":
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
|
||||||
|
# Find all w:t elements that are descendants of w:del elements
|
||||||
|
namespaces = {"w": self.WORD_2006_NAMESPACE}
|
||||||
|
xpath_expression = ".//w:del//w:t"
|
||||||
|
problematic_t_elements = root.xpath(
|
||||||
|
xpath_expression, namespaces=namespaces
|
||||||
|
)
|
||||||
|
for t_elem in problematic_t_elements:
|
||||||
|
if t_elem.text:
|
||||||
|
# Show a preview of the text
|
||||||
|
text_preview = (
|
||||||
|
repr(t_elem.text)[:50] + "..."
|
||||||
|
if len(repr(t_elem.text)) > 50
|
||||||
|
else repr(t_elem.text)
|
||||||
|
)
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {t_elem.sourceline}: <w:t> found within <w:del>: {text_preview}"
|
||||||
|
)
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} deletion validation violations:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - No w:t elements found within w:del elements")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def count_paragraphs_in_unpacked(self):
|
||||||
|
"""Count the number of paragraphs in the unpacked document."""
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
# Only check document.xml files
|
||||||
|
if xml_file.name != "document.xml":
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
# Count all w:p elements
|
||||||
|
paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p")
|
||||||
|
count = len(paragraphs)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error counting paragraphs in unpacked document: {e}")
|
||||||
|
|
||||||
|
return count
|
||||||
|
|
||||||
|
def count_paragraphs_in_original(self):
|
||||||
|
"""Count the number of paragraphs in the original docx file."""
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Create temporary directory to unpack original
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
# Unpack original docx
|
||||||
|
with zipfile.ZipFile(self.original_file, "r") as zip_ref:
|
||||||
|
zip_ref.extractall(temp_dir)
|
||||||
|
|
||||||
|
# Parse document.xml
|
||||||
|
doc_xml_path = temp_dir + "/word/document.xml"
|
||||||
|
root = lxml.etree.parse(doc_xml_path).getroot()
|
||||||
|
|
||||||
|
# Count all w:p elements
|
||||||
|
paragraphs = root.findall(f".//{{{self.WORD_2006_NAMESPACE}}}p")
|
||||||
|
count = len(paragraphs)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error counting paragraphs in original document: {e}")
|
||||||
|
|
||||||
|
return count
|
||||||
|
|
||||||
|
def validate_insertions(self):
|
||||||
|
"""
|
||||||
|
Validate that w:delText elements are not within w:ins elements.
|
||||||
|
w:delText is only allowed in w:ins if nested within a w:del.
|
||||||
|
"""
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
if xml_file.name != "document.xml":
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
namespaces = {"w": self.WORD_2006_NAMESPACE}
|
||||||
|
|
||||||
|
# Find w:delText in w:ins that are NOT within w:del
|
||||||
|
invalid_elements = root.xpath(
|
||||||
|
".//w:ins//w:delText[not(ancestor::w:del)]",
|
||||||
|
namespaces=namespaces
|
||||||
|
)
|
||||||
|
|
||||||
|
for elem in invalid_elements:
|
||||||
|
text_preview = (
|
||||||
|
repr(elem.text or "")[:50] + "..."
|
||||||
|
if len(repr(elem.text or "")) > 50
|
||||||
|
else repr(elem.text or "")
|
||||||
|
)
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {elem.sourceline}: <w:delText> within <w:ins>: {text_preview}"
|
||||||
|
)
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} insertion validation violations:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - No w:delText elements within w:ins elements")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def compare_paragraph_counts(self):
|
||||||
|
"""Compare paragraph counts between original and new document."""
|
||||||
|
original_count = self.count_paragraphs_in_original()
|
||||||
|
new_count = self.count_paragraphs_in_unpacked()
|
||||||
|
|
||||||
|
diff = new_count - original_count
|
||||||
|
diff_str = f"+{diff}" if diff > 0 else str(diff)
|
||||||
|
print(f"\nParagraphs: {original_count} → {new_count} ({diff_str})")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise RuntimeError("This module should not be run directly.")
|
||||||
315
skills/docx/ooxml/scripts/validation/pptx.py
Normal file
315
skills/docx/ooxml/scripts/validation/pptx.py
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
"""
|
||||||
|
Validator for PowerPoint presentation XML files against XSD schemas.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
from .base import BaseSchemaValidator
|
||||||
|
|
||||||
|
|
||||||
|
class PPTXSchemaValidator(BaseSchemaValidator):
|
||||||
|
"""Validator for PowerPoint presentation XML files against XSD schemas."""
|
||||||
|
|
||||||
|
# PowerPoint presentation namespace
|
||||||
|
PRESENTATIONML_NAMESPACE = (
|
||||||
|
"http://schemas.openxmlformats.org/presentationml/2006/main"
|
||||||
|
)
|
||||||
|
|
||||||
|
# PowerPoint-specific element to relationship type mappings
|
||||||
|
ELEMENT_RELATIONSHIP_TYPES = {
|
||||||
|
"sldid": "slide",
|
||||||
|
"sldmasterid": "slidemaster",
|
||||||
|
"notesmasterid": "notesmaster",
|
||||||
|
"sldlayoutid": "slidelayout",
|
||||||
|
"themeid": "theme",
|
||||||
|
"tablestyleid": "tablestyles",
|
||||||
|
}
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
"""Run all validation checks and return True if all pass."""
|
||||||
|
# Test 0: XML well-formedness
|
||||||
|
if not self.validate_xml():
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Test 1: Namespace declarations
|
||||||
|
all_valid = True
|
||||||
|
if not self.validate_namespaces():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 2: Unique IDs
|
||||||
|
if not self.validate_unique_ids():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 3: UUID ID validation
|
||||||
|
if not self.validate_uuid_ids():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 4: Relationship and file reference validation
|
||||||
|
if not self.validate_file_references():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 5: Slide layout ID validation
|
||||||
|
if not self.validate_slide_layout_ids():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 6: Content type declarations
|
||||||
|
if not self.validate_content_types():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 7: XSD schema validation
|
||||||
|
if not self.validate_against_xsd():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 8: Notes slide reference validation
|
||||||
|
if not self.validate_notes_slide_references():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 9: Relationship ID reference validation
|
||||||
|
if not self.validate_all_relationship_ids():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
# Test 10: Duplicate slide layout references validation
|
||||||
|
if not self.validate_no_duplicate_slide_layouts():
|
||||||
|
all_valid = False
|
||||||
|
|
||||||
|
return all_valid
|
||||||
|
|
||||||
|
def validate_uuid_ids(self):
|
||||||
|
"""Validate that ID attributes that look like UUIDs contain only hex values."""
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
# UUID pattern: 8-4-4-4-12 hex digits with optional braces/hyphens
|
||||||
|
uuid_pattern = re.compile(
|
||||||
|
r"^[\{\(]?[0-9A-Fa-f]{8}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{12}[\}\)]?$"
|
||||||
|
)
|
||||||
|
|
||||||
|
for xml_file in self.xml_files:
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(xml_file)).getroot()
|
||||||
|
|
||||||
|
# Check all elements for ID attributes
|
||||||
|
for elem in root.iter():
|
||||||
|
for attr, value in elem.attrib.items():
|
||||||
|
# Check if this is an ID attribute
|
||||||
|
attr_name = attr.split("}")[-1].lower()
|
||||||
|
if attr_name == "id" or attr_name.endswith("id"):
|
||||||
|
# Check if value looks like a UUID (has the right length and pattern structure)
|
||||||
|
if self._looks_like_uuid(value):
|
||||||
|
# Validate that it contains only hex characters in the right positions
|
||||||
|
if not uuid_pattern.match(value):
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {elem.sourceline}: ID '{value}' appears to be a UUID but contains invalid hex characters"
|
||||||
|
)
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} UUID ID validation errors:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All UUID-like IDs contain valid hex values")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _looks_like_uuid(self, value):
|
||||||
|
"""Check if a value has the general structure of a UUID."""
|
||||||
|
# Remove common UUID delimiters
|
||||||
|
clean_value = value.strip("{}()").replace("-", "")
|
||||||
|
# Check if it's 32 hex-like characters (could include invalid hex chars)
|
||||||
|
return len(clean_value) == 32 and all(c.isalnum() for c in clean_value)
|
||||||
|
|
||||||
|
def validate_slide_layout_ids(self):
|
||||||
|
"""Validate that sldLayoutId elements in slide masters reference valid slide layouts."""
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
# Find all slide master files
|
||||||
|
slide_masters = list(self.unpacked_dir.glob("ppt/slideMasters/*.xml"))
|
||||||
|
|
||||||
|
if not slide_masters:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - No slide masters found")
|
||||||
|
return True
|
||||||
|
|
||||||
|
for slide_master in slide_masters:
|
||||||
|
try:
|
||||||
|
# Parse the slide master file
|
||||||
|
root = lxml.etree.parse(str(slide_master)).getroot()
|
||||||
|
|
||||||
|
# Find the corresponding _rels file for this slide master
|
||||||
|
rels_file = slide_master.parent / "_rels" / f"{slide_master.name}.rels"
|
||||||
|
|
||||||
|
if not rels_file.exists():
|
||||||
|
errors.append(
|
||||||
|
f" {slide_master.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Missing relationships file: {rels_file.relative_to(self.unpacked_dir)}"
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Parse the relationships file
|
||||||
|
rels_root = lxml.etree.parse(str(rels_file)).getroot()
|
||||||
|
|
||||||
|
# Build a set of valid relationship IDs that point to slide layouts
|
||||||
|
valid_layout_rids = set()
|
||||||
|
for rel in rels_root.findall(
|
||||||
|
f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
|
||||||
|
):
|
||||||
|
rel_type = rel.get("Type", "")
|
||||||
|
if "slideLayout" in rel_type:
|
||||||
|
valid_layout_rids.add(rel.get("Id"))
|
||||||
|
|
||||||
|
# Find all sldLayoutId elements in the slide master
|
||||||
|
for sld_layout_id in root.findall(
|
||||||
|
f".//{{{self.PRESENTATIONML_NAMESPACE}}}sldLayoutId"
|
||||||
|
):
|
||||||
|
r_id = sld_layout_id.get(
|
||||||
|
f"{{{self.OFFICE_RELATIONSHIPS_NAMESPACE}}}id"
|
||||||
|
)
|
||||||
|
layout_id = sld_layout_id.get("id")
|
||||||
|
|
||||||
|
if r_id and r_id not in valid_layout_rids:
|
||||||
|
errors.append(
|
||||||
|
f" {slide_master.relative_to(self.unpacked_dir)}: "
|
||||||
|
f"Line {sld_layout_id.sourceline}: sldLayoutId with id='{layout_id}' "
|
||||||
|
f"references r:id='{r_id}' which is not found in slide layout relationships"
|
||||||
|
)
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {slide_master.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"FAILED - Found {len(errors)} slide layout ID validation errors:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
print(
|
||||||
|
"Remove invalid references or add missing slide layouts to the relationships file."
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All slide layout IDs reference valid slide layouts")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_no_duplicate_slide_layouts(self):
|
||||||
|
"""Validate that each slide has exactly one slideLayout reference."""
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels"))
|
||||||
|
|
||||||
|
for rels_file in slide_rels_files:
|
||||||
|
try:
|
||||||
|
root = lxml.etree.parse(str(rels_file)).getroot()
|
||||||
|
|
||||||
|
# Find all slideLayout relationships
|
||||||
|
layout_rels = [
|
||||||
|
rel
|
||||||
|
for rel in root.findall(
|
||||||
|
f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
|
||||||
|
)
|
||||||
|
if "slideLayout" in rel.get("Type", "")
|
||||||
|
]
|
||||||
|
|
||||||
|
if len(layout_rels) > 1:
|
||||||
|
errors.append(
|
||||||
|
f" {rels_file.relative_to(self.unpacked_dir)}: has {len(layout_rels)} slideLayout references"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
errors.append(
|
||||||
|
f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print("FAILED - Found slides with duplicate slideLayout references:")
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All slides have exactly one slideLayout reference")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def validate_notes_slide_references(self):
|
||||||
|
"""Validate that each notesSlide file is referenced by only one slide."""
|
||||||
|
import lxml.etree
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
notes_slide_references = {} # Track which slides reference each notesSlide
|
||||||
|
|
||||||
|
# Find all slide relationship files
|
||||||
|
slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels"))
|
||||||
|
|
||||||
|
if not slide_rels_files:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - No slide relationship files found")
|
||||||
|
return True
|
||||||
|
|
||||||
|
for rels_file in slide_rels_files:
|
||||||
|
try:
|
||||||
|
# Parse the relationships file
|
||||||
|
root = lxml.etree.parse(str(rels_file)).getroot()
|
||||||
|
|
||||||
|
# Find all notesSlide relationships
|
||||||
|
for rel in root.findall(
|
||||||
|
f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
|
||||||
|
):
|
||||||
|
rel_type = rel.get("Type", "")
|
||||||
|
if "notesSlide" in rel_type:
|
||||||
|
target = rel.get("Target", "")
|
||||||
|
if target:
|
||||||
|
# Normalize the target path to handle relative paths
|
||||||
|
normalized_target = target.replace("../", "")
|
||||||
|
|
||||||
|
# Track which slide references this notesSlide
|
||||||
|
slide_name = rels_file.stem.replace(
|
||||||
|
".xml", ""
|
||||||
|
) # e.g., "slide1"
|
||||||
|
|
||||||
|
if normalized_target not in notes_slide_references:
|
||||||
|
notes_slide_references[normalized_target] = []
|
||||||
|
notes_slide_references[normalized_target].append(
|
||||||
|
(slide_name, rels_file)
|
||||||
|
)
|
||||||
|
|
||||||
|
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
||||||
|
errors.append(
|
||||||
|
f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check for duplicate references
|
||||||
|
for target, references in notes_slide_references.items():
|
||||||
|
if len(references) > 1:
|
||||||
|
slide_names = [ref[0] for ref in references]
|
||||||
|
errors.append(
|
||||||
|
f" Notes slide '{target}' is referenced by multiple slides: {', '.join(slide_names)}"
|
||||||
|
)
|
||||||
|
for slide_name, rels_file in references:
|
||||||
|
errors.append(f" - {rels_file.relative_to(self.unpacked_dir)}")
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(
|
||||||
|
f"FAILED - Found {len([e for e in errors if not e.startswith(' ')])} notes slide reference validation errors:"
|
||||||
|
)
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
print("Each slide may optionally have its own slide file.")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All notes slide references are unique")
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise RuntimeError("This module should not be run directly.")
|
||||||
279
skills/docx/ooxml/scripts/validation/redlining.py
Normal file
279
skills/docx/ooxml/scripts/validation/redlining.py
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
"""
|
||||||
|
Validator for tracked changes in Word documents.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
import zipfile
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
class RedliningValidator:
|
||||||
|
"""Validator for tracked changes in Word documents."""
|
||||||
|
|
||||||
|
def __init__(self, unpacked_dir, original_docx, verbose=False):
|
||||||
|
self.unpacked_dir = Path(unpacked_dir)
|
||||||
|
self.original_docx = Path(original_docx)
|
||||||
|
self.verbose = verbose
|
||||||
|
self.namespaces = {
|
||||||
|
"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
}
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
"""Main validation method that returns True if valid, False otherwise."""
|
||||||
|
# Verify unpacked directory exists and has correct structure
|
||||||
|
modified_file = self.unpacked_dir / "word" / "document.xml"
|
||||||
|
if not modified_file.exists():
|
||||||
|
print(f"FAILED - Modified document.xml not found at {modified_file}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# First, check if there are any tracked changes by Claude to validate
|
||||||
|
try:
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
tree = ET.parse(modified_file)
|
||||||
|
root = tree.getroot()
|
||||||
|
|
||||||
|
# Check for w:del or w:ins tags authored by Claude
|
||||||
|
del_elements = root.findall(".//w:del", self.namespaces)
|
||||||
|
ins_elements = root.findall(".//w:ins", self.namespaces)
|
||||||
|
|
||||||
|
# Filter to only include changes by Claude
|
||||||
|
claude_del_elements = [
|
||||||
|
elem
|
||||||
|
for elem in del_elements
|
||||||
|
if elem.get(f"{{{self.namespaces['w']}}}author") == "Claude"
|
||||||
|
]
|
||||||
|
claude_ins_elements = [
|
||||||
|
elem
|
||||||
|
for elem in ins_elements
|
||||||
|
if elem.get(f"{{{self.namespaces['w']}}}author") == "Claude"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Redlining validation is only needed if tracked changes by Claude have been used.
|
||||||
|
if not claude_del_elements and not claude_ins_elements:
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - No tracked changes by Claude found.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
# If we can't parse the XML, continue with full validation
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Create temporary directory for unpacking original docx
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
temp_path = Path(temp_dir)
|
||||||
|
|
||||||
|
# Unpack original docx
|
||||||
|
try:
|
||||||
|
with zipfile.ZipFile(self.original_docx, "r") as zip_ref:
|
||||||
|
zip_ref.extractall(temp_path)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"FAILED - Error unpacking original docx: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
original_file = temp_path / "word" / "document.xml"
|
||||||
|
if not original_file.exists():
|
||||||
|
print(
|
||||||
|
f"FAILED - Original document.xml not found in {self.original_docx}"
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Parse both XML files using xml.etree.ElementTree for redlining validation
|
||||||
|
try:
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
modified_tree = ET.parse(modified_file)
|
||||||
|
modified_root = modified_tree.getroot()
|
||||||
|
original_tree = ET.parse(original_file)
|
||||||
|
original_root = original_tree.getroot()
|
||||||
|
except ET.ParseError as e:
|
||||||
|
print(f"FAILED - Error parsing XML files: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Remove Claude's tracked changes from both documents
|
||||||
|
self._remove_claude_tracked_changes(original_root)
|
||||||
|
self._remove_claude_tracked_changes(modified_root)
|
||||||
|
|
||||||
|
# Extract and compare text content
|
||||||
|
modified_text = self._extract_text_content(modified_root)
|
||||||
|
original_text = self._extract_text_content(original_root)
|
||||||
|
|
||||||
|
if modified_text != original_text:
|
||||||
|
# Show detailed character-level differences for each paragraph
|
||||||
|
error_message = self._generate_detailed_diff(
|
||||||
|
original_text, modified_text
|
||||||
|
)
|
||||||
|
print(error_message)
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.verbose:
|
||||||
|
print("PASSED - All changes by Claude are properly tracked")
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _generate_detailed_diff(self, original_text, modified_text):
|
||||||
|
"""Generate detailed word-level differences using git word diff."""
|
||||||
|
error_parts = [
|
||||||
|
"FAILED - Document text doesn't match after removing Claude's tracked changes",
|
||||||
|
"",
|
||||||
|
"Likely causes:",
|
||||||
|
" 1. Modified text inside another author's <w:ins> or <w:del> tags",
|
||||||
|
" 2. Made edits without proper tracked changes",
|
||||||
|
" 3. Didn't nest <w:del> inside <w:ins> when deleting another's insertion",
|
||||||
|
"",
|
||||||
|
"For pre-redlined documents, use correct patterns:",
|
||||||
|
" - To reject another's INSERTION: Nest <w:del> inside their <w:ins>",
|
||||||
|
" - To restore another's DELETION: Add new <w:ins> AFTER their <w:del>",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Show git word diff
|
||||||
|
git_diff = self._get_git_word_diff(original_text, modified_text)
|
||||||
|
if git_diff:
|
||||||
|
error_parts.extend(["Differences:", "============", git_diff])
|
||||||
|
else:
|
||||||
|
error_parts.append("Unable to generate word diff (git not available)")
|
||||||
|
|
||||||
|
return "\n".join(error_parts)
|
||||||
|
|
||||||
|
def _get_git_word_diff(self, original_text, modified_text):
|
||||||
|
"""Generate word diff using git with character-level precision."""
|
||||||
|
try:
|
||||||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
temp_path = Path(temp_dir)
|
||||||
|
|
||||||
|
# Create two files
|
||||||
|
original_file = temp_path / "original.txt"
|
||||||
|
modified_file = temp_path / "modified.txt"
|
||||||
|
|
||||||
|
original_file.write_text(original_text, encoding="utf-8")
|
||||||
|
modified_file.write_text(modified_text, encoding="utf-8")
|
||||||
|
|
||||||
|
# Try character-level diff first for precise differences
|
||||||
|
result = subprocess.run(
|
||||||
|
[
|
||||||
|
"git",
|
||||||
|
"diff",
|
||||||
|
"--word-diff=plain",
|
||||||
|
"--word-diff-regex=.", # Character-by-character diff
|
||||||
|
"-U0", # Zero lines of context - show only changed lines
|
||||||
|
"--no-index",
|
||||||
|
str(original_file),
|
||||||
|
str(modified_file),
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.stdout.strip():
|
||||||
|
# Clean up the output - remove git diff header lines
|
||||||
|
lines = result.stdout.split("\n")
|
||||||
|
# Skip the header lines (diff --git, index, +++, ---, @@)
|
||||||
|
content_lines = []
|
||||||
|
in_content = False
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith("@@"):
|
||||||
|
in_content = True
|
||||||
|
continue
|
||||||
|
if in_content and line.strip():
|
||||||
|
content_lines.append(line)
|
||||||
|
|
||||||
|
if content_lines:
|
||||||
|
return "\n".join(content_lines)
|
||||||
|
|
||||||
|
# Fallback to word-level diff if character-level is too verbose
|
||||||
|
result = subprocess.run(
|
||||||
|
[
|
||||||
|
"git",
|
||||||
|
"diff",
|
||||||
|
"--word-diff=plain",
|
||||||
|
"-U0", # Zero lines of context
|
||||||
|
"--no-index",
|
||||||
|
str(original_file),
|
||||||
|
str(modified_file),
|
||||||
|
],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.stdout.strip():
|
||||||
|
lines = result.stdout.split("\n")
|
||||||
|
content_lines = []
|
||||||
|
in_content = False
|
||||||
|
for line in lines:
|
||||||
|
if line.startswith("@@"):
|
||||||
|
in_content = True
|
||||||
|
continue
|
||||||
|
if in_content and line.strip():
|
||||||
|
content_lines.append(line)
|
||||||
|
return "\n".join(content_lines)
|
||||||
|
|
||||||
|
except (subprocess.CalledProcessError, FileNotFoundError, Exception):
|
||||||
|
# Git not available or other error, return None to use fallback
|
||||||
|
pass
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _remove_claude_tracked_changes(self, root):
|
||||||
|
"""Remove tracked changes authored by Claude from the XML root."""
|
||||||
|
ins_tag = f"{{{self.namespaces['w']}}}ins"
|
||||||
|
del_tag = f"{{{self.namespaces['w']}}}del"
|
||||||
|
author_attr = f"{{{self.namespaces['w']}}}author"
|
||||||
|
|
||||||
|
# Remove w:ins elements
|
||||||
|
for parent in root.iter():
|
||||||
|
to_remove = []
|
||||||
|
for child in parent:
|
||||||
|
if child.tag == ins_tag and child.get(author_attr) == "Claude":
|
||||||
|
to_remove.append(child)
|
||||||
|
for elem in to_remove:
|
||||||
|
parent.remove(elem)
|
||||||
|
|
||||||
|
# Unwrap content in w:del elements where author is "Claude"
|
||||||
|
deltext_tag = f"{{{self.namespaces['w']}}}delText"
|
||||||
|
t_tag = f"{{{self.namespaces['w']}}}t"
|
||||||
|
|
||||||
|
for parent in root.iter():
|
||||||
|
to_process = []
|
||||||
|
for child in parent:
|
||||||
|
if child.tag == del_tag and child.get(author_attr) == "Claude":
|
||||||
|
to_process.append((child, list(parent).index(child)))
|
||||||
|
|
||||||
|
# Process in reverse order to maintain indices
|
||||||
|
for del_elem, del_index in reversed(to_process):
|
||||||
|
# Convert w:delText to w:t before moving
|
||||||
|
for elem in del_elem.iter():
|
||||||
|
if elem.tag == deltext_tag:
|
||||||
|
elem.tag = t_tag
|
||||||
|
|
||||||
|
# Move all children of w:del to its parent before removing w:del
|
||||||
|
for child in reversed(list(del_elem)):
|
||||||
|
parent.insert(del_index, child)
|
||||||
|
parent.remove(del_elem)
|
||||||
|
|
||||||
|
def _extract_text_content(self, root):
|
||||||
|
"""Extract text content from Word XML, preserving paragraph structure.
|
||||||
|
|
||||||
|
Empty paragraphs are skipped to avoid false positives when tracked
|
||||||
|
insertions add only structural elements without text content.
|
||||||
|
"""
|
||||||
|
p_tag = f"{{{self.namespaces['w']}}}p"
|
||||||
|
t_tag = f"{{{self.namespaces['w']}}}t"
|
||||||
|
|
||||||
|
paragraphs = []
|
||||||
|
for p_elem in root.findall(f".//{p_tag}"):
|
||||||
|
# Get all text elements within this paragraph
|
||||||
|
text_parts = []
|
||||||
|
for t_elem in p_elem.findall(f".//{t_tag}"):
|
||||||
|
if t_elem.text:
|
||||||
|
text_parts.append(t_elem.text)
|
||||||
|
paragraph_text = "".join(text_parts)
|
||||||
|
# Skip empty paragraphs - they don't affect content validation
|
||||||
|
if paragraph_text:
|
||||||
|
paragraphs.append(paragraph_text)
|
||||||
|
|
||||||
|
return "\n".join(paragraphs)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise RuntimeError("This module should not be run directly.")
|
||||||
1
skills/docx/scripts/__init__.py
Normal file
1
skills/docx/scripts/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Make scripts directory a package for relative imports in tests
|
||||||
1292
skills/docx/scripts/document.py
Normal file
1292
skills/docx/scripts/document.py
Normal file
File diff suppressed because it is too large
Load Diff
3
skills/docx/scripts/templates/comments.xml
Normal file
3
skills/docx/scripts/templates/comments.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<w:comments xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:oel="http://schemas.microsoft.com/office/2019/extlst" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16sdtfl="http://schemas.microsoft.com/office/word/2024/wordml/sdtformatlock" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16sdtfl w16du wp14">
|
||||||
|
</w:comments>
|
||||||
3
skills/docx/scripts/templates/commentsExtended.xml
Normal file
3
skills/docx/scripts/templates/commentsExtended.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<w15:commentsEx xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:oel="http://schemas.microsoft.com/office/2019/extlst" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16sdtfl="http://schemas.microsoft.com/office/word/2024/wordml/sdtformatlock" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16sdtfl w16du wp14">
|
||||||
|
</w15:commentsEx>
|
||||||
3
skills/docx/scripts/templates/commentsExtensible.xml
Normal file
3
skills/docx/scripts/templates/commentsExtensible.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<w16cex:commentsExtensible xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:oel="http://schemas.microsoft.com/office/2019/extlst" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16sdtfl="http://schemas.microsoft.com/office/word/2024/wordml/sdtformatlock" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:cr="http://schemas.microsoft.com/office/comments/2020/reactions" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16sdtfl cr w16du wp14">
|
||||||
|
</w16cex:commentsExtensible>
|
||||||
3
skills/docx/scripts/templates/commentsIds.xml
Normal file
3
skills/docx/scripts/templates/commentsIds.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<w16cid:commentsIds xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:oel="http://schemas.microsoft.com/office/2019/extlst" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16du="http://schemas.microsoft.com/office/word/2023/wordml/word16du" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16sdtfl="http://schemas.microsoft.com/office/word/2024/wordml/sdtformatlock" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh w16sdtfl w16du wp14">
|
||||||
|
</w16cid:commentsIds>
|
||||||
3
skills/docx/scripts/templates/people.xml
Normal file
3
skills/docx/scripts/templates/people.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<w15:people xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml">
|
||||||
|
</w15:people>
|
||||||
374
skills/docx/scripts/utilities.py
Normal file
374
skills/docx/scripts/utilities.py
Normal file
@@ -0,0 +1,374 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Utilities for editing OOXML documents.
|
||||||
|
|
||||||
|
This module provides XMLEditor, a tool for manipulating XML files with support for
|
||||||
|
line-number-based node finding and DOM manipulation. Each element is automatically
|
||||||
|
annotated with its original line and column position during parsing.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
editor = XMLEditor("document.xml")
|
||||||
|
|
||||||
|
# Find node by line number or range
|
||||||
|
elem = editor.get_node(tag="w:r", line_number=519)
|
||||||
|
elem = editor.get_node(tag="w:p", line_number=range(100, 200))
|
||||||
|
|
||||||
|
# Find node by text content
|
||||||
|
elem = editor.get_node(tag="w:p", contains="specific text")
|
||||||
|
|
||||||
|
# Find node by attributes
|
||||||
|
elem = editor.get_node(tag="w:r", attrs={"w:id": "target"})
|
||||||
|
|
||||||
|
# Combine filters
|
||||||
|
elem = editor.get_node(tag="w:p", line_number=range(1, 50), contains="text")
|
||||||
|
|
||||||
|
# Replace, insert, or manipulate
|
||||||
|
new_elem = editor.replace_node(elem, "<w:r><w:t>new text</w:t></w:r>")
|
||||||
|
editor.insert_after(new_elem, "<w:r><w:t>more</w:t></w:r>")
|
||||||
|
|
||||||
|
# Save changes
|
||||||
|
editor.save()
|
||||||
|
"""
|
||||||
|
|
||||||
|
import html
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional, Union
|
||||||
|
|
||||||
|
import defusedxml.minidom
|
||||||
|
import defusedxml.sax
|
||||||
|
|
||||||
|
|
||||||
|
class XMLEditor:
|
||||||
|
"""
|
||||||
|
Editor for manipulating OOXML XML files with line-number-based node finding.
|
||||||
|
|
||||||
|
This class parses XML files and tracks the original line and column position
|
||||||
|
of each element. This enables finding nodes by their line number in the original
|
||||||
|
file, which is useful when working with Read tool output.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
xml_path: Path to the XML file being edited
|
||||||
|
encoding: Detected encoding of the XML file ('ascii' or 'utf-8')
|
||||||
|
dom: Parsed DOM tree with parse_position attributes on elements
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, xml_path):
|
||||||
|
"""
|
||||||
|
Initialize with path to XML file and parse with line number tracking.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
xml_path: Path to XML file to edit (str or Path)
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: If the XML file does not exist
|
||||||
|
"""
|
||||||
|
self.xml_path = Path(xml_path)
|
||||||
|
if not self.xml_path.exists():
|
||||||
|
raise ValueError(f"XML file not found: {xml_path}")
|
||||||
|
|
||||||
|
with open(self.xml_path, "rb") as f:
|
||||||
|
header = f.read(200).decode("utf-8", errors="ignore")
|
||||||
|
self.encoding = "ascii" if 'encoding="ascii"' in header else "utf-8"
|
||||||
|
|
||||||
|
parser = _create_line_tracking_parser()
|
||||||
|
self.dom = defusedxml.minidom.parse(str(self.xml_path), parser)
|
||||||
|
|
||||||
|
def get_node(
|
||||||
|
self,
|
||||||
|
tag: str,
|
||||||
|
attrs: Optional[dict[str, str]] = None,
|
||||||
|
line_number: Optional[Union[int, range]] = None,
|
||||||
|
contains: Optional[str] = None,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Get a DOM element by tag and identifier.
|
||||||
|
|
||||||
|
Finds an element by either its line number in the original file or by
|
||||||
|
matching attribute values. Exactly one match must be found.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
tag: The XML tag name (e.g., "w:del", "w:ins", "w:r")
|
||||||
|
attrs: Dictionary of attribute name-value pairs to match (e.g., {"w:id": "1"})
|
||||||
|
line_number: Line number (int) or line range (range) in original XML file (1-indexed)
|
||||||
|
contains: Text string that must appear in any text node within the element.
|
||||||
|
Supports both entity notation (“) and Unicode characters (\u201c).
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
defusedxml.minidom.Element: The matching DOM element
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ValueError: If node not found or multiple matches found
|
||||||
|
|
||||||
|
Example:
|
||||||
|
elem = editor.get_node(tag="w:r", line_number=519)
|
||||||
|
elem = editor.get_node(tag="w:r", line_number=range(100, 200))
|
||||||
|
elem = editor.get_node(tag="w:del", attrs={"w:id": "1"})
|
||||||
|
elem = editor.get_node(tag="w:p", attrs={"w14:paraId": "12345678"})
|
||||||
|
elem = editor.get_node(tag="w:commentRangeStart", attrs={"w:id": "0"})
|
||||||
|
elem = editor.get_node(tag="w:p", contains="specific text")
|
||||||
|
elem = editor.get_node(tag="w:t", contains="“Agreement") # Entity notation
|
||||||
|
elem = editor.get_node(tag="w:t", contains="\u201cAgreement") # Unicode character
|
||||||
|
"""
|
||||||
|
matches = []
|
||||||
|
for elem in self.dom.getElementsByTagName(tag):
|
||||||
|
# Check line_number filter
|
||||||
|
if line_number is not None:
|
||||||
|
parse_pos = getattr(elem, "parse_position", (None,))
|
||||||
|
elem_line = parse_pos[0]
|
||||||
|
|
||||||
|
# Handle both single line number and range
|
||||||
|
if isinstance(line_number, range):
|
||||||
|
if elem_line not in line_number:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if elem_line != line_number:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check attrs filter
|
||||||
|
if attrs is not None:
|
||||||
|
if not all(
|
||||||
|
elem.getAttribute(attr_name) == attr_value
|
||||||
|
for attr_name, attr_value in attrs.items()
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check contains filter
|
||||||
|
if contains is not None:
|
||||||
|
elem_text = self._get_element_text(elem)
|
||||||
|
# Normalize the search string: convert HTML entities to Unicode characters
|
||||||
|
# This allows searching for both "“Rowan" and ""Rowan"
|
||||||
|
normalized_contains = html.unescape(contains)
|
||||||
|
if normalized_contains not in elem_text:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# If all applicable filters passed, this is a match
|
||||||
|
matches.append(elem)
|
||||||
|
|
||||||
|
if not matches:
|
||||||
|
# Build descriptive error message
|
||||||
|
filters = []
|
||||||
|
if line_number is not None:
|
||||||
|
line_str = (
|
||||||
|
f"lines {line_number.start}-{line_number.stop - 1}"
|
||||||
|
if isinstance(line_number, range)
|
||||||
|
else f"line {line_number}"
|
||||||
|
)
|
||||||
|
filters.append(f"at {line_str}")
|
||||||
|
if attrs is not None:
|
||||||
|
filters.append(f"with attributes {attrs}")
|
||||||
|
if contains is not None:
|
||||||
|
filters.append(f"containing '{contains}'")
|
||||||
|
|
||||||
|
filter_desc = " ".join(filters) if filters else ""
|
||||||
|
base_msg = f"Node not found: <{tag}> {filter_desc}".strip()
|
||||||
|
|
||||||
|
# Add helpful hint based on filters used
|
||||||
|
if contains:
|
||||||
|
hint = "Text may be split across elements or use different wording."
|
||||||
|
elif line_number:
|
||||||
|
hint = "Line numbers may have changed if document was modified."
|
||||||
|
elif attrs:
|
||||||
|
hint = "Verify attribute values are correct."
|
||||||
|
else:
|
||||||
|
hint = "Try adding filters (attrs, line_number, or contains)."
|
||||||
|
|
||||||
|
raise ValueError(f"{base_msg}. {hint}")
|
||||||
|
if len(matches) > 1:
|
||||||
|
raise ValueError(
|
||||||
|
f"Multiple nodes found: <{tag}>. "
|
||||||
|
f"Add more filters (attrs, line_number, or contains) to narrow the search."
|
||||||
|
)
|
||||||
|
return matches[0]
|
||||||
|
|
||||||
|
def _get_element_text(self, elem):
|
||||||
|
"""
|
||||||
|
Recursively extract all text content from an element.
|
||||||
|
|
||||||
|
Skips text nodes that contain only whitespace (spaces, tabs, newlines),
|
||||||
|
which typically represent XML formatting rather than document content.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
elem: defusedxml.minidom.Element to extract text from
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: Concatenated text from all non-whitespace text nodes within the element
|
||||||
|
"""
|
||||||
|
text_parts = []
|
||||||
|
for node in elem.childNodes:
|
||||||
|
if node.nodeType == node.TEXT_NODE:
|
||||||
|
# Skip whitespace-only text nodes (XML formatting)
|
||||||
|
if node.data.strip():
|
||||||
|
text_parts.append(node.data)
|
||||||
|
elif node.nodeType == node.ELEMENT_NODE:
|
||||||
|
text_parts.append(self._get_element_text(node))
|
||||||
|
return "".join(text_parts)
|
||||||
|
|
||||||
|
def replace_node(self, elem, new_content):
|
||||||
|
"""
|
||||||
|
Replace a DOM element with new XML content.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
elem: defusedxml.minidom.Element to replace
|
||||||
|
new_content: String containing XML to replace the node with
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[defusedxml.minidom.Node]: All inserted nodes
|
||||||
|
|
||||||
|
Example:
|
||||||
|
new_nodes = editor.replace_node(old_elem, "<w:r><w:t>text</w:t></w:r>")
|
||||||
|
"""
|
||||||
|
parent = elem.parentNode
|
||||||
|
nodes = self._parse_fragment(new_content)
|
||||||
|
for node in nodes:
|
||||||
|
parent.insertBefore(node, elem)
|
||||||
|
parent.removeChild(elem)
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
def insert_after(self, elem, xml_content):
|
||||||
|
"""
|
||||||
|
Insert XML content after a DOM element.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
elem: defusedxml.minidom.Element to insert after
|
||||||
|
xml_content: String containing XML to insert
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[defusedxml.minidom.Node]: All inserted nodes
|
||||||
|
|
||||||
|
Example:
|
||||||
|
new_nodes = editor.insert_after(elem, "<w:r><w:t>text</w:t></w:r>")
|
||||||
|
"""
|
||||||
|
parent = elem.parentNode
|
||||||
|
next_sibling = elem.nextSibling
|
||||||
|
nodes = self._parse_fragment(xml_content)
|
||||||
|
for node in nodes:
|
||||||
|
if next_sibling:
|
||||||
|
parent.insertBefore(node, next_sibling)
|
||||||
|
else:
|
||||||
|
parent.appendChild(node)
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
def insert_before(self, elem, xml_content):
|
||||||
|
"""
|
||||||
|
Insert XML content before a DOM element.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
elem: defusedxml.minidom.Element to insert before
|
||||||
|
xml_content: String containing XML to insert
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[defusedxml.minidom.Node]: All inserted nodes
|
||||||
|
|
||||||
|
Example:
|
||||||
|
new_nodes = editor.insert_before(elem, "<w:r><w:t>text</w:t></w:r>")
|
||||||
|
"""
|
||||||
|
parent = elem.parentNode
|
||||||
|
nodes = self._parse_fragment(xml_content)
|
||||||
|
for node in nodes:
|
||||||
|
parent.insertBefore(node, elem)
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
def append_to(self, elem, xml_content):
|
||||||
|
"""
|
||||||
|
Append XML content as a child of a DOM element.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
elem: defusedxml.minidom.Element to append to
|
||||||
|
xml_content: String containing XML to append
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[defusedxml.minidom.Node]: All inserted nodes
|
||||||
|
|
||||||
|
Example:
|
||||||
|
new_nodes = editor.append_to(elem, "<w:r><w:t>text</w:t></w:r>")
|
||||||
|
"""
|
||||||
|
nodes = self._parse_fragment(xml_content)
|
||||||
|
for node in nodes:
|
||||||
|
elem.appendChild(node)
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
def get_next_rid(self):
|
||||||
|
"""Get the next available rId for relationships files."""
|
||||||
|
max_id = 0
|
||||||
|
for rel_elem in self.dom.getElementsByTagName("Relationship"):
|
||||||
|
rel_id = rel_elem.getAttribute("Id")
|
||||||
|
if rel_id.startswith("rId"):
|
||||||
|
try:
|
||||||
|
max_id = max(max_id, int(rel_id[3:]))
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
return f"rId{max_id + 1}"
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
"""
|
||||||
|
Save the edited XML back to the file.
|
||||||
|
|
||||||
|
Serializes the DOM tree and writes it back to the original file path,
|
||||||
|
preserving the original encoding (ascii or utf-8).
|
||||||
|
"""
|
||||||
|
content = self.dom.toxml(encoding=self.encoding)
|
||||||
|
self.xml_path.write_bytes(content)
|
||||||
|
|
||||||
|
def _parse_fragment(self, xml_content):
|
||||||
|
"""
|
||||||
|
Parse XML fragment and return list of imported nodes.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
xml_content: String containing XML fragment
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of defusedxml.minidom.Node objects imported into this document
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: If fragment contains no element nodes
|
||||||
|
"""
|
||||||
|
# Extract namespace declarations from the root document element
|
||||||
|
root_elem = self.dom.documentElement
|
||||||
|
namespaces = []
|
||||||
|
if root_elem and root_elem.attributes:
|
||||||
|
for i in range(root_elem.attributes.length):
|
||||||
|
attr = root_elem.attributes.item(i)
|
||||||
|
if attr.name.startswith("xmlns"): # type: ignore
|
||||||
|
namespaces.append(f'{attr.name}="{attr.value}"') # type: ignore
|
||||||
|
|
||||||
|
ns_decl = " ".join(namespaces)
|
||||||
|
wrapper = f"<root {ns_decl}>{xml_content}</root>"
|
||||||
|
fragment_doc = defusedxml.minidom.parseString(wrapper)
|
||||||
|
nodes = [
|
||||||
|
self.dom.importNode(child, deep=True)
|
||||||
|
for child in fragment_doc.documentElement.childNodes # type: ignore
|
||||||
|
]
|
||||||
|
elements = [n for n in nodes if n.nodeType == n.ELEMENT_NODE]
|
||||||
|
assert elements, "Fragment must contain at least one element"
|
||||||
|
return nodes
|
||||||
|
|
||||||
|
|
||||||
|
def _create_line_tracking_parser():
|
||||||
|
"""
|
||||||
|
Create a SAX parser that tracks line and column numbers for each element.
|
||||||
|
|
||||||
|
Monkey patches the SAX content handler to store the current line and column
|
||||||
|
position from the underlying expat parser onto each element as a parse_position
|
||||||
|
attribute (line, column) tuple.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
defusedxml.sax.xmlreader.XMLReader: Configured SAX parser
|
||||||
|
"""
|
||||||
|
|
||||||
|
def set_content_handler(dom_handler):
|
||||||
|
def startElementNS(name, tagName, attrs):
|
||||||
|
orig_start_cb(name, tagName, attrs)
|
||||||
|
cur_elem = dom_handler.elementStack[-1]
|
||||||
|
cur_elem.parse_position = (
|
||||||
|
parser._parser.CurrentLineNumber, # type: ignore
|
||||||
|
parser._parser.CurrentColumnNumber, # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
orig_start_cb = dom_handler.startElementNS
|
||||||
|
dom_handler.startElementNS = startElementNS
|
||||||
|
orig_set_content_handler(dom_handler)
|
||||||
|
|
||||||
|
parser = defusedxml.sax.make_parser()
|
||||||
|
orig_set_content_handler = parser.setContentHandler
|
||||||
|
parser.setContentHandler = set_content_handler # type: ignore
|
||||||
|
return parser
|
||||||
205
skills/pdf/FORMS.md
Normal file
205
skills/pdf/FORMS.md
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
**CRITICAL: You MUST complete these steps in order. Do not skip ahead to writing code.**
|
||||||
|
|
||||||
|
If you need to fill out a PDF form, first check to see if the PDF has fillable form fields. Run this script from this file's directory:
|
||||||
|
`python scripts/check_fillable_fields <file.pdf>`, and depending on the result go to either the "Fillable fields" or "Non-fillable fields" and follow those instructions.
|
||||||
|
|
||||||
|
# Fillable fields
|
||||||
|
If the PDF has fillable form fields:
|
||||||
|
- Run this script from this file's directory: `python scripts/extract_form_field_info.py <input.pdf> <field_info.json>`. It will create a JSON file with a list of fields in this format:
|
||||||
|
```
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"field_id": (unique ID for the field),
|
||||||
|
"page": (page number, 1-based),
|
||||||
|
"rect": ([left, bottom, right, top] bounding box in PDF coordinates, y=0 is the bottom of the page),
|
||||||
|
"type": ("text", "checkbox", "radio_group", or "choice"),
|
||||||
|
},
|
||||||
|
// Checkboxes have "checked_value" and "unchecked_value" properties:
|
||||||
|
{
|
||||||
|
"field_id": (unique ID for the field),
|
||||||
|
"page": (page number, 1-based),
|
||||||
|
"type": "checkbox",
|
||||||
|
"checked_value": (Set the field to this value to check the checkbox),
|
||||||
|
"unchecked_value": (Set the field to this value to uncheck the checkbox),
|
||||||
|
},
|
||||||
|
// Radio groups have a "radio_options" list with the possible choices.
|
||||||
|
{
|
||||||
|
"field_id": (unique ID for the field),
|
||||||
|
"page": (page number, 1-based),
|
||||||
|
"type": "radio_group",
|
||||||
|
"radio_options": [
|
||||||
|
{
|
||||||
|
"value": (set the field to this value to select this radio option),
|
||||||
|
"rect": (bounding box for the radio button for this option)
|
||||||
|
},
|
||||||
|
// Other radio options
|
||||||
|
]
|
||||||
|
},
|
||||||
|
// Multiple choice fields have a "choice_options" list with the possible choices:
|
||||||
|
{
|
||||||
|
"field_id": (unique ID for the field),
|
||||||
|
"page": (page number, 1-based),
|
||||||
|
"type": "choice",
|
||||||
|
"choice_options": [
|
||||||
|
{
|
||||||
|
"value": (set the field to this value to select this option),
|
||||||
|
"text": (display text of the option)
|
||||||
|
},
|
||||||
|
// Other choice options
|
||||||
|
],
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
- Convert the PDF to PNGs (one image for each page) with this script (run from this file's directory):
|
||||||
|
`python scripts/convert_pdf_to_images.py <file.pdf> <output_directory>`
|
||||||
|
Then analyze the images to determine the purpose of each form field (make sure to convert the bounding box PDF coordinates to image coordinates).
|
||||||
|
- Create a `field_values.json` file in this format with the values to be entered for each field:
|
||||||
|
```
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"field_id": "last_name", // Must match the field_id from `extract_form_field_info.py`
|
||||||
|
"description": "The user's last name",
|
||||||
|
"page": 1, // Must match the "page" value in field_info.json
|
||||||
|
"value": "Simpson"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"field_id": "Checkbox12",
|
||||||
|
"description": "Checkbox to be checked if the user is 18 or over",
|
||||||
|
"page": 1,
|
||||||
|
"value": "/On" // If this is a checkbox, use its "checked_value" value to check it. If it's a radio button group, use one of the "value" values in "radio_options".
|
||||||
|
},
|
||||||
|
// more fields
|
||||||
|
]
|
||||||
|
```
|
||||||
|
- Run the `fill_fillable_fields.py` script from this file's directory to create a filled-in PDF:
|
||||||
|
`python scripts/fill_fillable_fields.py <input pdf> <field_values.json> <output pdf>`
|
||||||
|
This script will verify that the field IDs and values you provide are valid; if it prints error messages, correct the appropriate fields and try again.
|
||||||
|
|
||||||
|
# Non-fillable fields
|
||||||
|
If the PDF doesn't have fillable form fields, you'll need to visually determine where the data should be added and create text annotations. Follow the below steps *exactly*. You MUST perform all of these steps to ensure that the the form is accurately completed. Details for each step are below.
|
||||||
|
- Convert the PDF to PNG images and determine field bounding boxes.
|
||||||
|
- Create a JSON file with field information and validation images showing the bounding boxes.
|
||||||
|
- Validate the the bounding boxes.
|
||||||
|
- Use the bounding boxes to fill in the form.
|
||||||
|
|
||||||
|
## Step 1: Visual Analysis (REQUIRED)
|
||||||
|
- Convert the PDF to PNG images. Run this script from this file's directory:
|
||||||
|
`python scripts/convert_pdf_to_images.py <file.pdf> <output_directory>`
|
||||||
|
The script will create a PNG image for each page in the PDF.
|
||||||
|
- Carefully examine each PNG image and identify all form fields and areas where the user should enter data. For each form field where the user should enter text, determine bounding boxes for both the form field label, and the area where the user should enter text. The label and entry bounding boxes MUST NOT INTERSECT; the text entry box should only include the area where data should be entered. Usually this area will be immediately to the side, above, or below its label. Entry bounding boxes must be tall and wide enough to contain their text.
|
||||||
|
|
||||||
|
These are some examples of form structures that you might see:
|
||||||
|
|
||||||
|
*Label inside box*
|
||||||
|
```
|
||||||
|
┌────────────────────────┐
|
||||||
|
│ Name: │
|
||||||
|
└────────────────────────┘
|
||||||
|
```
|
||||||
|
The input area should be to the right of the "Name" label and extend to the edge of the box.
|
||||||
|
|
||||||
|
*Label before line*
|
||||||
|
```
|
||||||
|
Email: _______________________
|
||||||
|
```
|
||||||
|
The input area should be above the line and include its entire width.
|
||||||
|
|
||||||
|
*Label under line*
|
||||||
|
```
|
||||||
|
_________________________
|
||||||
|
Name
|
||||||
|
```
|
||||||
|
The input area should be above the line and include the entire width of the line. This is common for signature and date fields.
|
||||||
|
|
||||||
|
*Label above line*
|
||||||
|
```
|
||||||
|
Please enter any special requests:
|
||||||
|
________________________________________________
|
||||||
|
```
|
||||||
|
The input area should extend from the bottom of the label to the line, and should include the entire width of the line.
|
||||||
|
|
||||||
|
*Checkboxes*
|
||||||
|
```
|
||||||
|
Are you a US citizen? Yes □ No □
|
||||||
|
```
|
||||||
|
For checkboxes:
|
||||||
|
- Look for small square boxes (□) - these are the actual checkboxes to target. They may be to the left or right of their labels.
|
||||||
|
- Distinguish between label text ("Yes", "No") and the clickable checkbox squares.
|
||||||
|
- The entry bounding box should cover ONLY the small square, not the text label.
|
||||||
|
|
||||||
|
### Step 2: Create fields.json and validation images (REQUIRED)
|
||||||
|
- Create a file named `fields.json` with information for the form fields and bounding boxes in this format:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"pages": [
|
||||||
|
{
|
||||||
|
"page_number": 1,
|
||||||
|
"image_width": (first page image width in pixels),
|
||||||
|
"image_height": (first page image height in pixels),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"page_number": 2,
|
||||||
|
"image_width": (second page image width in pixels),
|
||||||
|
"image_height": (second page image height in pixels),
|
||||||
|
}
|
||||||
|
// additional pages
|
||||||
|
],
|
||||||
|
"form_fields": [
|
||||||
|
// Example for a text field.
|
||||||
|
{
|
||||||
|
"page_number": 1,
|
||||||
|
"description": "The user's last name should be entered here",
|
||||||
|
// Bounding boxes are [left, top, right, bottom]. The bounding boxes for the label and text entry should not overlap.
|
||||||
|
"field_label": "Last name",
|
||||||
|
"label_bounding_box": [30, 125, 95, 142],
|
||||||
|
"entry_bounding_box": [100, 125, 280, 142],
|
||||||
|
"entry_text": {
|
||||||
|
"text": "Johnson", // This text will be added as an annotation at the entry_bounding_box location
|
||||||
|
"font_size": 14, // optional, defaults to 14
|
||||||
|
"font_color": "000000", // optional, RRGGBB format, defaults to 000000 (black)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// Example for a checkbox. TARGET THE SQUARE for the entry bounding box, NOT THE TEXT
|
||||||
|
{
|
||||||
|
"page_number": 2,
|
||||||
|
"description": "Checkbox that should be checked if the user is over 18",
|
||||||
|
"entry_bounding_box": [140, 525, 155, 540], // Small box over checkbox square
|
||||||
|
"field_label": "Yes",
|
||||||
|
"label_bounding_box": [100, 525, 132, 540], // Box containing "Yes" text
|
||||||
|
// Use "X" to check a checkbox.
|
||||||
|
"entry_text": {
|
||||||
|
"text": "X",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// additional form field entries
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Create validation images by running this script from this file's directory for each page:
|
||||||
|
`python scripts/create_validation_image.py <page_number> <path_to_fields.json> <input_image_path> <output_image_path>
|
||||||
|
|
||||||
|
The validation images will have red rectangles where text should be entered, and blue rectangles covering label text.
|
||||||
|
|
||||||
|
### Step 3: Validate Bounding Boxes (REQUIRED)
|
||||||
|
#### Automated intersection check
|
||||||
|
- Verify that none of bounding boxes intersect and that the entry bounding boxes are tall enough by checking the fields.json file with the `check_bounding_boxes.py` script (run from this file's directory):
|
||||||
|
`python scripts/check_bounding_boxes.py <JSON file>`
|
||||||
|
|
||||||
|
If there are errors, reanalyze the relevant fields, adjust the bounding boxes, and iterate until there are no remaining errors. Remember: label (blue) bounding boxes should contain text labels, entry (red) boxes should not.
|
||||||
|
|
||||||
|
#### Manual image inspection
|
||||||
|
**CRITICAL: Do not proceed without visually inspecting validation images**
|
||||||
|
- Red rectangles must ONLY cover input areas
|
||||||
|
- Red rectangles MUST NOT contain any text
|
||||||
|
- Blue rectangles should contain label text
|
||||||
|
- For checkboxes:
|
||||||
|
- Red rectangle MUST be centered on the checkbox square
|
||||||
|
- Blue rectangle should cover the text label for the checkbox
|
||||||
|
|
||||||
|
- If any rectangles look wrong, fix fields.json, regenerate the validation images, and verify again. Repeat this process until the bounding boxes are fully accurate.
|
||||||
|
|
||||||
|
|
||||||
|
### Step 4: Add annotations to the PDF
|
||||||
|
Run this script from this file's directory to create a filled-out PDF using the information in fields.json:
|
||||||
|
`python scripts/fill_pdf_form_with_annotations.py <input_pdf_path> <path_to_fields.json> <output_pdf_path>
|
||||||
30
skills/pdf/LICENSE.txt
Normal file
30
skills/pdf/LICENSE.txt
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
© 2025 Anthropic, PBC. All rights reserved.
|
||||||
|
|
||||||
|
LICENSE: Use of these materials (including all code, prompts, assets, files,
|
||||||
|
and other components of this Skill) is governed by your agreement with
|
||||||
|
Anthropic regarding use of Anthropic's services. If no separate agreement
|
||||||
|
exists, use is governed by Anthropic's Consumer Terms of Service or
|
||||||
|
Commercial Terms of Service, as applicable:
|
||||||
|
https://www.anthropic.com/legal/consumer-terms
|
||||||
|
https://www.anthropic.com/legal/commercial-terms
|
||||||
|
Your applicable agreement is referred to as the "Agreement." "Services" are
|
||||||
|
as defined in the Agreement.
|
||||||
|
|
||||||
|
ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
|
||||||
|
contrary, users may not:
|
||||||
|
|
||||||
|
- Extract these materials from the Services or retain copies of these
|
||||||
|
materials outside the Services
|
||||||
|
- Reproduce or copy these materials, except for temporary copies created
|
||||||
|
automatically during authorized use of the Services
|
||||||
|
- Create derivative works based on these materials
|
||||||
|
- Distribute, sublicense, or transfer these materials to any third party
|
||||||
|
- Make, offer to sell, sell, or import any inventions embodied in these
|
||||||
|
materials
|
||||||
|
- Reverse engineer, decompile, or disassemble these materials
|
||||||
|
|
||||||
|
The receipt, viewing, or possession of these materials does not convey or
|
||||||
|
imply any license or right beyond those expressly granted above.
|
||||||
|
|
||||||
|
Anthropic retains all right, title, and interest in these materials,
|
||||||
|
including all copyrights, patents, and other intellectual property rights.
|
||||||
612
skills/pdf/REFERENCE.md
Normal file
612
skills/pdf/REFERENCE.md
Normal file
@@ -0,0 +1,612 @@
|
|||||||
|
# PDF Processing Advanced Reference
|
||||||
|
|
||||||
|
This document contains advanced PDF processing features, detailed examples, and additional libraries not covered in the main skill instructions.
|
||||||
|
|
||||||
|
## pypdfium2 Library (Apache/BSD License)
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
pypdfium2 is a Python binding for PDFium (Chromium's PDF library). It's excellent for fast PDF rendering, image generation, and serves as a PyMuPDF replacement.
|
||||||
|
|
||||||
|
### Render PDF to Images
|
||||||
|
```python
|
||||||
|
import pypdfium2 as pdfium
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
# Load PDF
|
||||||
|
pdf = pdfium.PdfDocument("document.pdf")
|
||||||
|
|
||||||
|
# Render page to image
|
||||||
|
page = pdf[0] # First page
|
||||||
|
bitmap = page.render(
|
||||||
|
scale=2.0, # Higher resolution
|
||||||
|
rotation=0 # No rotation
|
||||||
|
)
|
||||||
|
|
||||||
|
# Convert to PIL Image
|
||||||
|
img = bitmap.to_pil()
|
||||||
|
img.save("page_1.png", "PNG")
|
||||||
|
|
||||||
|
# Process multiple pages
|
||||||
|
for i, page in enumerate(pdf):
|
||||||
|
bitmap = page.render(scale=1.5)
|
||||||
|
img = bitmap.to_pil()
|
||||||
|
img.save(f"page_{i+1}.jpg", "JPEG", quality=90)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extract Text with pypdfium2
|
||||||
|
```python
|
||||||
|
import pypdfium2 as pdfium
|
||||||
|
|
||||||
|
pdf = pdfium.PdfDocument("document.pdf")
|
||||||
|
for i, page in enumerate(pdf):
|
||||||
|
text = page.get_text()
|
||||||
|
print(f"Page {i+1} text length: {len(text)} chars")
|
||||||
|
```
|
||||||
|
|
||||||
|
## JavaScript Libraries
|
||||||
|
|
||||||
|
### pdf-lib (MIT License)
|
||||||
|
|
||||||
|
pdf-lib is a powerful JavaScript library for creating and modifying PDF documents in any JavaScript environment.
|
||||||
|
|
||||||
|
#### Load and Manipulate Existing PDF
|
||||||
|
```javascript
|
||||||
|
import { PDFDocument } from 'pdf-lib';
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
|
async function manipulatePDF() {
|
||||||
|
// Load existing PDF
|
||||||
|
const existingPdfBytes = fs.readFileSync('input.pdf');
|
||||||
|
const pdfDoc = await PDFDocument.load(existingPdfBytes);
|
||||||
|
|
||||||
|
// Get page count
|
||||||
|
const pageCount = pdfDoc.getPageCount();
|
||||||
|
console.log(`Document has ${pageCount} pages`);
|
||||||
|
|
||||||
|
// Add new page
|
||||||
|
const newPage = pdfDoc.addPage([600, 400]);
|
||||||
|
newPage.drawText('Added by pdf-lib', {
|
||||||
|
x: 100,
|
||||||
|
y: 300,
|
||||||
|
size: 16
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save modified PDF
|
||||||
|
const pdfBytes = await pdfDoc.save();
|
||||||
|
fs.writeFileSync('modified.pdf', pdfBytes);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Create Complex PDFs from Scratch
|
||||||
|
```javascript
|
||||||
|
import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
|
async function createPDF() {
|
||||||
|
const pdfDoc = await PDFDocument.create();
|
||||||
|
|
||||||
|
// Add fonts
|
||||||
|
const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);
|
||||||
|
const helveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
|
||||||
|
|
||||||
|
// Add page
|
||||||
|
const page = pdfDoc.addPage([595, 842]); // A4 size
|
||||||
|
const { width, height } = page.getSize();
|
||||||
|
|
||||||
|
// Add text with styling
|
||||||
|
page.drawText('Invoice #12345', {
|
||||||
|
x: 50,
|
||||||
|
y: height - 50,
|
||||||
|
size: 18,
|
||||||
|
font: helveticaBold,
|
||||||
|
color: rgb(0.2, 0.2, 0.8)
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add rectangle (header background)
|
||||||
|
page.drawRectangle({
|
||||||
|
x: 40,
|
||||||
|
y: height - 100,
|
||||||
|
width: width - 80,
|
||||||
|
height: 30,
|
||||||
|
color: rgb(0.9, 0.9, 0.9)
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add table-like content
|
||||||
|
const items = [
|
||||||
|
['Item', 'Qty', 'Price', 'Total'],
|
||||||
|
['Widget', '2', '$50', '$100'],
|
||||||
|
['Gadget', '1', '$75', '$75']
|
||||||
|
];
|
||||||
|
|
||||||
|
let yPos = height - 150;
|
||||||
|
items.forEach(row => {
|
||||||
|
let xPos = 50;
|
||||||
|
row.forEach(cell => {
|
||||||
|
page.drawText(cell, {
|
||||||
|
x: xPos,
|
||||||
|
y: yPos,
|
||||||
|
size: 12,
|
||||||
|
font: helveticaFont
|
||||||
|
});
|
||||||
|
xPos += 120;
|
||||||
|
});
|
||||||
|
yPos -= 25;
|
||||||
|
});
|
||||||
|
|
||||||
|
const pdfBytes = await pdfDoc.save();
|
||||||
|
fs.writeFileSync('created.pdf', pdfBytes);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Advanced Merge and Split Operations
|
||||||
|
```javascript
|
||||||
|
import { PDFDocument } from 'pdf-lib';
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
|
async function mergePDFs() {
|
||||||
|
// Create new document
|
||||||
|
const mergedPdf = await PDFDocument.create();
|
||||||
|
|
||||||
|
// Load source PDFs
|
||||||
|
const pdf1Bytes = fs.readFileSync('doc1.pdf');
|
||||||
|
const pdf2Bytes = fs.readFileSync('doc2.pdf');
|
||||||
|
|
||||||
|
const pdf1 = await PDFDocument.load(pdf1Bytes);
|
||||||
|
const pdf2 = await PDFDocument.load(pdf2Bytes);
|
||||||
|
|
||||||
|
// Copy pages from first PDF
|
||||||
|
const pdf1Pages = await mergedPdf.copyPages(pdf1, pdf1.getPageIndices());
|
||||||
|
pdf1Pages.forEach(page => mergedPdf.addPage(page));
|
||||||
|
|
||||||
|
// Copy specific pages from second PDF (pages 0, 2, 4)
|
||||||
|
const pdf2Pages = await mergedPdf.copyPages(pdf2, [0, 2, 4]);
|
||||||
|
pdf2Pages.forEach(page => mergedPdf.addPage(page));
|
||||||
|
|
||||||
|
const mergedPdfBytes = await mergedPdf.save();
|
||||||
|
fs.writeFileSync('merged.pdf', mergedPdfBytes);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### pdfjs-dist (Apache License)
|
||||||
|
|
||||||
|
PDF.js is Mozilla's JavaScript library for rendering PDFs in the browser.
|
||||||
|
|
||||||
|
#### Basic PDF Loading and Rendering
|
||||||
|
```javascript
|
||||||
|
import * as pdfjsLib from 'pdfjs-dist';
|
||||||
|
|
||||||
|
// Configure worker (important for performance)
|
||||||
|
pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.js';
|
||||||
|
|
||||||
|
async function renderPDF() {
|
||||||
|
// Load PDF
|
||||||
|
const loadingTask = pdfjsLib.getDocument('document.pdf');
|
||||||
|
const pdf = await loadingTask.promise;
|
||||||
|
|
||||||
|
console.log(`Loaded PDF with ${pdf.numPages} pages`);
|
||||||
|
|
||||||
|
// Get first page
|
||||||
|
const page = await pdf.getPage(1);
|
||||||
|
const viewport = page.getViewport({ scale: 1.5 });
|
||||||
|
|
||||||
|
// Render to canvas
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
const context = canvas.getContext('2d');
|
||||||
|
canvas.height = viewport.height;
|
||||||
|
canvas.width = viewport.width;
|
||||||
|
|
||||||
|
const renderContext = {
|
||||||
|
canvasContext: context,
|
||||||
|
viewport: viewport
|
||||||
|
};
|
||||||
|
|
||||||
|
await page.render(renderContext).promise;
|
||||||
|
document.body.appendChild(canvas);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extract Text with Coordinates
|
||||||
|
```javascript
|
||||||
|
import * as pdfjsLib from 'pdfjs-dist';
|
||||||
|
|
||||||
|
async function extractText() {
|
||||||
|
const loadingTask = pdfjsLib.getDocument('document.pdf');
|
||||||
|
const pdf = await loadingTask.promise;
|
||||||
|
|
||||||
|
let fullText = '';
|
||||||
|
|
||||||
|
// Extract text from all pages
|
||||||
|
for (let i = 1; i <= pdf.numPages; i++) {
|
||||||
|
const page = await pdf.getPage(i);
|
||||||
|
const textContent = await page.getTextContent();
|
||||||
|
|
||||||
|
const pageText = textContent.items
|
||||||
|
.map(item => item.str)
|
||||||
|
.join(' ');
|
||||||
|
|
||||||
|
fullText += `\n--- Page ${i} ---\n${pageText}`;
|
||||||
|
|
||||||
|
// Get text with coordinates for advanced processing
|
||||||
|
const textWithCoords = textContent.items.map(item => ({
|
||||||
|
text: item.str,
|
||||||
|
x: item.transform[4],
|
||||||
|
y: item.transform[5],
|
||||||
|
width: item.width,
|
||||||
|
height: item.height
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(fullText);
|
||||||
|
return fullText;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extract Annotations and Forms
|
||||||
|
```javascript
|
||||||
|
import * as pdfjsLib from 'pdfjs-dist';
|
||||||
|
|
||||||
|
async function extractAnnotations() {
|
||||||
|
const loadingTask = pdfjsLib.getDocument('annotated.pdf');
|
||||||
|
const pdf = await loadingTask.promise;
|
||||||
|
|
||||||
|
for (let i = 1; i <= pdf.numPages; i++) {
|
||||||
|
const page = await pdf.getPage(i);
|
||||||
|
const annotations = await page.getAnnotations();
|
||||||
|
|
||||||
|
annotations.forEach(annotation => {
|
||||||
|
console.log(`Annotation type: ${annotation.subtype}`);
|
||||||
|
console.log(`Content: ${annotation.contents}`);
|
||||||
|
console.log(`Coordinates: ${JSON.stringify(annotation.rect)}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Command-Line Operations
|
||||||
|
|
||||||
|
### poppler-utils Advanced Features
|
||||||
|
|
||||||
|
#### Extract Text with Bounding Box Coordinates
|
||||||
|
```bash
|
||||||
|
# Extract text with bounding box coordinates (essential for structured data)
|
||||||
|
pdftotext -bbox-layout document.pdf output.xml
|
||||||
|
|
||||||
|
# The XML output contains precise coordinates for each text element
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Advanced Image Conversion
|
||||||
|
```bash
|
||||||
|
# Convert to PNG images with specific resolution
|
||||||
|
pdftoppm -png -r 300 document.pdf output_prefix
|
||||||
|
|
||||||
|
# Convert specific page range with high resolution
|
||||||
|
pdftoppm -png -r 600 -f 1 -l 3 document.pdf high_res_pages
|
||||||
|
|
||||||
|
# Convert to JPEG with quality setting
|
||||||
|
pdftoppm -jpeg -jpegopt quality=85 -r 200 document.pdf jpeg_output
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extract Embedded Images
|
||||||
|
```bash
|
||||||
|
# Extract all embedded images with metadata
|
||||||
|
pdfimages -j -p document.pdf page_images
|
||||||
|
|
||||||
|
# List image info without extracting
|
||||||
|
pdfimages -list document.pdf
|
||||||
|
|
||||||
|
# Extract images in their original format
|
||||||
|
pdfimages -all document.pdf images/img
|
||||||
|
```
|
||||||
|
|
||||||
|
### qpdf Advanced Features
|
||||||
|
|
||||||
|
#### Complex Page Manipulation
|
||||||
|
```bash
|
||||||
|
# Split PDF into groups of pages
|
||||||
|
qpdf --split-pages=3 input.pdf output_group_%02d.pdf
|
||||||
|
|
||||||
|
# Extract specific pages with complex ranges
|
||||||
|
qpdf input.pdf --pages input.pdf 1,3-5,8,10-end -- extracted.pdf
|
||||||
|
|
||||||
|
# Merge specific pages from multiple PDFs
|
||||||
|
qpdf --empty --pages doc1.pdf 1-3 doc2.pdf 5-7 doc3.pdf 2,4 -- combined.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
#### PDF Optimization and Repair
|
||||||
|
```bash
|
||||||
|
# Optimize PDF for web (linearize for streaming)
|
||||||
|
qpdf --linearize input.pdf optimized.pdf
|
||||||
|
|
||||||
|
# Remove unused objects and compress
|
||||||
|
qpdf --optimize-level=all input.pdf compressed.pdf
|
||||||
|
|
||||||
|
# Attempt to repair corrupted PDF structure
|
||||||
|
qpdf --check input.pdf
|
||||||
|
qpdf --fix-qdf damaged.pdf repaired.pdf
|
||||||
|
|
||||||
|
# Show detailed PDF structure for debugging
|
||||||
|
qpdf --show-all-pages input.pdf > structure.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Advanced Encryption
|
||||||
|
```bash
|
||||||
|
# Add password protection with specific permissions
|
||||||
|
qpdf --encrypt user_pass owner_pass 256 --print=none --modify=none -- input.pdf encrypted.pdf
|
||||||
|
|
||||||
|
# Check encryption status
|
||||||
|
qpdf --show-encryption encrypted.pdf
|
||||||
|
|
||||||
|
# Remove password protection (requires password)
|
||||||
|
qpdf --password=secret123 --decrypt encrypted.pdf decrypted.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Python Techniques
|
||||||
|
|
||||||
|
### pdfplumber Advanced Features
|
||||||
|
|
||||||
|
#### Extract Text with Precise Coordinates
|
||||||
|
```python
|
||||||
|
import pdfplumber
|
||||||
|
|
||||||
|
with pdfplumber.open("document.pdf") as pdf:
|
||||||
|
page = pdf.pages[0]
|
||||||
|
|
||||||
|
# Extract all text with coordinates
|
||||||
|
chars = page.chars
|
||||||
|
for char in chars[:10]: # First 10 characters
|
||||||
|
print(f"Char: '{char['text']}' at x:{char['x0']:.1f} y:{char['y0']:.1f}")
|
||||||
|
|
||||||
|
# Extract text by bounding box (left, top, right, bottom)
|
||||||
|
bbox_text = page.within_bbox((100, 100, 400, 200)).extract_text()
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Advanced Table Extraction with Custom Settings
|
||||||
|
```python
|
||||||
|
import pdfplumber
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
with pdfplumber.open("complex_table.pdf") as pdf:
|
||||||
|
page = pdf.pages[0]
|
||||||
|
|
||||||
|
# Extract tables with custom settings for complex layouts
|
||||||
|
table_settings = {
|
||||||
|
"vertical_strategy": "lines",
|
||||||
|
"horizontal_strategy": "lines",
|
||||||
|
"snap_tolerance": 3,
|
||||||
|
"intersection_tolerance": 15
|
||||||
|
}
|
||||||
|
tables = page.extract_tables(table_settings)
|
||||||
|
|
||||||
|
# Visual debugging for table extraction
|
||||||
|
img = page.to_image(resolution=150)
|
||||||
|
img.save("debug_layout.png")
|
||||||
|
```
|
||||||
|
|
||||||
|
### reportlab Advanced Features
|
||||||
|
|
||||||
|
#### Create Professional Reports with Tables
|
||||||
|
```python
|
||||||
|
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
|
||||||
|
from reportlab.lib.styles import getSampleStyleSheet
|
||||||
|
from reportlab.lib import colors
|
||||||
|
|
||||||
|
# Sample data
|
||||||
|
data = [
|
||||||
|
['Product', 'Q1', 'Q2', 'Q3', 'Q4'],
|
||||||
|
['Widgets', '120', '135', '142', '158'],
|
||||||
|
['Gadgets', '85', '92', '98', '105']
|
||||||
|
]
|
||||||
|
|
||||||
|
# Create PDF with table
|
||||||
|
doc = SimpleDocTemplate("report.pdf")
|
||||||
|
elements = []
|
||||||
|
|
||||||
|
# Add title
|
||||||
|
styles = getSampleStyleSheet()
|
||||||
|
title = Paragraph("Quarterly Sales Report", styles['Title'])
|
||||||
|
elements.append(title)
|
||||||
|
|
||||||
|
# Add table with advanced styling
|
||||||
|
table = Table(data)
|
||||||
|
table.setStyle(TableStyle([
|
||||||
|
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
|
||||||
|
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
|
||||||
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
|
||||||
|
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
|
||||||
|
('FONTSIZE', (0, 0), (-1, 0), 14),
|
||||||
|
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
|
||||||
|
('BACKGROUND', (0, 1), (-1, -1), colors.beige),
|
||||||
|
('GRID', (0, 0), (-1, -1), 1, colors.black)
|
||||||
|
]))
|
||||||
|
elements.append(table)
|
||||||
|
|
||||||
|
doc.build(elements)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Complex Workflows
|
||||||
|
|
||||||
|
### Extract Figures/Images from PDF
|
||||||
|
|
||||||
|
#### Method 1: Using pdfimages (fastest)
|
||||||
|
```bash
|
||||||
|
# Extract all images with original quality
|
||||||
|
pdfimages -all document.pdf images/img
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Method 2: Using pypdfium2 + Image Processing
|
||||||
|
```python
|
||||||
|
import pypdfium2 as pdfium
|
||||||
|
from PIL import Image
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def extract_figures(pdf_path, output_dir):
|
||||||
|
pdf = pdfium.PdfDocument(pdf_path)
|
||||||
|
|
||||||
|
for page_num, page in enumerate(pdf):
|
||||||
|
# Render high-resolution page
|
||||||
|
bitmap = page.render(scale=3.0)
|
||||||
|
img = bitmap.to_pil()
|
||||||
|
|
||||||
|
# Convert to numpy for processing
|
||||||
|
img_array = np.array(img)
|
||||||
|
|
||||||
|
# Simple figure detection (non-white regions)
|
||||||
|
mask = np.any(img_array != [255, 255, 255], axis=2)
|
||||||
|
|
||||||
|
# Find contours and extract bounding boxes
|
||||||
|
# (This is simplified - real implementation would need more sophisticated detection)
|
||||||
|
|
||||||
|
# Save detected figures
|
||||||
|
# ... implementation depends on specific needs
|
||||||
|
```
|
||||||
|
|
||||||
|
### Batch PDF Processing with Error Handling
|
||||||
|
```python
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
from pypdf import PdfReader, PdfWriter
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
def batch_process_pdfs(input_dir, operation='merge'):
|
||||||
|
pdf_files = glob.glob(os.path.join(input_dir, "*.pdf"))
|
||||||
|
|
||||||
|
if operation == 'merge':
|
||||||
|
writer = PdfWriter()
|
||||||
|
for pdf_file in pdf_files:
|
||||||
|
try:
|
||||||
|
reader = PdfReader(pdf_file)
|
||||||
|
for page in reader.pages:
|
||||||
|
writer.add_page(page)
|
||||||
|
logger.info(f"Processed: {pdf_file}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to process {pdf_file}: {e}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
with open("batch_merged.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
|
||||||
|
elif operation == 'extract_text':
|
||||||
|
for pdf_file in pdf_files:
|
||||||
|
try:
|
||||||
|
reader = PdfReader(pdf_file)
|
||||||
|
text = ""
|
||||||
|
for page in reader.pages:
|
||||||
|
text += page.extract_text()
|
||||||
|
|
||||||
|
output_file = pdf_file.replace('.pdf', '.txt')
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
f.write(text)
|
||||||
|
logger.info(f"Extracted text from: {pdf_file}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to extract text from {pdf_file}: {e}")
|
||||||
|
continue
|
||||||
|
```
|
||||||
|
|
||||||
|
### Advanced PDF Cropping
|
||||||
|
```python
|
||||||
|
from pypdf import PdfWriter, PdfReader
|
||||||
|
|
||||||
|
reader = PdfReader("input.pdf")
|
||||||
|
writer = PdfWriter()
|
||||||
|
|
||||||
|
# Crop page (left, bottom, right, top in points)
|
||||||
|
page = reader.pages[0]
|
||||||
|
page.mediabox.left = 50
|
||||||
|
page.mediabox.bottom = 50
|
||||||
|
page.mediabox.right = 550
|
||||||
|
page.mediabox.top = 750
|
||||||
|
|
||||||
|
writer.add_page(page)
|
||||||
|
with open("cropped.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Optimization Tips
|
||||||
|
|
||||||
|
### 1. For Large PDFs
|
||||||
|
- Use streaming approaches instead of loading entire PDF in memory
|
||||||
|
- Use `qpdf --split-pages` for splitting large files
|
||||||
|
- Process pages individually with pypdfium2
|
||||||
|
|
||||||
|
### 2. For Text Extraction
|
||||||
|
- `pdftotext -bbox-layout` is fastest for plain text extraction
|
||||||
|
- Use pdfplumber for structured data and tables
|
||||||
|
- Avoid `pypdf.extract_text()` for very large documents
|
||||||
|
|
||||||
|
### 3. For Image Extraction
|
||||||
|
- `pdfimages` is much faster than rendering pages
|
||||||
|
- Use low resolution for previews, high resolution for final output
|
||||||
|
|
||||||
|
### 4. For Form Filling
|
||||||
|
- pdf-lib maintains form structure better than most alternatives
|
||||||
|
- Pre-validate form fields before processing
|
||||||
|
|
||||||
|
### 5. Memory Management
|
||||||
|
```python
|
||||||
|
# Process PDFs in chunks
|
||||||
|
def process_large_pdf(pdf_path, chunk_size=10):
|
||||||
|
reader = PdfReader(pdf_path)
|
||||||
|
total_pages = len(reader.pages)
|
||||||
|
|
||||||
|
for start_idx in range(0, total_pages, chunk_size):
|
||||||
|
end_idx = min(start_idx + chunk_size, total_pages)
|
||||||
|
writer = PdfWriter()
|
||||||
|
|
||||||
|
for i in range(start_idx, end_idx):
|
||||||
|
writer.add_page(reader.pages[i])
|
||||||
|
|
||||||
|
# Process chunk
|
||||||
|
with open(f"chunk_{start_idx//chunk_size}.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting Common Issues
|
||||||
|
|
||||||
|
### Encrypted PDFs
|
||||||
|
```python
|
||||||
|
# Handle password-protected PDFs
|
||||||
|
from pypdf import PdfReader
|
||||||
|
|
||||||
|
try:
|
||||||
|
reader = PdfReader("encrypted.pdf")
|
||||||
|
if reader.is_encrypted:
|
||||||
|
reader.decrypt("password")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Failed to decrypt: {e}")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Corrupted PDFs
|
||||||
|
```bash
|
||||||
|
# Use qpdf to repair
|
||||||
|
qpdf --check corrupted.pdf
|
||||||
|
qpdf --replace-input corrupted.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Text Extraction Issues
|
||||||
|
```python
|
||||||
|
# Fallback to OCR for scanned PDFs
|
||||||
|
import pytesseract
|
||||||
|
from pdf2image import convert_from_path
|
||||||
|
|
||||||
|
def extract_text_with_ocr(pdf_path):
|
||||||
|
images = convert_from_path(pdf_path)
|
||||||
|
text = ""
|
||||||
|
for i, image in enumerate(images):
|
||||||
|
text += pytesseract.image_to_string(image)
|
||||||
|
return text
|
||||||
|
```
|
||||||
|
|
||||||
|
## License Information
|
||||||
|
|
||||||
|
- **pypdf**: BSD License
|
||||||
|
- **pdfplumber**: MIT License
|
||||||
|
- **pypdfium2**: Apache/BSD License
|
||||||
|
- **reportlab**: BSD License
|
||||||
|
- **poppler-utils**: GPL-2 License
|
||||||
|
- **qpdf**: Apache License
|
||||||
|
- **pdf-lib**: MIT License
|
||||||
|
- **pdfjs-dist**: Apache License
|
||||||
294
skills/pdf/SKILL.md
Normal file
294
skills/pdf/SKILL.md
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
---
|
||||||
|
name: pdf
|
||||||
|
description: Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.
|
||||||
|
license: Proprietary. LICENSE.txt has complete terms
|
||||||
|
---
|
||||||
|
|
||||||
|
# PDF Processing Guide
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see REFERENCE.md. If you need to fill out a PDF form, read FORMS.md and follow its instructions.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
```python
|
||||||
|
from pypdf import PdfReader, PdfWriter
|
||||||
|
|
||||||
|
# Read a PDF
|
||||||
|
reader = PdfReader("document.pdf")
|
||||||
|
print(f"Pages: {len(reader.pages)}")
|
||||||
|
|
||||||
|
# Extract text
|
||||||
|
text = ""
|
||||||
|
for page in reader.pages:
|
||||||
|
text += page.extract_text()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Python Libraries
|
||||||
|
|
||||||
|
### pypdf - Basic Operations
|
||||||
|
|
||||||
|
#### Merge PDFs
|
||||||
|
```python
|
||||||
|
from pypdf import PdfWriter, PdfReader
|
||||||
|
|
||||||
|
writer = PdfWriter()
|
||||||
|
for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
|
||||||
|
reader = PdfReader(pdf_file)
|
||||||
|
for page in reader.pages:
|
||||||
|
writer.add_page(page)
|
||||||
|
|
||||||
|
with open("merged.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Split PDF
|
||||||
|
```python
|
||||||
|
reader = PdfReader("input.pdf")
|
||||||
|
for i, page in enumerate(reader.pages):
|
||||||
|
writer = PdfWriter()
|
||||||
|
writer.add_page(page)
|
||||||
|
with open(f"page_{i+1}.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extract Metadata
|
||||||
|
```python
|
||||||
|
reader = PdfReader("document.pdf")
|
||||||
|
meta = reader.metadata
|
||||||
|
print(f"Title: {meta.title}")
|
||||||
|
print(f"Author: {meta.author}")
|
||||||
|
print(f"Subject: {meta.subject}")
|
||||||
|
print(f"Creator: {meta.creator}")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Rotate Pages
|
||||||
|
```python
|
||||||
|
reader = PdfReader("input.pdf")
|
||||||
|
writer = PdfWriter()
|
||||||
|
|
||||||
|
page = reader.pages[0]
|
||||||
|
page.rotate(90) # Rotate 90 degrees clockwise
|
||||||
|
writer.add_page(page)
|
||||||
|
|
||||||
|
with open("rotated.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### pdfplumber - Text and Table Extraction
|
||||||
|
|
||||||
|
#### Extract Text with Layout
|
||||||
|
```python
|
||||||
|
import pdfplumber
|
||||||
|
|
||||||
|
with pdfplumber.open("document.pdf") as pdf:
|
||||||
|
for page in pdf.pages:
|
||||||
|
text = page.extract_text()
|
||||||
|
print(text)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extract Tables
|
||||||
|
```python
|
||||||
|
with pdfplumber.open("document.pdf") as pdf:
|
||||||
|
for i, page in enumerate(pdf.pages):
|
||||||
|
tables = page.extract_tables()
|
||||||
|
for j, table in enumerate(tables):
|
||||||
|
print(f"Table {j+1} on page {i+1}:")
|
||||||
|
for row in table:
|
||||||
|
print(row)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Advanced Table Extraction
|
||||||
|
```python
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
with pdfplumber.open("document.pdf") as pdf:
|
||||||
|
all_tables = []
|
||||||
|
for page in pdf.pages:
|
||||||
|
tables = page.extract_tables()
|
||||||
|
for table in tables:
|
||||||
|
if table: # Check if table is not empty
|
||||||
|
df = pd.DataFrame(table[1:], columns=table[0])
|
||||||
|
all_tables.append(df)
|
||||||
|
|
||||||
|
# Combine all tables
|
||||||
|
if all_tables:
|
||||||
|
combined_df = pd.concat(all_tables, ignore_index=True)
|
||||||
|
combined_df.to_excel("extracted_tables.xlsx", index=False)
|
||||||
|
```
|
||||||
|
|
||||||
|
### reportlab - Create PDFs
|
||||||
|
|
||||||
|
#### Basic PDF Creation
|
||||||
|
```python
|
||||||
|
from reportlab.lib.pagesizes import letter
|
||||||
|
from reportlab.pdfgen import canvas
|
||||||
|
|
||||||
|
c = canvas.Canvas("hello.pdf", pagesize=letter)
|
||||||
|
width, height = letter
|
||||||
|
|
||||||
|
# Add text
|
||||||
|
c.drawString(100, height - 100, "Hello World!")
|
||||||
|
c.drawString(100, height - 120, "This is a PDF created with reportlab")
|
||||||
|
|
||||||
|
# Add a line
|
||||||
|
c.line(100, height - 140, 400, height - 140)
|
||||||
|
|
||||||
|
# Save
|
||||||
|
c.save()
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Create PDF with Multiple Pages
|
||||||
|
```python
|
||||||
|
from reportlab.lib.pagesizes import letter
|
||||||
|
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
|
||||||
|
from reportlab.lib.styles import getSampleStyleSheet
|
||||||
|
|
||||||
|
doc = SimpleDocTemplate("report.pdf", pagesize=letter)
|
||||||
|
styles = getSampleStyleSheet()
|
||||||
|
story = []
|
||||||
|
|
||||||
|
# Add content
|
||||||
|
title = Paragraph("Report Title", styles['Title'])
|
||||||
|
story.append(title)
|
||||||
|
story.append(Spacer(1, 12))
|
||||||
|
|
||||||
|
body = Paragraph("This is the body of the report. " * 20, styles['Normal'])
|
||||||
|
story.append(body)
|
||||||
|
story.append(PageBreak())
|
||||||
|
|
||||||
|
# Page 2
|
||||||
|
story.append(Paragraph("Page 2", styles['Heading1']))
|
||||||
|
story.append(Paragraph("Content for page 2", styles['Normal']))
|
||||||
|
|
||||||
|
# Build PDF
|
||||||
|
doc.build(story)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Command-Line Tools
|
||||||
|
|
||||||
|
### pdftotext (poppler-utils)
|
||||||
|
```bash
|
||||||
|
# Extract text
|
||||||
|
pdftotext input.pdf output.txt
|
||||||
|
|
||||||
|
# Extract text preserving layout
|
||||||
|
pdftotext -layout input.pdf output.txt
|
||||||
|
|
||||||
|
# Extract specific pages
|
||||||
|
pdftotext -f 1 -l 5 input.pdf output.txt # Pages 1-5
|
||||||
|
```
|
||||||
|
|
||||||
|
### qpdf
|
||||||
|
```bash
|
||||||
|
# Merge PDFs
|
||||||
|
qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
|
||||||
|
|
||||||
|
# Split pages
|
||||||
|
qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
|
||||||
|
qpdf input.pdf --pages . 6-10 -- pages6-10.pdf
|
||||||
|
|
||||||
|
# Rotate pages
|
||||||
|
qpdf input.pdf output.pdf --rotate=+90:1 # Rotate page 1 by 90 degrees
|
||||||
|
|
||||||
|
# Remove password
|
||||||
|
qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
### pdftk (if available)
|
||||||
|
```bash
|
||||||
|
# Merge
|
||||||
|
pdftk file1.pdf file2.pdf cat output merged.pdf
|
||||||
|
|
||||||
|
# Split
|
||||||
|
pdftk input.pdf burst
|
||||||
|
|
||||||
|
# Rotate
|
||||||
|
pdftk input.pdf rotate 1east output rotated.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Tasks
|
||||||
|
|
||||||
|
### Extract Text from Scanned PDFs
|
||||||
|
```python
|
||||||
|
# Requires: pip install pytesseract pdf2image
|
||||||
|
import pytesseract
|
||||||
|
from pdf2image import convert_from_path
|
||||||
|
|
||||||
|
# Convert PDF to images
|
||||||
|
images = convert_from_path('scanned.pdf')
|
||||||
|
|
||||||
|
# OCR each page
|
||||||
|
text = ""
|
||||||
|
for i, image in enumerate(images):
|
||||||
|
text += f"Page {i+1}:\n"
|
||||||
|
text += pytesseract.image_to_string(image)
|
||||||
|
text += "\n\n"
|
||||||
|
|
||||||
|
print(text)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Add Watermark
|
||||||
|
```python
|
||||||
|
from pypdf import PdfReader, PdfWriter
|
||||||
|
|
||||||
|
# Create watermark (or load existing)
|
||||||
|
watermark = PdfReader("watermark.pdf").pages[0]
|
||||||
|
|
||||||
|
# Apply to all pages
|
||||||
|
reader = PdfReader("document.pdf")
|
||||||
|
writer = PdfWriter()
|
||||||
|
|
||||||
|
for page in reader.pages:
|
||||||
|
page.merge_page(watermark)
|
||||||
|
writer.add_page(page)
|
||||||
|
|
||||||
|
with open("watermarked.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extract Images
|
||||||
|
```bash
|
||||||
|
# Using pdfimages (poppler-utils)
|
||||||
|
pdfimages -j input.pdf output_prefix
|
||||||
|
|
||||||
|
# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
### Password Protection
|
||||||
|
```python
|
||||||
|
from pypdf import PdfReader, PdfWriter
|
||||||
|
|
||||||
|
reader = PdfReader("input.pdf")
|
||||||
|
writer = PdfWriter()
|
||||||
|
|
||||||
|
for page in reader.pages:
|
||||||
|
writer.add_page(page)
|
||||||
|
|
||||||
|
# Add password
|
||||||
|
writer.encrypt("userpassword", "ownerpassword")
|
||||||
|
|
||||||
|
with open("encrypted.pdf", "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
| Task | Best Tool | Command/Code |
|
||||||
|
|------|-----------|--------------|
|
||||||
|
| Merge PDFs | pypdf | `writer.add_page(page)` |
|
||||||
|
| Split PDFs | pypdf | One page per file |
|
||||||
|
| Extract text | pdfplumber | `page.extract_text()` |
|
||||||
|
| Extract tables | pdfplumber | `page.extract_tables()` |
|
||||||
|
| Create PDFs | reportlab | Canvas or Platypus |
|
||||||
|
| Command line merge | qpdf | `qpdf --empty --pages ...` |
|
||||||
|
| OCR scanned PDFs | pytesseract | Convert to image first |
|
||||||
|
| Fill PDF forms | pdf-lib or pypdf (see FORMS.md) | See FORMS.md |
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
- For advanced pypdfium2 usage, see REFERENCE.md
|
||||||
|
- For JavaScript libraries (pdf-lib), see REFERENCE.md
|
||||||
|
- If you need to fill out a PDF form, follow the instructions in FORMS.md
|
||||||
|
- For troubleshooting guides, see REFERENCE.md
|
||||||
70
skills/pdf/scripts/check_bounding_boxes.py
Normal file
70
skills/pdf/scripts/check_bounding_boxes.py
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
# Script to check that the `fields.json` file that Claude creates when analyzing PDFs
|
||||||
|
# does not have overlapping bounding boxes. See FORMS.md.
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RectAndField:
|
||||||
|
rect: list[float]
|
||||||
|
rect_type: str
|
||||||
|
field: dict
|
||||||
|
|
||||||
|
|
||||||
|
# Returns a list of messages that are printed to stdout for Claude to read.
|
||||||
|
def get_bounding_box_messages(fields_json_stream) -> list[str]:
|
||||||
|
messages = []
|
||||||
|
fields = json.load(fields_json_stream)
|
||||||
|
messages.append(f"Read {len(fields['form_fields'])} fields")
|
||||||
|
|
||||||
|
def rects_intersect(r1, r2):
|
||||||
|
disjoint_horizontal = r1[0] >= r2[2] or r1[2] <= r2[0]
|
||||||
|
disjoint_vertical = r1[1] >= r2[3] or r1[3] <= r2[1]
|
||||||
|
return not (disjoint_horizontal or disjoint_vertical)
|
||||||
|
|
||||||
|
rects_and_fields = []
|
||||||
|
for f in fields["form_fields"]:
|
||||||
|
rects_and_fields.append(RectAndField(f["label_bounding_box"], "label", f))
|
||||||
|
rects_and_fields.append(RectAndField(f["entry_bounding_box"], "entry", f))
|
||||||
|
|
||||||
|
has_error = False
|
||||||
|
for i, ri in enumerate(rects_and_fields):
|
||||||
|
# This is O(N^2); we can optimize if it becomes a problem.
|
||||||
|
for j in range(i + 1, len(rects_and_fields)):
|
||||||
|
rj = rects_and_fields[j]
|
||||||
|
if ri.field["page_number"] == rj.field["page_number"] and rects_intersect(ri.rect, rj.rect):
|
||||||
|
has_error = True
|
||||||
|
if ri.field is rj.field:
|
||||||
|
messages.append(f"FAILURE: intersection between label and entry bounding boxes for `{ri.field['description']}` ({ri.rect}, {rj.rect})")
|
||||||
|
else:
|
||||||
|
messages.append(f"FAILURE: intersection between {ri.rect_type} bounding box for `{ri.field['description']}` ({ri.rect}) and {rj.rect_type} bounding box for `{rj.field['description']}` ({rj.rect})")
|
||||||
|
if len(messages) >= 20:
|
||||||
|
messages.append("Aborting further checks; fix bounding boxes and try again")
|
||||||
|
return messages
|
||||||
|
if ri.rect_type == "entry":
|
||||||
|
if "entry_text" in ri.field:
|
||||||
|
font_size = ri.field["entry_text"].get("font_size", 14)
|
||||||
|
entry_height = ri.rect[3] - ri.rect[1]
|
||||||
|
if entry_height < font_size:
|
||||||
|
has_error = True
|
||||||
|
messages.append(f"FAILURE: entry bounding box height ({entry_height}) for `{ri.field['description']}` is too short for the text content (font size: {font_size}). Increase the box height or decrease the font size.")
|
||||||
|
if len(messages) >= 20:
|
||||||
|
messages.append("Aborting further checks; fix bounding boxes and try again")
|
||||||
|
return messages
|
||||||
|
|
||||||
|
if not has_error:
|
||||||
|
messages.append("SUCCESS: All bounding boxes are valid")
|
||||||
|
return messages
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("Usage: check_bounding_boxes.py [fields.json]")
|
||||||
|
sys.exit(1)
|
||||||
|
# Input file should be in the `fields.json` format described in FORMS.md.
|
||||||
|
with open(sys.argv[1]) as f:
|
||||||
|
messages = get_bounding_box_messages(f)
|
||||||
|
for msg in messages:
|
||||||
|
print(msg)
|
||||||
226
skills/pdf/scripts/check_bounding_boxes_test.py
Normal file
226
skills/pdf/scripts/check_bounding_boxes_test.py
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
import unittest
|
||||||
|
import json
|
||||||
|
import io
|
||||||
|
from check_bounding_boxes import get_bounding_box_messages
|
||||||
|
|
||||||
|
|
||||||
|
# Currently this is not run automatically in CI; it's just for documentation and manual checking.
|
||||||
|
class TestGetBoundingBoxMessages(unittest.TestCase):
|
||||||
|
|
||||||
|
def create_json_stream(self, data):
|
||||||
|
"""Helper to create a JSON stream from data"""
|
||||||
|
return io.StringIO(json.dumps(data))
|
||||||
|
|
||||||
|
def test_no_intersections(self):
|
||||||
|
"""Test case with no bounding box intersections"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 30]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Email",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 40, 50, 60],
|
||||||
|
"entry_bounding_box": [60, 40, 150, 60]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("SUCCESS" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("FAILURE" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_label_entry_intersection_same_field(self):
|
||||||
|
"""Test intersection between label and entry of the same field"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 60, 30],
|
||||||
|
"entry_bounding_box": [50, 10, 150, 30] # Overlaps with label
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("FAILURE" in msg and "intersection" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("SUCCESS" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_intersection_between_different_fields(self):
|
||||||
|
"""Test intersection between bounding boxes of different fields"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 30]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Email",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [40, 20, 80, 40], # Overlaps with Name's boxes
|
||||||
|
"entry_bounding_box": [160, 10, 250, 30]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("FAILURE" in msg and "intersection" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("SUCCESS" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_different_pages_no_intersection(self):
|
||||||
|
"""Test that boxes on different pages don't count as intersecting"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 30]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Email",
|
||||||
|
"page_number": 2,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30], # Same coordinates but different page
|
||||||
|
"entry_bounding_box": [60, 10, 150, 30]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("SUCCESS" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("FAILURE" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_entry_height_too_small(self):
|
||||||
|
"""Test that entry box height is checked against font size"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 20], # Height is 10
|
||||||
|
"entry_text": {
|
||||||
|
"font_size": 14 # Font size larger than height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("FAILURE" in msg and "height" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("SUCCESS" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_entry_height_adequate(self):
|
||||||
|
"""Test that adequate entry box height passes"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 30], # Height is 20
|
||||||
|
"entry_text": {
|
||||||
|
"font_size": 14 # Font size smaller than height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("SUCCESS" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("FAILURE" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_default_font_size(self):
|
||||||
|
"""Test that default font size is used when not specified"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 20], # Height is 10
|
||||||
|
"entry_text": {} # No font_size specified, should use default 14
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("FAILURE" in msg and "height" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("SUCCESS" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_no_entry_text(self):
|
||||||
|
"""Test that missing entry_text doesn't cause height check"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [60, 10, 150, 20] # Small height but no entry_text
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("SUCCESS" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("FAILURE" in msg for msg in messages))
|
||||||
|
|
||||||
|
def test_multiple_errors_limit(self):
|
||||||
|
"""Test that error messages are limited to prevent excessive output"""
|
||||||
|
fields = []
|
||||||
|
# Create many overlapping fields
|
||||||
|
for i in range(25):
|
||||||
|
fields.append({
|
||||||
|
"description": f"Field{i}",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30], # All overlap
|
||||||
|
"entry_bounding_box": [20, 15, 60, 35] # All overlap
|
||||||
|
})
|
||||||
|
|
||||||
|
data = {"form_fields": fields}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
# Should abort after ~20 messages
|
||||||
|
self.assertTrue(any("Aborting" in msg for msg in messages))
|
||||||
|
# Should have some FAILURE messages but not hundreds
|
||||||
|
failure_count = sum(1 for msg in messages if "FAILURE" in msg)
|
||||||
|
self.assertGreater(failure_count, 0)
|
||||||
|
self.assertLess(len(messages), 30) # Should be limited
|
||||||
|
|
||||||
|
def test_edge_touching_boxes(self):
|
||||||
|
"""Test that boxes touching at edges don't count as intersecting"""
|
||||||
|
data = {
|
||||||
|
"form_fields": [
|
||||||
|
{
|
||||||
|
"description": "Name",
|
||||||
|
"page_number": 1,
|
||||||
|
"label_bounding_box": [10, 10, 50, 30],
|
||||||
|
"entry_bounding_box": [50, 10, 150, 30] # Touches at x=50
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
stream = self.create_json_stream(data)
|
||||||
|
messages = get_bounding_box_messages(stream)
|
||||||
|
self.assertTrue(any("SUCCESS" in msg for msg in messages))
|
||||||
|
self.assertFalse(any("FAILURE" in msg for msg in messages))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
12
skills/pdf/scripts/check_fillable_fields.py
Normal file
12
skills/pdf/scripts/check_fillable_fields.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import sys
|
||||||
|
from pypdf import PdfReader
|
||||||
|
|
||||||
|
|
||||||
|
# Script for Claude to run to determine whether a PDF has fillable form fields. See FORMS.md.
|
||||||
|
|
||||||
|
|
||||||
|
reader = PdfReader(sys.argv[1])
|
||||||
|
if (reader.get_fields()):
|
||||||
|
print("This PDF has fillable form fields")
|
||||||
|
else:
|
||||||
|
print("This PDF does not have fillable form fields; you will need to visually determine where to enter data")
|
||||||
35
skills/pdf/scripts/convert_pdf_to_images.py
Normal file
35
skills/pdf/scripts/convert_pdf_to_images.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pdf2image import convert_from_path
|
||||||
|
|
||||||
|
|
||||||
|
# Converts each page of a PDF to a PNG image.
|
||||||
|
|
||||||
|
|
||||||
|
def convert(pdf_path, output_dir, max_dim=1000):
|
||||||
|
images = convert_from_path(pdf_path, dpi=200)
|
||||||
|
|
||||||
|
for i, image in enumerate(images):
|
||||||
|
# Scale image if needed to keep width/height under `max_dim`
|
||||||
|
width, height = image.size
|
||||||
|
if width > max_dim or height > max_dim:
|
||||||
|
scale_factor = min(max_dim / width, max_dim / height)
|
||||||
|
new_width = int(width * scale_factor)
|
||||||
|
new_height = int(height * scale_factor)
|
||||||
|
image = image.resize((new_width, new_height))
|
||||||
|
|
||||||
|
image_path = os.path.join(output_dir, f"page_{i+1}.png")
|
||||||
|
image.save(image_path)
|
||||||
|
print(f"Saved page {i+1} as {image_path} (size: {image.size})")
|
||||||
|
|
||||||
|
print(f"Converted {len(images)} pages to PNG images")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
print("Usage: convert_pdf_to_images.py [input pdf] [output directory]")
|
||||||
|
sys.exit(1)
|
||||||
|
pdf_path = sys.argv[1]
|
||||||
|
output_directory = sys.argv[2]
|
||||||
|
convert(pdf_path, output_directory)
|
||||||
41
skills/pdf/scripts/create_validation_image.py
Normal file
41
skills/pdf/scripts/create_validation_image.py
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
|
||||||
|
# Creates "validation" images with rectangles for the bounding box information that
|
||||||
|
# Claude creates when determining where to add text annotations in PDFs. See FORMS.md.
|
||||||
|
|
||||||
|
|
||||||
|
def create_validation_image(page_number, fields_json_path, input_path, output_path):
|
||||||
|
# Input file should be in the `fields.json` format described in FORMS.md.
|
||||||
|
with open(fields_json_path, 'r') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
img = Image.open(input_path)
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
num_boxes = 0
|
||||||
|
|
||||||
|
for field in data["form_fields"]:
|
||||||
|
if field["page_number"] == page_number:
|
||||||
|
entry_box = field['entry_bounding_box']
|
||||||
|
label_box = field['label_bounding_box']
|
||||||
|
# Draw red rectangle over entry bounding box and blue rectangle over the label.
|
||||||
|
draw.rectangle(entry_box, outline='red', width=2)
|
||||||
|
draw.rectangle(label_box, outline='blue', width=2)
|
||||||
|
num_boxes += 2
|
||||||
|
|
||||||
|
img.save(output_path)
|
||||||
|
print(f"Created validation image at {output_path} with {num_boxes} bounding boxes")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 5:
|
||||||
|
print("Usage: create_validation_image.py [page number] [fields.json file] [input image path] [output image path]")
|
||||||
|
sys.exit(1)
|
||||||
|
page_number = int(sys.argv[1])
|
||||||
|
fields_json_path = sys.argv[2]
|
||||||
|
input_image_path = sys.argv[3]
|
||||||
|
output_image_path = sys.argv[4]
|
||||||
|
create_validation_image(page_number, fields_json_path, input_image_path, output_image_path)
|
||||||
152
skills/pdf/scripts/extract_form_field_info.py
Normal file
152
skills/pdf/scripts/extract_form_field_info.py
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pypdf import PdfReader
|
||||||
|
|
||||||
|
|
||||||
|
# Extracts data for the fillable form fields in a PDF and outputs JSON that
|
||||||
|
# Claude uses to fill the fields. See FORMS.md.
|
||||||
|
|
||||||
|
|
||||||
|
# This matches the format used by PdfReader `get_fields` and `update_page_form_field_values` methods.
|
||||||
|
def get_full_annotation_field_id(annotation):
|
||||||
|
components = []
|
||||||
|
while annotation:
|
||||||
|
field_name = annotation.get('/T')
|
||||||
|
if field_name:
|
||||||
|
components.append(field_name)
|
||||||
|
annotation = annotation.get('/Parent')
|
||||||
|
return ".".join(reversed(components)) if components else None
|
||||||
|
|
||||||
|
|
||||||
|
def make_field_dict(field, field_id):
|
||||||
|
field_dict = {"field_id": field_id}
|
||||||
|
ft = field.get('/FT')
|
||||||
|
if ft == "/Tx":
|
||||||
|
field_dict["type"] = "text"
|
||||||
|
elif ft == "/Btn":
|
||||||
|
field_dict["type"] = "checkbox" # radio groups handled separately
|
||||||
|
states = field.get("/_States_", [])
|
||||||
|
if len(states) == 2:
|
||||||
|
# "/Off" seems to always be the unchecked value, as suggested by
|
||||||
|
# https://opensource.adobe.com/dc-acrobat-sdk-docs/standards/pdfstandards/pdf/PDF32000_2008.pdf#page=448
|
||||||
|
# It can be either first or second in the "/_States_" list.
|
||||||
|
if "/Off" in states:
|
||||||
|
field_dict["checked_value"] = states[0] if states[0] != "/Off" else states[1]
|
||||||
|
field_dict["unchecked_value"] = "/Off"
|
||||||
|
else:
|
||||||
|
print(f"Unexpected state values for checkbox `${field_id}`. Its checked and unchecked values may not be correct; if you're trying to check it, visually verify the results.")
|
||||||
|
field_dict["checked_value"] = states[0]
|
||||||
|
field_dict["unchecked_value"] = states[1]
|
||||||
|
elif ft == "/Ch":
|
||||||
|
field_dict["type"] = "choice"
|
||||||
|
states = field.get("/_States_", [])
|
||||||
|
field_dict["choice_options"] = [{
|
||||||
|
"value": state[0],
|
||||||
|
"text": state[1],
|
||||||
|
} for state in states]
|
||||||
|
else:
|
||||||
|
field_dict["type"] = f"unknown ({ft})"
|
||||||
|
return field_dict
|
||||||
|
|
||||||
|
|
||||||
|
# Returns a list of fillable PDF fields:
|
||||||
|
# [
|
||||||
|
# {
|
||||||
|
# "field_id": "name",
|
||||||
|
# "page": 1,
|
||||||
|
# "type": ("text", "checkbox", "radio_group", or "choice")
|
||||||
|
# // Per-type additional fields described in FORMS.md
|
||||||
|
# },
|
||||||
|
# ]
|
||||||
|
def get_field_info(reader: PdfReader):
|
||||||
|
fields = reader.get_fields()
|
||||||
|
|
||||||
|
field_info_by_id = {}
|
||||||
|
possible_radio_names = set()
|
||||||
|
|
||||||
|
for field_id, field in fields.items():
|
||||||
|
# Skip if this is a container field with children, except that it might be
|
||||||
|
# a parent group for radio button options.
|
||||||
|
if field.get("/Kids"):
|
||||||
|
if field.get("/FT") == "/Btn":
|
||||||
|
possible_radio_names.add(field_id)
|
||||||
|
continue
|
||||||
|
field_info_by_id[field_id] = make_field_dict(field, field_id)
|
||||||
|
|
||||||
|
# Bounding rects are stored in annotations in page objects.
|
||||||
|
|
||||||
|
# Radio button options have a separate annotation for each choice;
|
||||||
|
# all choices have the same field name.
|
||||||
|
# See https://westhealth.github.io/exploring-fillable-forms-with-pdfrw.html
|
||||||
|
radio_fields_by_id = {}
|
||||||
|
|
||||||
|
for page_index, page in enumerate(reader.pages):
|
||||||
|
annotations = page.get('/Annots', [])
|
||||||
|
for ann in annotations:
|
||||||
|
field_id = get_full_annotation_field_id(ann)
|
||||||
|
if field_id in field_info_by_id:
|
||||||
|
field_info_by_id[field_id]["page"] = page_index + 1
|
||||||
|
field_info_by_id[field_id]["rect"] = ann.get('/Rect')
|
||||||
|
elif field_id in possible_radio_names:
|
||||||
|
try:
|
||||||
|
# ann['/AP']['/N'] should have two items. One of them is '/Off',
|
||||||
|
# the other is the active value.
|
||||||
|
on_values = [v for v in ann["/AP"]["/N"] if v != "/Off"]
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
|
if len(on_values) == 1:
|
||||||
|
rect = ann.get("/Rect")
|
||||||
|
if field_id not in radio_fields_by_id:
|
||||||
|
radio_fields_by_id[field_id] = {
|
||||||
|
"field_id": field_id,
|
||||||
|
"type": "radio_group",
|
||||||
|
"page": page_index + 1,
|
||||||
|
"radio_options": [],
|
||||||
|
}
|
||||||
|
# Note: at least on macOS 15.7, Preview.app doesn't show selected
|
||||||
|
# radio buttons correctly. (It does if you remove the leading slash
|
||||||
|
# from the value, but that causes them not to appear correctly in
|
||||||
|
# Chrome/Firefox/Acrobat/etc).
|
||||||
|
radio_fields_by_id[field_id]["radio_options"].append({
|
||||||
|
"value": on_values[0],
|
||||||
|
"rect": rect,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Some PDFs have form field definitions without corresponding annotations,
|
||||||
|
# so we can't tell where they are. Ignore these fields for now.
|
||||||
|
fields_with_location = []
|
||||||
|
for field_info in field_info_by_id.values():
|
||||||
|
if "page" in field_info:
|
||||||
|
fields_with_location.append(field_info)
|
||||||
|
else:
|
||||||
|
print(f"Unable to determine location for field id: {field_info.get('field_id')}, ignoring")
|
||||||
|
|
||||||
|
# Sort by page number, then Y position (flipped in PDF coordinate system), then X.
|
||||||
|
def sort_key(f):
|
||||||
|
if "radio_options" in f:
|
||||||
|
rect = f["radio_options"][0]["rect"] or [0, 0, 0, 0]
|
||||||
|
else:
|
||||||
|
rect = f.get("rect") or [0, 0, 0, 0]
|
||||||
|
adjusted_position = [-rect[1], rect[0]]
|
||||||
|
return [f.get("page"), adjusted_position]
|
||||||
|
|
||||||
|
sorted_fields = fields_with_location + list(radio_fields_by_id.values())
|
||||||
|
sorted_fields.sort(key=sort_key)
|
||||||
|
|
||||||
|
return sorted_fields
|
||||||
|
|
||||||
|
|
||||||
|
def write_field_info(pdf_path: str, json_output_path: str):
|
||||||
|
reader = PdfReader(pdf_path)
|
||||||
|
field_info = get_field_info(reader)
|
||||||
|
with open(json_output_path, "w") as f:
|
||||||
|
json.dump(field_info, f, indent=2)
|
||||||
|
print(f"Wrote {len(field_info)} fields to {json_output_path}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 3:
|
||||||
|
print("Usage: extract_form_field_info.py [input pdf] [output json]")
|
||||||
|
sys.exit(1)
|
||||||
|
write_field_info(sys.argv[1], sys.argv[2])
|
||||||
114
skills/pdf/scripts/fill_fillable_fields.py
Normal file
114
skills/pdf/scripts/fill_fillable_fields.py
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pypdf import PdfReader, PdfWriter
|
||||||
|
|
||||||
|
from extract_form_field_info import get_field_info
|
||||||
|
|
||||||
|
|
||||||
|
# Fills fillable form fields in a PDF. See FORMS.md.
|
||||||
|
|
||||||
|
|
||||||
|
def fill_pdf_fields(input_pdf_path: str, fields_json_path: str, output_pdf_path: str):
|
||||||
|
with open(fields_json_path) as f:
|
||||||
|
fields = json.load(f)
|
||||||
|
# Group by page number.
|
||||||
|
fields_by_page = {}
|
||||||
|
for field in fields:
|
||||||
|
if "value" in field:
|
||||||
|
field_id = field["field_id"]
|
||||||
|
page = field["page"]
|
||||||
|
if page not in fields_by_page:
|
||||||
|
fields_by_page[page] = {}
|
||||||
|
fields_by_page[page][field_id] = field["value"]
|
||||||
|
|
||||||
|
reader = PdfReader(input_pdf_path)
|
||||||
|
|
||||||
|
has_error = False
|
||||||
|
field_info = get_field_info(reader)
|
||||||
|
fields_by_ids = {f["field_id"]: f for f in field_info}
|
||||||
|
for field in fields:
|
||||||
|
existing_field = fields_by_ids.get(field["field_id"])
|
||||||
|
if not existing_field:
|
||||||
|
has_error = True
|
||||||
|
print(f"ERROR: `{field['field_id']}` is not a valid field ID")
|
||||||
|
elif field["page"] != existing_field["page"]:
|
||||||
|
has_error = True
|
||||||
|
print(f"ERROR: Incorrect page number for `{field['field_id']}` (got {field['page']}, expected {existing_field['page']})")
|
||||||
|
else:
|
||||||
|
if "value" in field:
|
||||||
|
err = validation_error_for_field_value(existing_field, field["value"])
|
||||||
|
if err:
|
||||||
|
print(err)
|
||||||
|
has_error = True
|
||||||
|
if has_error:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
writer = PdfWriter(clone_from=reader)
|
||||||
|
for page, field_values in fields_by_page.items():
|
||||||
|
writer.update_page_form_field_values(writer.pages[page - 1], field_values, auto_regenerate=False)
|
||||||
|
|
||||||
|
# This seems to be necessary for many PDF viewers to format the form values correctly.
|
||||||
|
# It may cause the viewer to show a "save changes" dialog even if the user doesn't make any changes.
|
||||||
|
writer.set_need_appearances_writer(True)
|
||||||
|
|
||||||
|
with open(output_pdf_path, "wb") as f:
|
||||||
|
writer.write(f)
|
||||||
|
|
||||||
|
|
||||||
|
def validation_error_for_field_value(field_info, field_value):
|
||||||
|
field_type = field_info["type"]
|
||||||
|
field_id = field_info["field_id"]
|
||||||
|
if field_type == "checkbox":
|
||||||
|
checked_val = field_info["checked_value"]
|
||||||
|
unchecked_val = field_info["unchecked_value"]
|
||||||
|
if field_value != checked_val and field_value != unchecked_val:
|
||||||
|
return f'ERROR: Invalid value "{field_value}" for checkbox field "{field_id}". The checked value is "{checked_val}" and the unchecked value is "{unchecked_val}"'
|
||||||
|
elif field_type == "radio_group":
|
||||||
|
option_values = [opt["value"] for opt in field_info["radio_options"]]
|
||||||
|
if field_value not in option_values:
|
||||||
|
return f'ERROR: Invalid value "{field_value}" for radio group field "{field_id}". Valid values are: {option_values}'
|
||||||
|
elif field_type == "choice":
|
||||||
|
choice_values = [opt["value"] for opt in field_info["choice_options"]]
|
||||||
|
if field_value not in choice_values:
|
||||||
|
return f'ERROR: Invalid value "{field_value}" for choice field "{field_id}". Valid values are: {choice_values}'
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# pypdf (at least version 5.7.0) has a bug when setting the value for a selection list field.
|
||||||
|
# In _writer.py around line 966:
|
||||||
|
#
|
||||||
|
# if field.get(FA.FT, "/Tx") == "/Ch" and field_flags & FA.FfBits.Combo == 0:
|
||||||
|
# txt = "\n".join(annotation.get_inherited(FA.Opt, []))
|
||||||
|
#
|
||||||
|
# The problem is that for selection lists, `get_inherited` returns a list of two-element lists like
|
||||||
|
# [["value1", "Text 1"], ["value2", "Text 2"], ...]
|
||||||
|
# This causes `join` to throw a TypeError because it expects an iterable of strings.
|
||||||
|
# The horrible workaround is to patch `get_inherited` to return a list of the value strings.
|
||||||
|
# We call the original method and adjust the return value only if the argument to `get_inherited`
|
||||||
|
# is `FA.Opt` and if the return value is a list of two-element lists.
|
||||||
|
def monkeypatch_pydpf_method():
|
||||||
|
from pypdf.generic import DictionaryObject
|
||||||
|
from pypdf.constants import FieldDictionaryAttributes
|
||||||
|
|
||||||
|
original_get_inherited = DictionaryObject.get_inherited
|
||||||
|
|
||||||
|
def patched_get_inherited(self, key: str, default = None):
|
||||||
|
result = original_get_inherited(self, key, default)
|
||||||
|
if key == FieldDictionaryAttributes.Opt:
|
||||||
|
if isinstance(result, list) and all(isinstance(v, list) and len(v) == 2 for v in result):
|
||||||
|
result = [r[0] for r in result]
|
||||||
|
return result
|
||||||
|
|
||||||
|
DictionaryObject.get_inherited = patched_get_inherited
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
print("Usage: fill_fillable_fields.py [input pdf] [field_values.json] [output pdf]")
|
||||||
|
sys.exit(1)
|
||||||
|
monkeypatch_pydpf_method()
|
||||||
|
input_pdf = sys.argv[1]
|
||||||
|
fields_json = sys.argv[2]
|
||||||
|
output_pdf = sys.argv[3]
|
||||||
|
fill_pdf_fields(input_pdf, fields_json, output_pdf)
|
||||||
108
skills/pdf/scripts/fill_pdf_form_with_annotations.py
Normal file
108
skills/pdf/scripts/fill_pdf_form_with_annotations.py
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pypdf import PdfReader, PdfWriter
|
||||||
|
from pypdf.annotations import FreeText
|
||||||
|
|
||||||
|
|
||||||
|
# Fills a PDF by adding text annotations defined in `fields.json`. See FORMS.md.
|
||||||
|
|
||||||
|
|
||||||
|
def transform_coordinates(bbox, image_width, image_height, pdf_width, pdf_height):
|
||||||
|
"""Transform bounding box from image coordinates to PDF coordinates"""
|
||||||
|
# Image coordinates: origin at top-left, y increases downward
|
||||||
|
# PDF coordinates: origin at bottom-left, y increases upward
|
||||||
|
x_scale = pdf_width / image_width
|
||||||
|
y_scale = pdf_height / image_height
|
||||||
|
|
||||||
|
left = bbox[0] * x_scale
|
||||||
|
right = bbox[2] * x_scale
|
||||||
|
|
||||||
|
# Flip Y coordinates for PDF
|
||||||
|
top = pdf_height - (bbox[1] * y_scale)
|
||||||
|
bottom = pdf_height - (bbox[3] * y_scale)
|
||||||
|
|
||||||
|
return left, bottom, right, top
|
||||||
|
|
||||||
|
|
||||||
|
def fill_pdf_form(input_pdf_path, fields_json_path, output_pdf_path):
|
||||||
|
"""Fill the PDF form with data from fields.json"""
|
||||||
|
|
||||||
|
# `fields.json` format described in FORMS.md.
|
||||||
|
with open(fields_json_path, "r") as f:
|
||||||
|
fields_data = json.load(f)
|
||||||
|
|
||||||
|
# Open the PDF
|
||||||
|
reader = PdfReader(input_pdf_path)
|
||||||
|
writer = PdfWriter()
|
||||||
|
|
||||||
|
# Copy all pages to writer
|
||||||
|
writer.append(reader)
|
||||||
|
|
||||||
|
# Get PDF dimensions for each page
|
||||||
|
pdf_dimensions = {}
|
||||||
|
for i, page in enumerate(reader.pages):
|
||||||
|
mediabox = page.mediabox
|
||||||
|
pdf_dimensions[i + 1] = [mediabox.width, mediabox.height]
|
||||||
|
|
||||||
|
# Process each form field
|
||||||
|
annotations = []
|
||||||
|
for field in fields_data["form_fields"]:
|
||||||
|
page_num = field["page_number"]
|
||||||
|
|
||||||
|
# Get page dimensions and transform coordinates.
|
||||||
|
page_info = next(p for p in fields_data["pages"] if p["page_number"] == page_num)
|
||||||
|
image_width = page_info["image_width"]
|
||||||
|
image_height = page_info["image_height"]
|
||||||
|
pdf_width, pdf_height = pdf_dimensions[page_num]
|
||||||
|
|
||||||
|
transformed_entry_box = transform_coordinates(
|
||||||
|
field["entry_bounding_box"],
|
||||||
|
image_width, image_height,
|
||||||
|
pdf_width, pdf_height
|
||||||
|
)
|
||||||
|
|
||||||
|
# Skip empty fields
|
||||||
|
if "entry_text" not in field or "text" not in field["entry_text"]:
|
||||||
|
continue
|
||||||
|
entry_text = field["entry_text"]
|
||||||
|
text = entry_text["text"]
|
||||||
|
if not text:
|
||||||
|
continue
|
||||||
|
|
||||||
|
font_name = entry_text.get("font", "Arial")
|
||||||
|
font_size = str(entry_text.get("font_size", 14)) + "pt"
|
||||||
|
font_color = entry_text.get("font_color", "000000")
|
||||||
|
|
||||||
|
# Font size/color seems to not work reliably across viewers:
|
||||||
|
# https://github.com/py-pdf/pypdf/issues/2084
|
||||||
|
annotation = FreeText(
|
||||||
|
text=text,
|
||||||
|
rect=transformed_entry_box,
|
||||||
|
font=font_name,
|
||||||
|
font_size=font_size,
|
||||||
|
font_color=font_color,
|
||||||
|
border_color=None,
|
||||||
|
background_color=None,
|
||||||
|
)
|
||||||
|
annotations.append(annotation)
|
||||||
|
# page_number is 0-based for pypdf
|
||||||
|
writer.add_annotation(page_number=page_num - 1, annotation=annotation)
|
||||||
|
|
||||||
|
# Save the filled PDF
|
||||||
|
with open(output_pdf_path, "wb") as output:
|
||||||
|
writer.write(output)
|
||||||
|
|
||||||
|
print(f"Successfully filled PDF form and saved to {output_pdf_path}")
|
||||||
|
print(f"Added {len(annotations)} text annotations")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 4:
|
||||||
|
print("Usage: fill_pdf_form_with_annotations.py [input pdf] [fields.json] [output pdf]")
|
||||||
|
sys.exit(1)
|
||||||
|
input_pdf = sys.argv[1]
|
||||||
|
fields_json = sys.argv[2]
|
||||||
|
output_pdf = sys.argv[3]
|
||||||
|
|
||||||
|
fill_pdf_form(input_pdf, fields_json, output_pdf)
|
||||||
30
skills/pptx/LICENSE.txt
Normal file
30
skills/pptx/LICENSE.txt
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
© 2025 Anthropic, PBC. All rights reserved.
|
||||||
|
|
||||||
|
LICENSE: Use of these materials (including all code, prompts, assets, files,
|
||||||
|
and other components of this Skill) is governed by your agreement with
|
||||||
|
Anthropic regarding use of Anthropic's services. If no separate agreement
|
||||||
|
exists, use is governed by Anthropic's Consumer Terms of Service or
|
||||||
|
Commercial Terms of Service, as applicable:
|
||||||
|
https://www.anthropic.com/legal/consumer-terms
|
||||||
|
https://www.anthropic.com/legal/commercial-terms
|
||||||
|
Your applicable agreement is referred to as the "Agreement." "Services" are
|
||||||
|
as defined in the Agreement.
|
||||||
|
|
||||||
|
ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the
|
||||||
|
contrary, users may not:
|
||||||
|
|
||||||
|
- Extract these materials from the Services or retain copies of these
|
||||||
|
materials outside the Services
|
||||||
|
- Reproduce or copy these materials, except for temporary copies created
|
||||||
|
automatically during authorized use of the Services
|
||||||
|
- Create derivative works based on these materials
|
||||||
|
- Distribute, sublicense, or transfer these materials to any third party
|
||||||
|
- Make, offer to sell, sell, or import any inventions embodied in these
|
||||||
|
materials
|
||||||
|
- Reverse engineer, decompile, or disassemble these materials
|
||||||
|
|
||||||
|
The receipt, viewing, or possession of these materials does not convey or
|
||||||
|
imply any license or right beyond those expressly granted above.
|
||||||
|
|
||||||
|
Anthropic retains all right, title, and interest in these materials,
|
||||||
|
including all copyrights, patents, and other intellectual property rights.
|
||||||
460
skills/pptx/SKILL.md
Normal file
460
skills/pptx/SKILL.md
Normal file
@@ -0,0 +1,460 @@
|
|||||||
|
---
|
||||||
|
name: pptx
|
||||||
|
description: "Presentation creation, editing, and analysis. When Claude needs to work with presentations (.pptx files) for: (1) Creating new presentations, (2) Modifying or editing content, (3) Working with layouts, (4) Adding comments or speaker notes, or any other presentation tasks"
|
||||||
|
license: Proprietary. LICENSE.txt has complete terms
|
||||||
|
---
|
||||||
|
|
||||||
|
# PPTX creation, editing, and analysis
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Create, edit, or analyze the contents of .pptx files when requested. A .pptx file is essentially a ZIP archive containing XML files and other resources. Different tools and workflows are available for different tasks.
|
||||||
|
|
||||||
|
## Reading and analyzing content
|
||||||
|
|
||||||
|
### Text extraction
|
||||||
|
|
||||||
|
To read just the text content of a presentation, convert the document to markdown:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Convert document to markdown
|
||||||
|
python -m markitdown path-to-file.pptx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Raw XML access
|
||||||
|
|
||||||
|
Use raw XML access for: comments, speaker notes, slide layouts, animations, design elements, and complex formatting. To access these features, unpack a presentation and read its raw XML contents.
|
||||||
|
|
||||||
|
#### Unpacking a file
|
||||||
|
|
||||||
|
`python ooxml/scripts/unpack.py <office_file> <output_dir>`
|
||||||
|
|
||||||
|
**Note**: The unpack.py script is located at `skills/pptx/ooxml/scripts/unpack.py` relative to the project root. If the script doesn't exist at this path, use `find . -name "unpack.py"` to locate it.
|
||||||
|
|
||||||
|
#### Key file structures
|
||||||
|
|
||||||
|
- `ppt/presentation.xml` - Main presentation metadata and slide references
|
||||||
|
- `ppt/slides/slide{N}.xml` - Individual slide contents (slide1.xml, slide2.xml, etc.)
|
||||||
|
- `ppt/notesSlides/notesSlide{N}.xml` - Speaker notes for each slide
|
||||||
|
- `ppt/comments/modernComment_*.xml` - Comments for specific slides
|
||||||
|
- `ppt/slideLayouts/` - Layout templates for slides
|
||||||
|
- `ppt/slideMasters/` - Master slide templates
|
||||||
|
- `ppt/theme/` - Theme and styling information
|
||||||
|
- `ppt/media/` - Images and other media files
|
||||||
|
|
||||||
|
#### Typography and color extraction
|
||||||
|
|
||||||
|
**To emulate example designs**, analyze the presentation's typography and colors first using the methods below:
|
||||||
|
|
||||||
|
1. **Read theme file**: Check `ppt/theme/theme1.xml` for colors (`<a:clrScheme>`) and fonts (`<a:fontScheme>`)
|
||||||
|
2. **Sample slide content**: Examine `ppt/slides/slide1.xml` for actual font usage (`<a:rPr>`) and colors
|
||||||
|
3. **Search for patterns**: Use grep to find color (`<a:solidFill>`, `<a:srgbClr>`) and font references across all XML files
|
||||||
|
|
||||||
|
## Creating a new PowerPoint presentation **without a template**
|
||||||
|
|
||||||
|
When creating a new PowerPoint presentation from scratch, use the **html2pptx** workflow to convert HTML slides to PowerPoint with accurate positioning.
|
||||||
|
|
||||||
|
### Workflow
|
||||||
|
|
||||||
|
1. **MANDATORY - READ ENTIRE FILE NOW**: Read [`html2pptx.md`](html2pptx.md) completely from start to finish. **NEVER set any range limits when reading this file.** Read the full file content for detailed syntax, critical formatting rules, and best practices before proceeding with presentation creation.
|
||||||
|
2. **PREREQUISITE - Install html2pptx library**:
|
||||||
|
- Check and install if needed: `npm list -g @ant/html2pptx || npm install -g skills/pptx/html2pptx.tgz`
|
||||||
|
- **Note**: If you see "Cannot find module '@ant/html2pptx'" error later, the package isn't installed
|
||||||
|
3. **CRITICAL**: Plan the presentation
|
||||||
|
- Plan the shared aspects of the presentation. Describe the tone of the presentation's content and the colors and typography that should be used in the presentation.
|
||||||
|
- Write a DETAILED outline of the presentation
|
||||||
|
- For each slide, describe the slide's layout and contents
|
||||||
|
- For each slide, write presenter notes (1 to 3 sentences per slide)
|
||||||
|
4. **CRITICAL**: Set CSS variables
|
||||||
|
- In a shared `.css` file, override CSS variables to use on each slide for colors, typography, and spacing. DO NOT create classes in this file.
|
||||||
|
5. Create an HTML file for each slide with proper dimensions (e.g., 960px × 540px for 16:9)
|
||||||
|
- Recall the outline, layout/content description, and speaker notes you wrote for this slide in Step 3. Think out loud how to best apply them to this slide.
|
||||||
|
- Embed the contents of the shared `.css` file in a `<style>` element
|
||||||
|
- Use `<p>`, `<h1>`-`<h6>`, `<ul>`, `<ol>` for all text content
|
||||||
|
- **IMPORTANT:** Use CSS variables for colors, typography, and spacing
|
||||||
|
- **IMPORTANT:** Use `row` `col` and `fit` classes for layout INSTEAD OF flexbox
|
||||||
|
- Use `class="placeholder"` for areas where charts/tables will be added (render with gray background for visibility)
|
||||||
|
- **CSS gradients**: Use `linear-gradient()` or `radial-gradient()` in CSS on block element backgrounds - automatically converted to PowerPoint
|
||||||
|
- **Background images**: Use `background-image: url(...)` CSS property on block elements
|
||||||
|
- **Block elements**: Use `<div>`, `<section>`, `<header>`, `<footer>`, `<main>`, `<article>`, `<nav>`, `<aside>` for containers with styling (all behave identically)
|
||||||
|
- **Icons**: Use inline SVG format or reference SVG files - SVG elements are automatically converted to images in PowerPoint
|
||||||
|
- **Text balancing**: `<h1>` and `<h2>` elements are automatically balanced. Use `data-balance` attribute on other elements to auto-balance line lengths for better typography
|
||||||
|
- **Layout**: For slides with charts/tables/images, use either full-slide layout or two-column layout for better readability
|
||||||
|
6. Create and run a JavaScript file using the [`html2pptx`](./html2pptx) library to convert HTML slides to PowerPoint and save the presentation
|
||||||
|
|
||||||
|
- Run with: `NODE_PATH="$(npm root -g)" node your-script.js 2>&1`
|
||||||
|
- Use the `html2pptx` function to process each HTML file
|
||||||
|
- Add charts and tables to placeholder areas using PptxGenJS API
|
||||||
|
- Save the presentation using `pptx.writeFile()`
|
||||||
|
|
||||||
|
- **⚠️ CRITICAL:** Your script MUST follow this example structure. Think aloud before writing the script to make sure that you correctly use the APIs. Do NOT call `pptx.addSlide`.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const pptxgen = require("pptxgenjs");
|
||||||
|
const { html2pptx } = require("@ant/html2pptx");
|
||||||
|
|
||||||
|
// Create a new pptx presentation
|
||||||
|
const pptx = new pptxgen();
|
||||||
|
pptx.layout = "LAYOUT_16x9"; // Must match HTML body dimensions
|
||||||
|
|
||||||
|
// Add an HTML-only slide
|
||||||
|
await html2pptx("slide1.html", pptx);
|
||||||
|
|
||||||
|
// Add a HTML slide with chart placeholders
|
||||||
|
const { slide: slide2, placeholders } = await html2pptx("slide2.html", pptx);
|
||||||
|
slide.addChart(pptx.charts.LINE, chartData, placeholders[0]);
|
||||||
|
|
||||||
|
// Save the presentation
|
||||||
|
await pptx.writeFile("output.pptx");
|
||||||
|
```
|
||||||
|
|
||||||
|
7. **Visual validation**: Generate thumbnails and inspect for layout issues
|
||||||
|
- Create thumbnail grid: `python scripts/thumbnail.py output.pptx workspace/thumbnails --cols 4`
|
||||||
|
- Read and carefully examine the thumbnail image for:
|
||||||
|
- **Text cutoff**: Text being cut off by header bars, shapes, or slide edges
|
||||||
|
- **Text overlap**: Text overlapping with other text or shapes
|
||||||
|
- **Positioning issues**: Content too close to slide boundaries or other elements
|
||||||
|
- **Contrast issues**: Insufficient contrast between text and backgrounds
|
||||||
|
- If issues found, adjust HTML margins/spacing/colors and regenerate the presentation
|
||||||
|
- Repeat until all slides are visually correct
|
||||||
|
|
||||||
|
## Editing an existing PowerPoint presentation
|
||||||
|
|
||||||
|
To edit slides in an existing PowerPoint presentation, work with the raw Office Open XML (OOXML) format. This involves unpacking the .pptx file, editing the XML content, and repacking it.
|
||||||
|
|
||||||
|
### Workflow
|
||||||
|
|
||||||
|
1. **MANDATORY - READ ENTIRE FILE**: Read [`ooxml.md`](ooxml.md) (~500 lines) completely from start to finish. **NEVER set any range limits when reading this file.** Read the full file content for detailed guidance on OOXML structure and editing workflows before any presentation editing.
|
||||||
|
2. Unpack the presentation: `python ooxml/scripts/unpack.py <office_file> <output_dir>`
|
||||||
|
3. Edit the XML files (primarily `ppt/slides/slide{N}.xml` and related files)
|
||||||
|
4. **CRITICAL**: Validate immediately after each edit and fix any validation errors before proceeding: `python ooxml/scripts/validate.py <dir> --original <file>`
|
||||||
|
5. Pack the final presentation: `python ooxml/scripts/pack.py <input_directory> <office_file>`
|
||||||
|
|
||||||
|
## Creating a new PowerPoint presentation **using a template**
|
||||||
|
|
||||||
|
To create a presentation that follows an existing template's design, duplicate and re-arrange template slides before replacing placeholder content.
|
||||||
|
|
||||||
|
### Workflow
|
||||||
|
|
||||||
|
1. **Extract template text AND create visual thumbnail grid**:
|
||||||
|
|
||||||
|
- Extract text: `python -m markitdown template.pptx > template-content.md`
|
||||||
|
- Read `template-content.md`: Read the entire file to understand the contents of the template presentation. **NEVER set any range limits when reading this file.**
|
||||||
|
- Create thumbnail grids: `python scripts/thumbnail.py template.pptx`
|
||||||
|
- See [Creating Thumbnail Grids](#creating-thumbnail-grids) section for more details
|
||||||
|
|
||||||
|
2. **Analyze template and save inventory to a file**:
|
||||||
|
|
||||||
|
- **Visual Analysis**: Review thumbnail grid(s) to understand slide layouts, design patterns, and visual structure
|
||||||
|
- Create and save a template inventory file at `template-inventory.md` containing:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Template Inventory Analysis
|
||||||
|
|
||||||
|
**Total Slides: [count]**
|
||||||
|
**IMPORTANT: Slides are 0-indexed (first slide = 0, last slide = count-1)**
|
||||||
|
|
||||||
|
## [Category Name]
|
||||||
|
|
||||||
|
- Slide 0: [Layout code if available] - Description/purpose
|
||||||
|
- Slide 1: [Layout code] - Description/purpose
|
||||||
|
- Slide 2: [Layout code] - Description/purpose
|
||||||
|
[... EVERY slide must be listed individually with its index ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Using the thumbnail grid**: Reference the visual thumbnails to identify:
|
||||||
|
- Layout patterns (title slides, content layouts, section dividers)
|
||||||
|
- Image placeholder locations and counts
|
||||||
|
- Design consistency across slide groups
|
||||||
|
- Visual hierarchy and structure
|
||||||
|
- This inventory file is REQUIRED for selecting appropriate templates in the next step
|
||||||
|
|
||||||
|
3. **Create presentation outline based on template inventory**:
|
||||||
|
|
||||||
|
- Review available templates from step 2.
|
||||||
|
- Choose an intro or title template for the first slide. This should be one of the first templates.
|
||||||
|
- Choose safe, text-based layouts for the other slides.
|
||||||
|
- **CRITICAL: Match layout structure to actual content**:
|
||||||
|
- Single-column layouts: Use for unified narrative or single topic
|
||||||
|
- Two-column layouts: Use ONLY when there are exactly 2 distinct items/concepts
|
||||||
|
- Three-column layouts: Use ONLY when there are exactly 3 distinct items/concepts
|
||||||
|
- Image + text layouts: Use ONLY when there are actual images to insert
|
||||||
|
- Quote layouts: Use ONLY for actual quotes from people (with attribution), never for emphasis
|
||||||
|
- Never use layouts with more placeholders than available content
|
||||||
|
- With 2 items, avoid forcing them into a 3-column layout
|
||||||
|
- With 4+ items, consider breaking into multiple slides or using a list format
|
||||||
|
- Count actual content pieces BEFORE selecting the layout
|
||||||
|
- Verify each placeholder in the chosen layout will be filled with meaningful content
|
||||||
|
- Select one option representing the **best** layout for each content section.
|
||||||
|
- Save `outline.md` with content AND template mapping that leverages available designs
|
||||||
|
- Example template mapping:
|
||||||
|
```
|
||||||
|
# Template slides to use (0-based indexing)
|
||||||
|
# WARNING: Verify indices are within range! Template with 73 slides has indices 0-72
|
||||||
|
# Mapping: slide numbers from outline -> template slide indices
|
||||||
|
template_mapping = [
|
||||||
|
0, # Use slide 0 (Title/Cover)
|
||||||
|
34, # Use slide 34 (B1: Title and body)
|
||||||
|
34, # Use slide 34 again (duplicate for second B1)
|
||||||
|
50, # Use slide 50 (E1: Quote)
|
||||||
|
54, # Use slide 54 (F2: Closing + Text)
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Duplicate, reorder, and delete slides using `rearrange.py`**:
|
||||||
|
|
||||||
|
- Use the `scripts/rearrange.py` script to create a new presentation with slides in the desired order:
|
||||||
|
```bash
|
||||||
|
python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52
|
||||||
|
```
|
||||||
|
- The script handles duplicating repeated slides, deleting unused slides, and reordering automatically
|
||||||
|
- Slide indices are 0-based (first slide is 0, second is 1, etc.)
|
||||||
|
- The same slide index can appear multiple times to duplicate that slide
|
||||||
|
|
||||||
|
5. **Extract ALL text using the `inventory.py` script**:
|
||||||
|
|
||||||
|
- **Run inventory extraction**:
|
||||||
|
```bash
|
||||||
|
python scripts/inventory.py working.pptx text-inventory.json
|
||||||
|
```
|
||||||
|
- **Read text-inventory.json**: Read the entire text-inventory.json file to understand all shapes and their properties. **NEVER set any range limits when reading this file.**
|
||||||
|
|
||||||
|
- The inventory JSON structure:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"slide-0": {
|
||||||
|
"shape-0": {
|
||||||
|
"placeholder_type": "TITLE", // or null for non-placeholders
|
||||||
|
"left": 1.5, // position in inches
|
||||||
|
"top": 2.0,
|
||||||
|
"width": 7.5,
|
||||||
|
"height": 1.2,
|
||||||
|
"paragraphs": [
|
||||||
|
{
|
||||||
|
"text": "Paragraph text",
|
||||||
|
// Optional properties (only included when non-default):
|
||||||
|
"bullet": true, // explicit bullet detected
|
||||||
|
"level": 0, // only included when bullet is true
|
||||||
|
"alignment": "CENTER", // CENTER, RIGHT (not LEFT)
|
||||||
|
"space_before": 10.0, // space before paragraph in points
|
||||||
|
"space_after": 6.0, // space after paragraph in points
|
||||||
|
"line_spacing": 22.4, // line spacing in points
|
||||||
|
"font_name": "Arial", // from first run
|
||||||
|
"font_size": 14.0, // in points
|
||||||
|
"bold": true,
|
||||||
|
"italic": false,
|
||||||
|
"underline": false,
|
||||||
|
"color": "FF0000" // RGB color
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Key features:
|
||||||
|
- **Slides**: Named as "slide-0", "slide-1", etc.
|
||||||
|
- **Shapes**: Ordered by visual position (top-to-bottom, left-to-right) as "shape-0", "shape-1", etc.
|
||||||
|
- **Placeholder types**: TITLE, CENTER_TITLE, SUBTITLE, BODY, OBJECT, or null
|
||||||
|
- **Default font size**: `default_font_size` in points extracted from layout placeholders (when available)
|
||||||
|
- **Slide numbers are filtered**: Shapes with SLIDE_NUMBER placeholder type are automatically excluded from inventory
|
||||||
|
- **Bullets**: When `bullet: true`, `level` is always included (even if 0)
|
||||||
|
- **Spacing**: `space_before`, `space_after`, and `line_spacing` in points (only included when set)
|
||||||
|
- **Colors**: `color` for RGB (e.g., "FF0000"), `theme_color` for theme colors (e.g., "DARK_1")
|
||||||
|
- **Properties**: Only non-default values are included in the output
|
||||||
|
|
||||||
|
6. **Generate replacement text and save the data to a JSON file**
|
||||||
|
Based on the text inventory from the previous step:
|
||||||
|
|
||||||
|
- **CRITICAL**: First verify which shapes exist in the inventory - only reference shapes that are actually present
|
||||||
|
- **VALIDATION**: The replace.py script validates that all shapes in the replacement JSON exist in the inventory
|
||||||
|
- Referencing a non-existent shape produces an error showing available shapes
|
||||||
|
- Referencing a non-existent slide produces an error indicating the slide doesn't exist
|
||||||
|
- All validation errors are shown at once before the script exits
|
||||||
|
- **IMPORTANT**: The replace.py script uses inventory.py internally to identify ALL text shapes
|
||||||
|
- **AUTOMATIC CLEARING**: ALL text shapes from the inventory are cleared unless "paragraphs" are provided for them
|
||||||
|
- Add a "paragraphs" field to shapes that need content (not "replacement_paragraphs")
|
||||||
|
- Shapes without "paragraphs" in the replacement JSON have their text cleared automatically
|
||||||
|
- Paragraphs with bullets are automatically left aligned. Avoid setting the `alignment` property when `"bullet": true`
|
||||||
|
- Generate appropriate replacement content for placeholder text
|
||||||
|
- Use shape size to determine appropriate content length
|
||||||
|
- **CRITICAL**: Include paragraph properties from the original inventory - don't just provide text
|
||||||
|
- **IMPORTANT**: When bullet: true, do NOT include bullet symbols (•, -, \*) in text - they're added automatically
|
||||||
|
- **ESSENTIAL FORMATTING RULES**:
|
||||||
|
- Headers/titles should typically have `"bold": true`
|
||||||
|
- List items should have `"bullet": true, "level": 0` (level is required when bullet is true)
|
||||||
|
- Preserve any alignment properties (e.g., `"alignment": "CENTER"` for centered text)
|
||||||
|
- Include font properties when different from default (e.g., `"font_size": 14.0`, `"font_name": "Lora"`)
|
||||||
|
- Colors: Use `"color": "FF0000"` for RGB or `"theme_color": "DARK_1"` for theme colors
|
||||||
|
- The replacement script expects **properly formatted paragraphs**, not just text strings
|
||||||
|
- **Overlapping shapes**: Prefer shapes with larger default_font_size or more appropriate placeholder_type
|
||||||
|
- Save the updated inventory with replacements to `replacement-text.json`
|
||||||
|
- **WARNING**: Different template layouts have different shape counts - always check the actual inventory before creating replacements
|
||||||
|
|
||||||
|
Example paragraphs field showing proper formatting:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"paragraphs": [
|
||||||
|
{
|
||||||
|
"text": "New presentation title text",
|
||||||
|
"alignment": "CENTER",
|
||||||
|
"bold": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Section Header",
|
||||||
|
"bold": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "First bullet point without bullet symbol",
|
||||||
|
"bullet": true,
|
||||||
|
"level": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Red colored text",
|
||||||
|
"color": "FF0000"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Theme colored text",
|
||||||
|
"theme_color": "DARK_1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Regular paragraph text without special formatting"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Shapes not listed in the replacement JSON are automatically cleared**:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"slide-0": {
|
||||||
|
"shape-0": {
|
||||||
|
"paragraphs": [...] // This shape gets new text
|
||||||
|
}
|
||||||
|
// shape-1 and shape-2 from inventory will be cleared automatically
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Common formatting patterns for presentations**:
|
||||||
|
|
||||||
|
- Title slides: Bold text, sometimes centered
|
||||||
|
- Section headers within slides: Bold text
|
||||||
|
- Bullet lists: Each item needs `"bullet": true, "level": 0`
|
||||||
|
- Body text: Usually no special properties needed
|
||||||
|
- Quotes: May have special alignment or font properties
|
||||||
|
|
||||||
|
7. **Apply replacements using the `replace.py` script**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/replace.py working.pptx replacement-text.json output.pptx
|
||||||
|
```
|
||||||
|
|
||||||
|
The script will:
|
||||||
|
|
||||||
|
- First extract the inventory of ALL text shapes using functions from inventory.py
|
||||||
|
- Validate that all shapes in the replacement JSON exist in the inventory
|
||||||
|
- Clear text from ALL shapes identified in the inventory
|
||||||
|
- Apply new text only to shapes with "paragraphs" defined in the replacement JSON
|
||||||
|
- Preserve formatting by applying paragraph properties from the JSON
|
||||||
|
- Handle bullets, alignment, font properties, and colors automatically
|
||||||
|
- Save the updated presentation
|
||||||
|
|
||||||
|
Example validation errors:
|
||||||
|
|
||||||
|
```
|
||||||
|
ERROR: Invalid shapes in replacement JSON:
|
||||||
|
- Shape 'shape-99' not found on 'slide-0'. Available shapes: shape-0, shape-1, shape-4
|
||||||
|
- Slide 'slide-999' not found in inventory
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
ERROR: Replacement text made overflow worse in these shapes:
|
||||||
|
- slide-0/shape-2: overflow worsened by 1.25" (was 0.00", now 1.25")
|
||||||
|
```
|
||||||
|
|
||||||
|
## Creating Thumbnail Grids
|
||||||
|
|
||||||
|
To create visual thumbnail grids of PowerPoint slides for quick analysis and reference:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/thumbnail.py template.pptx [output_prefix]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
|
||||||
|
- Creates: `thumbnails.jpg` (or `thumbnails-1.jpg`, `thumbnails-2.jpg`, etc. for large decks)
|
||||||
|
- Default: 5 columns, max 30 slides per grid (5×6)
|
||||||
|
- Custom prefix: `python scripts/thumbnail.py template.pptx my-grid`
|
||||||
|
- Note: The output prefix should include the path if you want output in a specific directory (e.g., `workspace/my-grid`)
|
||||||
|
- Adjust columns: `--cols 4` (range: 3-6, affects slides per grid)
|
||||||
|
- Grid limits: 3 cols = 12 slides/grid, 4 cols = 20, 5 cols = 30, 6 cols = 42
|
||||||
|
- Slides are zero-indexed (Slide 0, Slide 1, etc.)
|
||||||
|
|
||||||
|
**Use cases**:
|
||||||
|
|
||||||
|
- Template analysis: Quickly understand slide layouts and design patterns
|
||||||
|
- Content review: Visual overview of entire presentation
|
||||||
|
- Navigation reference: Find specific slides by their visual appearance
|
||||||
|
- Quality check: Verify all slides are properly formatted
|
||||||
|
|
||||||
|
**Examples**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Basic usage
|
||||||
|
python scripts/thumbnail.py presentation.pptx
|
||||||
|
|
||||||
|
# Combine options: custom name, columns
|
||||||
|
python scripts/thumbnail.py template.pptx analysis --cols 4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Converting Slides to Images
|
||||||
|
|
||||||
|
To visually analyze PowerPoint slides, convert them to images using a two-step process:
|
||||||
|
|
||||||
|
1. **Convert PPTX to PDF**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
soffice --headless --convert-to pdf template.pptx
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Convert PDF pages to JPEG images**:
|
||||||
|
```bash
|
||||||
|
pdftoppm -jpeg -r 150 template.pdf slide
|
||||||
|
```
|
||||||
|
This creates files like `slide-1.jpg`, `slide-2.jpg`, etc.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
- `-r 150`: Sets resolution to 150 DPI (adjust for quality/size balance)
|
||||||
|
- `-jpeg`: Output JPEG format (use `-png` for PNG if preferred)
|
||||||
|
- `-f N`: First page to convert (e.g., `-f 2` starts from page 2)
|
||||||
|
- `-l N`: Last page to convert (e.g., `-l 5` stops at page 5)
|
||||||
|
- `slide`: Prefix for output files
|
||||||
|
|
||||||
|
Example for specific range:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pdftoppm -jpeg -r 150 -f 2 -l 5 template.pdf slide # Converts only pages 2-5
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Style Guidelines
|
||||||
|
|
||||||
|
**IMPORTANT**: When generating code for PPTX operations:
|
||||||
|
|
||||||
|
- Write concise code
|
||||||
|
- Avoid verbose variable names and redundant operations
|
||||||
|
- Avoid unnecessary print statements
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
Required dependencies (should already be installed):
|
||||||
|
|
||||||
|
- **markitdown**: `pip install "markitdown[pptx]"` (for text extraction from presentations)
|
||||||
|
- **pptxgenjs**: `npm install -g pptxgenjs` (for creating presentations via html2pptx)
|
||||||
|
- **playwright**: `npm install -g playwright` (for HTML rendering in html2pptx)
|
||||||
|
- **react-icons**: `npm install -g react-icons react react-dom` (for icons in SVG format)
|
||||||
|
- **LibreOffice**: `sudo apt-get install libreoffice` (for PDF conversion)
|
||||||
|
- **Poppler**: `sudo apt-get install poppler-utils` (for pdftoppm to convert PDF to images)
|
||||||
|
- **defusedxml**: `pip install defusedxml` (for secure XML parsing)
|
||||||
335
skills/pptx/css.md
Normal file
335
skills/pptx/css.md
Normal file
@@ -0,0 +1,335 @@
|
|||||||
|
# Global CSS Framework Reference
|
||||||
|
|
||||||
|
This document provides a comprehensive reference for the global.css framework used in HTML slide creation for PowerPoint conversion.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ No Import Necessary
|
||||||
|
|
||||||
|
The global.css framework is automatically added to every slide. Do NOT try to include it in a slide with `<style>` or `<link>` tags.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The global.css framework is designed specifically for creating HTML slides that convert cleanly to PowerPoint presentations. It provides:
|
||||||
|
|
||||||
|
- **Fixed slide dimensions** (960×540px, 16:9 aspect ratio)
|
||||||
|
- **Consistent design system** with predefined colors, typography, and spacing
|
||||||
|
- **Flexbox-based layout system** for responsive slide content
|
||||||
|
- **Utility-first approach** for rapid slide development
|
||||||
|
- **Professional styling** optimized for business presentations
|
||||||
|
|
||||||
|
## Design System Variables
|
||||||
|
|
||||||
|
### Typography Variables
|
||||||
|
|
||||||
|
```css
|
||||||
|
/* Headings */
|
||||||
|
--font-family-display: Arial, sans-serif;
|
||||||
|
--font-weight-display: 600;
|
||||||
|
|
||||||
|
/* Body text */
|
||||||
|
--font-family-content: Arial, sans-serif;
|
||||||
|
--font-weight-content: 400;
|
||||||
|
--font-size-content: 16px;
|
||||||
|
--line-height-content: 1.4;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Color Palette
|
||||||
|
|
||||||
|
#### Surface Colors
|
||||||
|
|
||||||
|
- `--color-surface`: `#ffffff` - Default background
|
||||||
|
- `--color-surface-foreground`: `#1d1d1d` - Text on default background
|
||||||
|
|
||||||
|
#### Primary Colors
|
||||||
|
|
||||||
|
- `--color-primary`: `#1791e8` - Primary actions/accents
|
||||||
|
- `--color-primary-light`: Lightened primary (10% white mix)
|
||||||
|
- `--color-primary-dark`: Darkened primary (10% black mix)
|
||||||
|
- `--color-primary-foreground`: `#fafafa` - Text on primary background
|
||||||
|
|
||||||
|
#### Secondary Colors
|
||||||
|
|
||||||
|
- `--color-secondary`: `#f5f5f5` - Secondary actions
|
||||||
|
- `--color-secondary-foreground`: `#171717` - Text on secondary background
|
||||||
|
|
||||||
|
#### Utility Colors
|
||||||
|
|
||||||
|
- `--color-muted`: `#f5f5f5` - Subtle backgrounds
|
||||||
|
- `--color-muted-foreground`: `#737373` - Muted text
|
||||||
|
- `--color-accent`: `#f5f5f5` - Accent elements
|
||||||
|
- `--color-accent-foreground`: `#171717` - Text on accent background
|
||||||
|
- `--color-border`: `#c8c8c8` - Border elements
|
||||||
|
|
||||||
|
### Color Utility Classes
|
||||||
|
|
||||||
|
**Background:** `.bg-surface`, `.bg-primary`, `.bg-secondary`, `.bg-muted`, `.bg-accent`, `.bg-border`
|
||||||
|
**Text:** `.text-surface-foreground`, `.text-primary`, `.text-muted-foreground`, etc.
|
||||||
|
_Uses the color variables defined above except `*-light` and `*-dark`_
|
||||||
|
|
||||||
|
### Spacing & Layout
|
||||||
|
|
||||||
|
- `--spacing`: `0.25rem` - Base spacing unit
|
||||||
|
- `--gap`: `calc(var(--spacing) * 4)` - Standard gap (1rem)
|
||||||
|
- `--radius`: `0.4rem` - Standard border radius
|
||||||
|
- `--radius-pill`: `999em` - Pill-shaped border radius
|
||||||
|
|
||||||
|
## Slide Structure
|
||||||
|
|
||||||
|
### Fixed Dimensions
|
||||||
|
|
||||||
|
```css
|
||||||
|
body {
|
||||||
|
width: 960px;
|
||||||
|
height: 540px;
|
||||||
|
overflow: hidden; /* Prevents content overflow */
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Layout System
|
||||||
|
|
||||||
|
### Container Classes
|
||||||
|
|
||||||
|
#### `.row` - Horizontal Layout
|
||||||
|
|
||||||
|
- `flex-direction: row`
|
||||||
|
- `align-items: center`
|
||||||
|
- `justify-content: stretch`
|
||||||
|
- Children with `.fill-width` class expand to fill available width
|
||||||
|
- Children with `.fill-height` class stretch to fill available height
|
||||||
|
|
||||||
|
#### `.col` - Vertical Layout
|
||||||
|
|
||||||
|
- `flex-direction: column`
|
||||||
|
- `align-items: stretch`
|
||||||
|
- `justify-content: center`
|
||||||
|
- Children with `.fill-height` class expand to fill available height
|
||||||
|
- Children with `.fill-width` class stretch to fill available width
|
||||||
|
|
||||||
|
### Flex Item Behavior
|
||||||
|
|
||||||
|
#### `.fill-width` and `.fill-height` - Expandable Elements
|
||||||
|
|
||||||
|
- `.fill-width`: `flex: 1` in row containers (expands to fill available width)
|
||||||
|
- `.fill-height`: `flex: 1` in column containers (expands to fill available height)
|
||||||
|
- Cross-axis variants also apply `align-self: stretch`
|
||||||
|
- **Required** for elements that should expand within flex containers
|
||||||
|
- Use for main content areas
|
||||||
|
|
||||||
|
#### `.items-fill-width` and `.items-fill-height` - Auto-Expanding Children
|
||||||
|
|
||||||
|
- `.items-fill-width`: Makes all direct children expandable horizontally (`flex: 1`)
|
||||||
|
- `.items-fill-height`: Makes all direct children expandable vertically (`flex: 1`)
|
||||||
|
- Cross-axis variants also apply `align-self: stretch` to children
|
||||||
|
- Convenient alternative to adding `.fill-width`/`.fill-height` class to each child
|
||||||
|
- Use when all children should expand equally
|
||||||
|
|
||||||
|
#### `.fit`, `.fit-width`, and `.fit-height` - Fixed-Size Elements
|
||||||
|
|
||||||
|
- `flex: none` (maintains natural size)
|
||||||
|
- `align-self: auto` (uses parent's align-items value)
|
||||||
|
- **Default behavior** for elements without `.fill-width`/`.fill-height` classes
|
||||||
|
- `.fit-width`: axis-specific for row containers (prevents horizontal expansion)
|
||||||
|
- `.fit-height`: axis-specific for column containers (prevents vertical expansion)
|
||||||
|
- Use for elements with fixed size inside `.items-fill-width`/`.items-fill-height` containers
|
||||||
|
|
||||||
|
#### `.center` - Center Content
|
||||||
|
|
||||||
|
- Centers content both horizontally and vertically
|
||||||
|
|
||||||
|
### Example Layout Structure
|
||||||
|
|
||||||
|
```html
|
||||||
|
<body class="col">
|
||||||
|
<header>Fixed header</header>
|
||||||
|
<main class="fill-height row">
|
||||||
|
<aside>Sidebar</aside>
|
||||||
|
<section class="fill-width">Main content</section>
|
||||||
|
</main>
|
||||||
|
<footer>Fixed footer</footer>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Typography Scale
|
||||||
|
|
||||||
|
### Text Sizes
|
||||||
|
|
||||||
|
- `.text-xs`: `0.75rem` (12px)
|
||||||
|
- `.text-sm`: `0.875rem` (14px)
|
||||||
|
- `.text-base`: `1rem` (16px)
|
||||||
|
- `.text-lg`: `1.125rem` (18px)
|
||||||
|
- `.text-xl`: `1.25rem` (20px)
|
||||||
|
- `.text-2xl`: `1.5rem` (24px)
|
||||||
|
- `.text-3xl`: `1.875rem` (30px)
|
||||||
|
- `.text-4xl`: `2.25rem` (36px)
|
||||||
|
- `.text-5xl`: `3rem` (48px)
|
||||||
|
- `.text-6xl`: `3.75rem` (60px)
|
||||||
|
- `.text-7xl`: `4.5rem` (72px)
|
||||||
|
- `.text-8xl`: `6rem` (96px)
|
||||||
|
|
||||||
|
## Utility Classes
|
||||||
|
|
||||||
|
### Alignment Classes
|
||||||
|
|
||||||
|
**text-align**: `.text-left/right/center`
|
||||||
|
**align-items**: `.items-start/center/baseline/stretch/end`
|
||||||
|
**align-self**: `.self-start/center/end`
|
||||||
|
**justify-content**: `.justify-start/center/end`
|
||||||
|
|
||||||
|
### Spacing
|
||||||
|
|
||||||
|
#### Gap Classes
|
||||||
|
|
||||||
|
- `.gap-sm`: Half standard gap
|
||||||
|
- `.gap`: Standard gap (1rem)
|
||||||
|
- `.gap-lg`: Double standard gap
|
||||||
|
- `.gap-xl`: Triple standard gap
|
||||||
|
- `.gap-2xl`: Quadruple standard gap
|
||||||
|
|
||||||
|
#### Spacing Classes (Padding & Margin)
|
||||||
|
|
||||||
|
**Scale**: `0` (0), `1` (0.25rem), `2` (0.5rem), `4` (1rem), `6` (1.5rem), `8` (2rem), `10` (2.5rem), `12` (3rem), `16` (4rem)
|
||||||
|
|
||||||
|
**Padding**: `.p-*` (all), `.px-*` (horizontal), `.py-*` (vertical), `.pt-*` (top), `.pb-*` (bottom), `.ps-*` (start), `.pe-*` (end)
|
||||||
|
|
||||||
|
**Margin**: `.m-*` (all), `.mx-*` (horizontal), `.my-*` (vertical), `.mt-*` (top), `.mb-*` (bottom), `.ms-*` (start), `.me-*` (end)
|
||||||
|
|
||||||
|
### Color Utilities
|
||||||
|
|
||||||
|
### Visual Utilities
|
||||||
|
|
||||||
|
#### Opacity
|
||||||
|
|
||||||
|
- `.opacity-0` to `.opacity-100` in increments of 10
|
||||||
|
|
||||||
|
#### Border Radius
|
||||||
|
|
||||||
|
- `.rounded`: Standard border radius
|
||||||
|
- `.pill`: Pill-shaped (fully rounded)
|
||||||
|
|
||||||
|
#### Width/Height Classes
|
||||||
|
|
||||||
|
- `.w-full`, `.h-full` - Full width/height
|
||||||
|
- `.w-1/2` through `.w-5/6`, `.h-1/2` through `.h-5/6` - Fractional sizing (halves, thirds, fourths, and sixths available)
|
||||||
|
|
||||||
|
#### Aspect Ratio Classes
|
||||||
|
|
||||||
|
**Auto** `.aspect-auto` (browser default)
|
||||||
|
**Square**: `.aspect-1/1`
|
||||||
|
**Landscape**: `.aspect-4/3`, `.aspect-3/2`, `.aspect-16/9`, `.aspect-21/9`
|
||||||
|
**Portrait**: `.aspect-2/3`, `.aspect-3/4`, `.aspect-9/16`
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
### Badge Component
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p><span class="badge">Status</span></p>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Placeholder Component
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div class="placeholder">Chart Area</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Styling:
|
||||||
|
|
||||||
|
- Uses a default `aspect-ratio: 4 / 3;`
|
||||||
|
- Customize by setting `width` `height` or `aspect-ratio` properties
|
||||||
|
- Automatically stretches to fill available space
|
||||||
|
- Used for reserved areas that will be filled with charts or other content
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
### Title Slide
|
||||||
|
|
||||||
|
```html
|
||||||
|
<body class="col center">
|
||||||
|
<h1>Presentation Title</h1>
|
||||||
|
<h2 class="text-2xl opacity-70">Subtitle</h2>
|
||||||
|
<p class="text-sm opacity-50">Author Name • Date</p>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Content Slide with Sidebar
|
||||||
|
|
||||||
|
```html
|
||||||
|
<body class="col">
|
||||||
|
<header>
|
||||||
|
<h2 class="text-primary">Slide Title</h2>
|
||||||
|
</header>
|
||||||
|
<main class="fill-height row gap-lg">
|
||||||
|
<section class="fill-width">
|
||||||
|
<p>Main content goes here...</p>
|
||||||
|
</section>
|
||||||
|
<aside class="bg-muted p-4 rounded" style="min-width: 200px;">
|
||||||
|
<div class="badge bg-primary text-primary-foreground">Important</div>
|
||||||
|
<p class="text-sm text-muted-foreground">Sidebar content</p>
|
||||||
|
</aside>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Two-Column Layout
|
||||||
|
|
||||||
|
```html
|
||||||
|
<body class="col">
|
||||||
|
<h2 class="fit text-center">Comparison</h2>
|
||||||
|
<div class="fill-height row gap-lg items-fill-width">
|
||||||
|
<section>
|
||||||
|
<h3>Option A</h3>
|
||||||
|
<p>Content for option A...</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Option B</h3>
|
||||||
|
<p>Content for option B...</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Centered Content with List
|
||||||
|
|
||||||
|
```html
|
||||||
|
<body class="col center">
|
||||||
|
<h2>Key Points</h2>
|
||||||
|
<ul>
|
||||||
|
<li>First important point</li>
|
||||||
|
<li>Second important point</li>
|
||||||
|
<li>Third important point</li>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Layout Structure
|
||||||
|
|
||||||
|
1. **Start with body class**: Use `.col` for vertical layouts and `.row` for horizontal layouts, add `.center` for centered content
|
||||||
|
2. **Apply `.fill-width`/`.fill-height` and `.fit`**: Control which elements expand vs. maintain fixed size
|
||||||
|
3. **Maintain hierarchy**: Use appropriate heading levels (h1-h6)
|
||||||
|
|
||||||
|
### Spacing and Visual Hierarchy
|
||||||
|
|
||||||
|
1. **Consistent gaps**: Use gap classes instead of margins between flex items
|
||||||
|
2. **Padding for breathing room**: Apply padding classes to containers, not individual elements
|
||||||
|
3. **Selective margins**: Use margin classes sparingly for specific adjustments outside flex containers
|
||||||
|
4. **Directional spacing**: Use directional classes (px, py, mx, my) only when you need asymmetric spacing
|
||||||
|
5. **Typography scale**: Use utility classes for consistent font sizing
|
||||||
|
6. **Color usage**: Stick to the defined color palette for professional appearance
|
||||||
|
|
||||||
|
### Responsive Considerations
|
||||||
|
|
||||||
|
1. **Fixed dimensions**: Content must fit within 960×540px
|
||||||
|
2. **Overflow prevention**: Use `.fit` class to prevent content from growing too large
|
||||||
|
3. **Text scaling**: Use appropriate text size classes for readability
|
||||||
|
4. **White space**: Don't cram too much content on a single slide
|
||||||
|
|
||||||
|
### Performance Tips
|
||||||
|
|
||||||
|
1. **Minimal custom CSS**: Leverage utility classes instead of writing custom styles
|
||||||
|
2. **Consistent structure**: Use similar layout patterns across slides
|
||||||
|
3. **Semantic HTML**: Use appropriate HTML elements for better conversion to PowerPoint
|
||||||
874
skills/pptx/html2pptx.md
Normal file
874
skills/pptx/html2pptx.md
Normal file
@@ -0,0 +1,874 @@
|
|||||||
|
# HTML to PowerPoint Guide
|
||||||
|
|
||||||
|
Convert HTML slides to PowerPoint presentations with accurate positioning using the `html2pptx.js` library.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
1. [Design Principles](#design-principles)
|
||||||
|
2. [Creating HTML Slides](#creating-html-slides)
|
||||||
|
3. [Using the @ant/html2pptx Library](#using-the-html2pptx-library)
|
||||||
|
4. [Using PptxGenJS](#using-pptxgenjs)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ Prerequisites Check
|
||||||
|
|
||||||
|
Verify the @ant/html2pptx package is installed before proceeding:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check if installed and install if not found
|
||||||
|
npm list -g @ant/html2pptx || npm install -g skills/pptx/html2pptx.tgz
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will show the package version if installed, or install it automatically if not found. No additional verification is needed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Design Principles
|
||||||
|
|
||||||
|
**CRITICAL**: Analyze the content and choose appropriate design elements before creating presentations:
|
||||||
|
|
||||||
|
1. **Consider the subject matter**: What is this presentation about? What tone, industry, or mood does it suggest?
|
||||||
|
2. **Check for branding**: If the user mentions a company/organization, consider their brand colors and identity
|
||||||
|
3. **Match palette to content**: Select colors that reflect the subject
|
||||||
|
4. **State your approach**: Explain your design choices before writing code
|
||||||
|
|
||||||
|
**Requirements**:
|
||||||
|
|
||||||
|
- ✅ State your content-informed design approach BEFORE writing code
|
||||||
|
- ✅ Use web-safe fonts only: Arial, Helvetica, Times New Roman, Georgia, Courier New, Verdana, Tahoma, Trebuchet MS, Impact
|
||||||
|
- ✅ Create clear visual hierarchy through size, weight, and color
|
||||||
|
- ✅ Ensure readability: strong contrast, appropriately sized text, clean alignment
|
||||||
|
- ✅ Be consistent: repeat patterns, spacing, and visual language across slides
|
||||||
|
|
||||||
|
#### Typography and content design
|
||||||
|
|
||||||
|
This is a presentation, not a report. Keep slides brief!
|
||||||
|
|
||||||
|
- Paragraphs should be 1 sentence, _maybe_ 2.
|
||||||
|
- You should restrict yourself to 3-5 bullet points per list.
|
||||||
|
- Cards should support short statements/fragments. Maybe a complete sentence if it's short.
|
||||||
|
|
||||||
|
We've found without instruction, agents tend to write 2-3x more text than optimal, so whatever you think is short, it's probably not short enough!
|
||||||
|
|
||||||
|
For visual heirarchy reasons, you should generally not have more than 2 text sizes per slide, 3 or 4 for complex slides with a lot of components and charts. If you need additional distinction, consider using opacity.
|
||||||
|
|
||||||
|
#### Color Palette Selection
|
||||||
|
|
||||||
|
**Choosing colors creatively**:
|
||||||
|
|
||||||
|
- **Think beyond defaults**: What colors genuinely match this specific topic? Avoid autopilot choices.
|
||||||
|
- **Consider multiple angles**: Topic, industry, mood, energy level, target audience, brand identity (if mentioned)
|
||||||
|
- **Be adventurous**: Try unexpected combinations - a healthcare presentation doesn't have to be green, finance doesn't have to be navy
|
||||||
|
- **Build your palette**: Pick 3-5 colors that work together (dominant colors + supporting tones + accent)
|
||||||
|
- **Ensure contrast**: Text must be clearly readable on backgrounds
|
||||||
|
|
||||||
|
**Example color palettes** (use these to spark creativity - choose one, adapt it, or create your own):
|
||||||
|
|
||||||
|
1. **Classic Blue**: Deep navy (#1C2833), slate gray (#2E4053), silver (#AAB7B8), off-white (#F4F6F6)
|
||||||
|
2. **Teal & Coral**: Teal (#5EA8A7), deep teal (#277884), coral (#FE4447), white (#FFFFFF)
|
||||||
|
3. **Bold Red**: Red (#C0392B), bright red (#E74C3C), orange (#F39C12), yellow (#F1C40F), green (#2ECC71)
|
||||||
|
4. **Warm Blush**: Mauve (#A49393), blush (#EED6D3), rose (#E8B4B8), cream (#FAF7F2)
|
||||||
|
5. **Burgundy Luxury**: Burgundy (#5D1D2E), crimson (#951233), rust (#C15937), gold (#997929)
|
||||||
|
6. **Deep Purple & Emerald**: Purple (#B165FB), dark blue (#181B24), emerald (#40695B), white (#FFFFFF)
|
||||||
|
7. **Cream & Forest Green**: Cream (#FFE1C7), forest green (#40695B), white (#FCFCFC)
|
||||||
|
8. **Pink & Purple**: Pink (#F8275B), coral (#FF574A), rose (#FF737D), purple (#3D2F68)
|
||||||
|
9. **Lime & Plum**: Lime (#C5DE82), plum (#7C3A5F), coral (#FD8C6E), blue-gray (#98ACB5)
|
||||||
|
10. **Black & Gold**: Gold (#BF9A4A), black (#000000), cream (#F4F6F6)
|
||||||
|
11. **Sage & Terracotta**: Sage (#87A96B), terracotta (#E07A5F), cream (#F4F1DE), charcoal (#2C2C2C)
|
||||||
|
12. **Charcoal & Red**: Charcoal (#292929), red (#E33737), light gray (#CCCBCB)
|
||||||
|
13. **Vibrant Orange**: Orange (#F96D00), light gray (#F2F2F2), charcoal (#222831)
|
||||||
|
14. **Forest Green**: Black (#191A19), green (#4E9F3D), dark green (#1E5128), white (#FFFFFF)
|
||||||
|
15. **Retro Rainbow**: Purple (#722880), pink (#D72D51), orange (#EB5C18), amber (#F08800), gold (#DEB600)
|
||||||
|
16. **Vintage Earthy**: Mustard (#E3B448), sage (#CBD18F), forest green (#3A6B35), cream (#F4F1DE)
|
||||||
|
17. **Coastal Rose**: Old rose (#AD7670), beaver (#B49886), eggshell (#F3ECDC), ash gray (#BFD5BE)
|
||||||
|
18. **Orange & Turquoise**: Light orange (#FC993E), grayish turquoise (#667C6F), white (#FCFCFC)
|
||||||
|
|
||||||
|
#### Maintaining visual interest
|
||||||
|
|
||||||
|
Make use of icons, image placeholders, and charts to keep slides engaging.
|
||||||
|
|
||||||
|
#### Visual Details Options
|
||||||
|
|
||||||
|
**Geometric Patterns**:
|
||||||
|
|
||||||
|
- Diagonal section dividers instead of horizontal
|
||||||
|
- Asymmetric column widths (30/70, 40/60, 25/75)
|
||||||
|
- Rotated text headers at 90° or 270°
|
||||||
|
- Circular/hexagonal frames for images
|
||||||
|
- Triangular accent shapes in corners
|
||||||
|
- Overlapping shapes for depth
|
||||||
|
|
||||||
|
**Border & Frame Treatments**:
|
||||||
|
|
||||||
|
- Thick single-color borders (10-20px) on one side only
|
||||||
|
- Double-line borders with contrasting colors
|
||||||
|
- Corner brackets instead of full frames
|
||||||
|
- L-shaped borders (top+left or bottom+right)
|
||||||
|
- Underline accents beneath headers (4-6px thick)
|
||||||
|
|
||||||
|
**Typography Treatments**:
|
||||||
|
|
||||||
|
- Extreme size contrast (72px headlines vs 12px body)
|
||||||
|
- All-caps headers with wide letter spacing
|
||||||
|
- Numbered sections in oversized display type
|
||||||
|
- Monospace (Courier New) for data/stats/technical content
|
||||||
|
- Condensed fonts (Arial Narrow) for dense information
|
||||||
|
- Outlined text for emphasis
|
||||||
|
|
||||||
|
**Chart & Data Styling**:
|
||||||
|
|
||||||
|
- Monochrome charts with single accent color for key data
|
||||||
|
- Horizontal bar charts instead of vertical
|
||||||
|
- Dot plots instead of bar charts
|
||||||
|
- Minimal gridlines or none at all
|
||||||
|
- Data labels directly on elements (no legends)
|
||||||
|
- Oversized numbers for key metrics
|
||||||
|
|
||||||
|
**Layout Innovations**:
|
||||||
|
|
||||||
|
- Full-bleed images with text overlays
|
||||||
|
- Sidebar column (20-30% width) for navigation/context
|
||||||
|
- Modular grid systems (3×3, 4×4 blocks)
|
||||||
|
- Z-pattern or F-pattern content flow
|
||||||
|
- Floating text boxes over colored shapes
|
||||||
|
- Magazine-style multi-column layouts
|
||||||
|
|
||||||
|
**Background Treatments**:
|
||||||
|
|
||||||
|
- Solid color blocks occupying 40-60% of slide
|
||||||
|
- Gradient fills (vertical or diagonal only)
|
||||||
|
- Split backgrounds (two colors, diagonal or vertical)
|
||||||
|
- Edge-to-edge color bands
|
||||||
|
- Negative space as a design element
|
||||||
|
|
||||||
|
### Layout Tips
|
||||||
|
|
||||||
|
**To create slides with charts or tables:**
|
||||||
|
|
||||||
|
- **Two-column layout (PREFERRED)**: Use a header spanning the full width, then two columns below - text/bullets in one column and the featured content in the other. This provides better balance and makes charts/tables more readable. Use unequal column widths (e.g., 40%/60% split) to optimize space for each content type.
|
||||||
|
- **Full-slide layout**: Let the featured content (chart/table) take up the entire slide for maximum impact and readability
|
||||||
|
- **NEVER vertically stack**: Do not place charts/tables below text in a single column - this causes poor readability and layout issues
|
||||||
|
|
||||||
|
## Creating HTML Slides
|
||||||
|
|
||||||
|
Every HTML slide must include proper body dimensions:
|
||||||
|
|
||||||
|
- **16:9** (automatically applied): `width: 960px; height: 540px`
|
||||||
|
- **4:3**: `width: 960px; height: 720px`
|
||||||
|
- **16:10**: `width: 960px; height: 600px`
|
||||||
|
|
||||||
|
### How to write CSS
|
||||||
|
|
||||||
|
**MANDATORY - READ ENTIRE FILE**: Read [`css.md`](css.md) (~400 lines) completely from start to finish. **NEVER set any range limits when reading this file.** Read the full file content for detailed guidance on CSS structure before writing any HTML.
|
||||||
|
|
||||||
|
Slides are automatically provided with a global stylesheet which is injected when the HTML is rendered. Guidelines for styles:
|
||||||
|
|
||||||
|
- CRITICAL: REFRAIN FROM DEFINING YOUR OWN TYPE SIZES AND COLORS unless you are explicity "hitting the eject button." Use variables defined in the global stylesheet whenever possible.
|
||||||
|
- Override these CSS variables (using the `:root` selector) to customize the look and feel of your slides
|
||||||
|
- Use the classes from [`css.md`](css.md) when creating your slides. Reference the examples provided in that guide.
|
||||||
|
|
||||||
|
### Supported Elements
|
||||||
|
|
||||||
|
#### Block Elements
|
||||||
|
|
||||||
|
- `<div>`, `<section>`, `<header>`, `<footer>`, `<main>`, `<article>`, `<nav>`, `<aside>` - Container elements with bg/border support (supports gradients and background images)
|
||||||
|
|
||||||
|
#### Text Elements
|
||||||
|
|
||||||
|
- `<p>` - Paragraphs with styling
|
||||||
|
- `<h1>`-`<h6>` - Headings with styling
|
||||||
|
|
||||||
|
#### Lists
|
||||||
|
|
||||||
|
- `<ul>`, `<ol>` - Lists (never use manual bullets •, -, \*)
|
||||||
|
|
||||||
|
#### Inline Formatting
|
||||||
|
|
||||||
|
- `<b>`, `<strong>` - Bold text
|
||||||
|
- `<i>`, `<em>` - Italic text
|
||||||
|
- `<u>` - Underlined text
|
||||||
|
- `<span>` - Inline formatting with CSS styles (bold, italic, underline, color)
|
||||||
|
- `<br>` - Line breaks
|
||||||
|
|
||||||
|
#### Media
|
||||||
|
|
||||||
|
- `<img>` - Images
|
||||||
|
|
||||||
|
#### Special Features
|
||||||
|
|
||||||
|
- `class="placeholder"` - Reserved space for charts (returns `{ id, x, y, w, h }`)
|
||||||
|
- Automatically styled with muted background and dashed border
|
||||||
|
- Stretches to fill available container space
|
||||||
|
- Provides visual indication during development
|
||||||
|
- `data-balance` attribute - Auto-balance text line lengths for better typography. `<h1>` and `<h2>` elements are automatically balanced without needing the `data-balance` attribute.
|
||||||
|
|
||||||
|
### Critical Text Rules
|
||||||
|
|
||||||
|
**IMPORTANT**: These rules must be followed to safely convert HTML to PowerPoint.
|
||||||
|
|
||||||
|
**ALL text MUST be inside `<p>`, `<h1>`-`<h6>`, `<ul>`, or `<ol>` tags:**
|
||||||
|
|
||||||
|
- ✅ Correct: `<div><p>Text here</p></div>`
|
||||||
|
- ❌ Wrong: `<div>Text here</div>` - **Text will NOT appear in PowerPoint**
|
||||||
|
- ❌ Wrong: `<span>Text</span>` - **Text will NOT appear in PowerPoint**
|
||||||
|
- Text in `<div>` or `<span>` without a text tag is silently ignored
|
||||||
|
|
||||||
|
**NEVER use manual bullet symbols (•, -, \*, etc.)** - Use `<ul>` or `<ol>` lists instead
|
||||||
|
|
||||||
|
**Use `row` and `col` classes INSTEAD of flexbox:**
|
||||||
|
|
||||||
|
- ✅ Correct: `<div class="row"><p>Text here</p></div>`
|
||||||
|
- ❌ Wrong: `<div style="display: flex;"><p>Text here</p></div>`
|
||||||
|
|
||||||
|
**ONLY use web-safe fonts that are universally available:**
|
||||||
|
|
||||||
|
- ✅ Web-safe fonts: `Arial`, `Helvetica`, `Times New Roman`, `Georgia`, `Courier New`, `Verdana`, `Tahoma`, `Trebuchet MS`, `Impact`, `Comic Sans MS`
|
||||||
|
- ❌ Wrong: `'Segoe UI'`, `'SF Pro'`, `'Roboto'`, custom fonts - **May cause rendering issues**
|
||||||
|
|
||||||
|
### Shape Styling (block elements only)
|
||||||
|
|
||||||
|
**IMPORTANT: Backgrounds, borders, and shadows only work on block elements, NOT on text elements (`<p>`, `<h1>`-`<h6>`, `<ul>`, `<ol>`)**
|
||||||
|
|
||||||
|
- **Backgrounds**: CSS `background` or `background-color` or `background-image`
|
||||||
|
- `background: var(--color-surface);`
|
||||||
|
- `background: linear-gradient(135deg, var(--color-primary-light) 0%, var(--color-primary-dark) 100%);`
|
||||||
|
- `background: radial-gradient(circle, var(--color-accent-light) 0%, var(--color-accent-dark) 100%);`
|
||||||
|
- `background: url(path/to/image.png)`
|
||||||
|
- **Borders**
|
||||||
|
- Supports uniform borders: `border: 1px solid var(--color-border)`
|
||||||
|
- Supports partial borders: `border-left`, `border-right`, `border-top`, `border-bottom`
|
||||||
|
- **Border radius**
|
||||||
|
- `rounded` CSS class applies the default border-radius
|
||||||
|
- `pill` CSS class applies maximum border-radius to create pill-shaped elements
|
||||||
|
- When height and width are equal, this creates a circle
|
||||||
|
- **Box shadows**
|
||||||
|
- Supports outer shadows only
|
||||||
|
- PowerPoint does not support inset shadows
|
||||||
|
- `box-shadow: 2px 2px 8px rgba(0, 0, 0, 0.3);`
|
||||||
|
|
||||||
|
### Icons
|
||||||
|
|
||||||
|
Icons can be included using either inline SVG or SVG files, which are automatically converted to images in PowerPoint.
|
||||||
|
|
||||||
|
#### How to use react-icons
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const React = require("react");
|
||||||
|
const ReactDOMServer = require("react-dom/server");
|
||||||
|
const { FaHome } = require("react-icons/fa");
|
||||||
|
|
||||||
|
// Generate SVG string from react-icon
|
||||||
|
function renderIconSvg(IconComponent, color, size = "48") {
|
||||||
|
return ReactDOMServer.renderToStaticMarkup(
|
||||||
|
React.createElement(IconComponent, { color: color, size: size })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get SVG markup
|
||||||
|
const homeIconSvg = renderIconSvg(FaHome, "#4472c4", "48");
|
||||||
|
|
||||||
|
// Use in HTML template (inline SVG)
|
||||||
|
// <div style="width: 48px; height: 48px;">${homeIconSvg}</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example Slide HTML
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Slide with title, context, and full bleed placeholder</title>
|
||||||
|
<style>
|
||||||
|
/* Shared CSS variable overrides */
|
||||||
|
:root {
|
||||||
|
--color-primary: #00a4fc;
|
||||||
|
--color-primary-foreground: #ffffff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="row items-fill-width gap-lg">
|
||||||
|
<div class="p-8 pe-0">
|
||||||
|
<h1>Slide title</h1>
|
||||||
|
<p class="text-2xl text-muted-foreground">Subtitle or context</p>
|
||||||
|
</div>
|
||||||
|
<div class="placeholder w-3/5 fit"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using the @ant/html2pptx Library
|
||||||
|
|
||||||
|
### Installation & Setup
|
||||||
|
|
||||||
|
**Important**: Install the @ant/html2pptx package globally before using this library. See the **Prerequisites Check** section at the top of this document.
|
||||||
|
|
||||||
|
**When running scripts, always set NODE_PATH:**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
NODE_PATH="$(npm root -g)" node your-script.js 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
**If you get "Cannot find module" errors**, see the Prerequisites Check section or verify that NODE_PATH is correctly pointing to the global node_modules directory.
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
These libraries have been globally installed and are available to use:
|
||||||
|
|
||||||
|
- `pptxgenjs`
|
||||||
|
- `playwright`
|
||||||
|
|
||||||
|
### ⚠️ IMPORTANT: How To Use html2pptx
|
||||||
|
|
||||||
|
Common errors:
|
||||||
|
|
||||||
|
- DO NOT call `pptx.addSlide()` directly, `html2pptx` creates a slide for you
|
||||||
|
- `html2pptx` accepts an `htmlFilePath` and a `pptx` presentation object
|
||||||
|
- If you pass the wrong arguments, your script will throw errors or time out
|
||||||
|
|
||||||
|
**Your script MUST follow the following example.**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const pptxgen = require("pptxgenjs");
|
||||||
|
const { html2pptx } = require("@ant/html2pptx");
|
||||||
|
|
||||||
|
// Create a new pptx presentation
|
||||||
|
const pptx = new pptxgen();
|
||||||
|
pptx.layout = "LAYOUT_16x9"; // Must match HTML body dimensions
|
||||||
|
|
||||||
|
// Add an HTML-only slide
|
||||||
|
await html2pptx("slide1.html", pptx);
|
||||||
|
|
||||||
|
// Add a slide with a chart placeholder
|
||||||
|
const { slide, placeholders } = await html2pptx("slide2.html", pptx);
|
||||||
|
slide.addChart(pptx.charts.LINE, chartData, placeholders[0]);
|
||||||
|
|
||||||
|
// Save the presentation
|
||||||
|
await pptx.writeFile("output.pptx");
|
||||||
|
```
|
||||||
|
|
||||||
|
### API Reference
|
||||||
|
|
||||||
|
#### Function Signature
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await html2pptx(htmlFilePath, pptxPresentation, options);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Parameters
|
||||||
|
|
||||||
|
- `htmlFilePath` (string): Path to HTML file (absolute or relative)
|
||||||
|
- `pptxPresentation` (pptxgen): PptxGenJS presentation instance with layout already set
|
||||||
|
- `options` (object, optional):
|
||||||
|
- `tmpDir` (string): Temporary directory for generated files (default: `process.env.TMPDIR || '/tmp'`)
|
||||||
|
|
||||||
|
#### Returns
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
slide: pptxgenSlide, // The created/updated slide
|
||||||
|
placeholders: [ // Array of placeholder positions
|
||||||
|
{ id: string, x: number, y: number, w: number, h: number },
|
||||||
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Validation
|
||||||
|
|
||||||
|
The library automatically validates and collects all errors before throwing:
|
||||||
|
|
||||||
|
1. **HTML dimensions must match presentation layout** - Reports dimension mismatches
|
||||||
|
2. **Content must not overflow body** - Reports overflow with exact measurements
|
||||||
|
3. **Text element styling** - Reports backgrounds/borders/shadows on text elements (only allowed on block elements)
|
||||||
|
|
||||||
|
**All validation errors are collected and reported together** in a single error message, allowing you to fix all issues at once instead of one at a time.
|
||||||
|
|
||||||
|
### Working with Placeholders
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const { slide, placeholders } = await html2pptx("slide.html", pptx);
|
||||||
|
|
||||||
|
// Use first placeholder
|
||||||
|
slide.addChart(pptx.charts.BAR, data, placeholders[0]);
|
||||||
|
|
||||||
|
// Find by ID
|
||||||
|
const chartArea = placeholders.find((p) => p.id === "chart-area");
|
||||||
|
slide.addChart(pptx.charts.LINE, data, chartArea);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Complete Example
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const pptxgen = require("pptxgenjs");
|
||||||
|
const { html2pptx } = require("@ant/html2pptx");
|
||||||
|
|
||||||
|
async function createPresentation() {
|
||||||
|
const pptx = new pptxgen();
|
||||||
|
pptx.layout = "LAYOUT_16x9";
|
||||||
|
pptx.author = "Your Name";
|
||||||
|
pptx.title = "My Presentation";
|
||||||
|
|
||||||
|
// Slide 1: Title
|
||||||
|
const { slide: slide1 } = await html2pptx("slides/title.html", pptx);
|
||||||
|
|
||||||
|
// Slide 2: Content with chart
|
||||||
|
const { slide: slide2, placeholders } = await html2pptx(
|
||||||
|
"slides/data.html",
|
||||||
|
pptx
|
||||||
|
);
|
||||||
|
|
||||||
|
const chartData = [
|
||||||
|
{
|
||||||
|
name: "Sales",
|
||||||
|
labels: ["Q1", "Q2", "Q3", "Q4"],
|
||||||
|
values: [4500, 5500, 6200, 7100],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
slide2.addChart(pptx.charts.BAR, chartData, {
|
||||||
|
...placeholders[0],
|
||||||
|
showTitle: true,
|
||||||
|
title: "Quarterly Sales",
|
||||||
|
showCatAxisTitle: true,
|
||||||
|
catAxisTitle: "Quarter",
|
||||||
|
showValAxisTitle: true,
|
||||||
|
valAxisTitle: "Sales ($000s)",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save
|
||||||
|
await pptx.writeFile({ fileName: "presentation.pptx" });
|
||||||
|
console.log("Presentation created successfully!");
|
||||||
|
}
|
||||||
|
|
||||||
|
createPresentation().catch(console.error);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Run with:**
|
||||||
|
|
||||||
|
```sh
|
||||||
|
NODE_PATH="$(npm root -g)" node create-presentation.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using PptxGenJS
|
||||||
|
|
||||||
|
After converting HTML to slides with `html2pptx`, you'll use PptxGenJS to add dynamic content like charts, images, and additional elements.
|
||||||
|
|
||||||
|
### ⚠️ Critical Rules
|
||||||
|
|
||||||
|
#### Colors
|
||||||
|
|
||||||
|
- **NEVER use `#` prefix** with hex colors in PptxGenJS - causes file corruption
|
||||||
|
- ✅ Correct: `color: "FF0000"`, `fill: { color: "0066CC" }`
|
||||||
|
- ❌ Wrong: `color: "#FF0000"` (breaks document)
|
||||||
|
|
||||||
|
### Adding Images
|
||||||
|
|
||||||
|
Always calculate aspect ratios from actual image dimensions:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Get image dimensions: identify image.png | grep -o '[0-9]* x [0-9]*'
|
||||||
|
const imgWidth = 1860,
|
||||||
|
imgHeight = 1519; // From actual file
|
||||||
|
const aspectRatio = imgWidth / imgHeight;
|
||||||
|
|
||||||
|
const h = 3; // Max height
|
||||||
|
const w = h * aspectRatio;
|
||||||
|
const x = (10 - w) / 2; // Center on 16:9 slide
|
||||||
|
|
||||||
|
slide.addImage({ path: "chart.png", x, y: 1.5, w, h });
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Text
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Rich text with formatting
|
||||||
|
slide.addText(
|
||||||
|
[
|
||||||
|
{ text: "Bold ", options: { bold: true } },
|
||||||
|
{ text: "Italic ", options: { italic: true } },
|
||||||
|
{ text: "Normal" },
|
||||||
|
],
|
||||||
|
{
|
||||||
|
x: 1,
|
||||||
|
y: 2,
|
||||||
|
w: 8,
|
||||||
|
h: 1,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Shapes
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Rectangle
|
||||||
|
slide.addShape(pptx.shapes.RECTANGLE, {
|
||||||
|
x: 1,
|
||||||
|
y: 1,
|
||||||
|
w: 3,
|
||||||
|
h: 2,
|
||||||
|
fill: { color: "4472C4" },
|
||||||
|
line: { color: "000000", width: 2 },
|
||||||
|
});
|
||||||
|
|
||||||
|
// Circle
|
||||||
|
slide.addShape(pptx.shapes.OVAL, {
|
||||||
|
x: 5,
|
||||||
|
y: 1,
|
||||||
|
w: 2,
|
||||||
|
h: 2,
|
||||||
|
fill: { color: "ED7D31" },
|
||||||
|
});
|
||||||
|
|
||||||
|
// Rounded rectangle
|
||||||
|
slide.addShape(pptx.shapes.ROUNDED_RECTANGLE, {
|
||||||
|
x: 1,
|
||||||
|
y: 4,
|
||||||
|
w: 3,
|
||||||
|
h: 1.5,
|
||||||
|
fill: { color: "70AD47" },
|
||||||
|
rectRadius: 0.2,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Charts
|
||||||
|
|
||||||
|
**Required for most charts:** Axis labels using `catAxisTitle` (category) and `valAxisTitle` (value).
|
||||||
|
|
||||||
|
**Chart Data Format:**
|
||||||
|
|
||||||
|
- Use **single series with all labels** for simple bar/line charts
|
||||||
|
- Each series creates a separate legend entry
|
||||||
|
- Labels array defines X-axis values
|
||||||
|
|
||||||
|
**Time Series Data - Choose Correct Granularity:**
|
||||||
|
|
||||||
|
- **< 30 days**: Use daily grouping (e.g., "10-01", "10-02") - avoid monthly aggregation that creates single-point charts
|
||||||
|
- **30-365 days**: Use monthly grouping (e.g., "2024-01", "2024-02")
|
||||||
|
- **> 365 days**: Use yearly grouping (e.g., "2023", "2024")
|
||||||
|
- **Validate**: Charts with only 1 data point likely indicate incorrect aggregation for the time period
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const { slide, placeholders } = await html2pptx("slide.html", pptx);
|
||||||
|
|
||||||
|
// CORRECT: Single series with all labels
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.BAR,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Sales 2024",
|
||||||
|
labels: ["Q1", "Q2", "Q3", "Q4"],
|
||||||
|
values: [4500, 5500, 6200, 7100],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
{
|
||||||
|
...placeholders[0], // Use placeholder position
|
||||||
|
barDir: "col", // 'col' = vertical bars, 'bar' = horizontal
|
||||||
|
showTitle: true,
|
||||||
|
title: "Quarterly Sales",
|
||||||
|
showLegend: false, // No legend needed for single series
|
||||||
|
// Required axis labels
|
||||||
|
showCatAxisTitle: true,
|
||||||
|
catAxisTitle: "Quarter",
|
||||||
|
showValAxisTitle: true,
|
||||||
|
valAxisTitle: "Sales ($000s)",
|
||||||
|
// Optional: Control scaling (adjust min based on data range for better visualization)
|
||||||
|
valAxisMaxVal: 8000,
|
||||||
|
valAxisMinVal: 0, // Use 0 for counts/amounts; for clustered data (e.g., 4500-7100), consider starting closer to min value
|
||||||
|
valAxisMajorUnit: 2000, // Control y-axis label spacing to prevent crowding
|
||||||
|
catAxisLabelRotate: 45, // Rotate labels if crowded
|
||||||
|
dataLabelPosition: "outEnd",
|
||||||
|
dataLabelColor: "000000",
|
||||||
|
// Use single color for single-series charts
|
||||||
|
chartColors: ["4472C4"], // All bars same color
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Scatter Chart
|
||||||
|
|
||||||
|
**IMPORTANT**: Scatter chart data format is unusual - first series contains X-axis values, subsequent series contain Y-values:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Prepare data
|
||||||
|
const data1 = [
|
||||||
|
{ x: 10, y: 20 },
|
||||||
|
{ x: 15, y: 25 },
|
||||||
|
{ x: 20, y: 30 },
|
||||||
|
];
|
||||||
|
const data2 = [
|
||||||
|
{ x: 12, y: 18 },
|
||||||
|
{ x: 18, y: 22 },
|
||||||
|
];
|
||||||
|
|
||||||
|
const allXValues = [...data1.map((d) => d.x), ...data2.map((d) => d.x)];
|
||||||
|
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.SCATTER,
|
||||||
|
[
|
||||||
|
{ name: "X-Axis", values: allXValues }, // First series = X values
|
||||||
|
{ name: "Series 1", values: data1.map((d) => d.y) }, // Y values only
|
||||||
|
{ name: "Series 2", values: data2.map((d) => d.y) }, // Y values only
|
||||||
|
],
|
||||||
|
{
|
||||||
|
x: 1,
|
||||||
|
y: 1,
|
||||||
|
w: 8,
|
||||||
|
h: 4,
|
||||||
|
lineSize: 0, // 0 = no connecting lines
|
||||||
|
lineDataSymbol: "circle",
|
||||||
|
lineDataSymbolSize: 6,
|
||||||
|
showCatAxisTitle: true,
|
||||||
|
catAxisTitle: "X Axis",
|
||||||
|
showValAxisTitle: true,
|
||||||
|
valAxisTitle: "Y Axis",
|
||||||
|
chartColors: ["4472C4", "ED7D31"],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Line Chart
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.LINE,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Temperature",
|
||||||
|
labels: ["Jan", "Feb", "Mar", "Apr"],
|
||||||
|
values: [32, 35, 42, 55],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
{
|
||||||
|
x: 1,
|
||||||
|
y: 1,
|
||||||
|
w: 8,
|
||||||
|
h: 4,
|
||||||
|
lineSize: 4,
|
||||||
|
lineSmooth: true,
|
||||||
|
// Required axis labels
|
||||||
|
showCatAxisTitle: true,
|
||||||
|
catAxisTitle: "Month",
|
||||||
|
showValAxisTitle: true,
|
||||||
|
valAxisTitle: "Temperature (°F)",
|
||||||
|
// Optional: Y-axis range (set min based on data range for better visualization)
|
||||||
|
valAxisMinVal: 0, // For ranges starting at 0 (counts, percentages, etc.)
|
||||||
|
valAxisMaxVal: 60,
|
||||||
|
valAxisMajorUnit: 20, // Control y-axis label spacing to prevent crowding (e.g., 10, 20, 25)
|
||||||
|
// valAxisMinVal: 30, // PREFERRED: For data clustered in a range (e.g., 32-55 or ratings 3-5), start axis closer to min value to show variation
|
||||||
|
// Optional: Chart colors
|
||||||
|
chartColors: ["4472C4", "ED7D31", "A5A5A5"],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Pie Chart (No Axis Labels Required)
|
||||||
|
|
||||||
|
**CRITICAL**: Pie charts require a **single data series** with all categories in the `labels` array and corresponding values in the `values` array.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.PIE,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Market Share",
|
||||||
|
labels: ["Product A", "Product B", "Other"], // All categories in one array
|
||||||
|
values: [35, 45, 20], // All values in one array
|
||||||
|
},
|
||||||
|
],
|
||||||
|
{
|
||||||
|
x: 2,
|
||||||
|
y: 1,
|
||||||
|
w: 6,
|
||||||
|
h: 4,
|
||||||
|
showPercent: true,
|
||||||
|
showLegend: true,
|
||||||
|
legendPos: "r", // right
|
||||||
|
chartColors: ["4472C4", "ED7D31", "A5A5A5"],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Multiple Data Series
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.LINE,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Product A",
|
||||||
|
labels: ["Q1", "Q2", "Q3", "Q4"],
|
||||||
|
values: [10, 20, 30, 40],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Product B",
|
||||||
|
labels: ["Q1", "Q2", "Q3", "Q4"],
|
||||||
|
values: [15, 25, 20, 35],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
{
|
||||||
|
x: 1,
|
||||||
|
y: 1,
|
||||||
|
w: 8,
|
||||||
|
h: 4,
|
||||||
|
showCatAxisTitle: true,
|
||||||
|
catAxisTitle: "Quarter",
|
||||||
|
showValAxisTitle: true,
|
||||||
|
valAxisTitle: "Revenue ($M)",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Chart Colors
|
||||||
|
|
||||||
|
**CRITICAL**: Use hex colors **without** the `#` prefix - including `#` causes file corruption.
|
||||||
|
|
||||||
|
**Align chart colors with your chosen design palette**, ensuring sufficient contrast and distinctiveness for data visualization. Adjust colors for:
|
||||||
|
|
||||||
|
- Strong contrast between adjacent series
|
||||||
|
- Readability against slide backgrounds
|
||||||
|
- Accessibility (avoid red-green only combinations)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Example: Ocean palette-inspired chart colors (adjusted for contrast)
|
||||||
|
const chartColors = ["16A085", "FF6B9D", "2C3E50", "F39C12", "9B59B6"];
|
||||||
|
|
||||||
|
// Single-series chart: Use one color for all bars/points
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.BAR,
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name: "Sales",
|
||||||
|
labels: ["Q1", "Q2", "Q3", "Q4"],
|
||||||
|
values: [4500, 5500, 6200, 7100],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
{
|
||||||
|
...placeholders[0],
|
||||||
|
chartColors: ["16A085"], // All bars same color
|
||||||
|
showLegend: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Multi-series chart: Each series gets a different color
|
||||||
|
slide.addChart(
|
||||||
|
pptx.charts.LINE,
|
||||||
|
[
|
||||||
|
{ name: "Product A", labels: ["Q1", "Q2", "Q3"], values: [10, 20, 30] },
|
||||||
|
{ name: "Product B", labels: ["Q1", "Q2", "Q3"], values: [15, 25, 20] },
|
||||||
|
],
|
||||||
|
{
|
||||||
|
...placeholders[0],
|
||||||
|
chartColors: ["16A085", "FF6B9D"], // One color per series
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Tables
|
||||||
|
|
||||||
|
Tables can be added with basic or advanced formatting:
|
||||||
|
|
||||||
|
#### Basic Table
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
slide.addTable(
|
||||||
|
[
|
||||||
|
["Header 1", "Header 2", "Header 3"],
|
||||||
|
["Row 1, Col 1", "Row 1, Col 2", "Row 1, Col 3"],
|
||||||
|
["Row 2, Col 1", "Row 2, Col 2", "Row 2, Col 3"],
|
||||||
|
],
|
||||||
|
{
|
||||||
|
x: 0.5,
|
||||||
|
y: 1,
|
||||||
|
w: 9,
|
||||||
|
h: 3,
|
||||||
|
border: { pt: 1, color: "999999" },
|
||||||
|
fill: { color: "F1F1F1" },
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Table with Custom Formatting
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const tableData = [
|
||||||
|
// Header row with custom styling
|
||||||
|
[
|
||||||
|
{
|
||||||
|
text: "Product",
|
||||||
|
options: { fill: { color: "4472C4" }, color: "FFFFFF", bold: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Revenue",
|
||||||
|
options: { fill: { color: "4472C4" }, color: "FFFFFF", bold: true },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Growth",
|
||||||
|
options: { fill: { color: "4472C4" }, color: "FFFFFF", bold: true },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
// Data rows
|
||||||
|
["Product A", "$50M", "+15%"],
|
||||||
|
["Product B", "$35M", "+22%"],
|
||||||
|
["Product C", "$28M", "+8%"],
|
||||||
|
];
|
||||||
|
|
||||||
|
slide.addTable(tableData, {
|
||||||
|
x: 1,
|
||||||
|
y: 1.5,
|
||||||
|
w: 8,
|
||||||
|
h: 3,
|
||||||
|
colW: [3, 2.5, 2.5], // Column widths
|
||||||
|
rowH: [0.5, 0.6, 0.6, 0.6], // Row heights
|
||||||
|
border: { pt: 1, color: "CCCCCC" },
|
||||||
|
align: "center",
|
||||||
|
valign: "middle",
|
||||||
|
fontSize: 14,
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Table with Merged Cells
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const mergedTableData = [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
text: "Q1 Results",
|
||||||
|
options: {
|
||||||
|
colspan: 3,
|
||||||
|
fill: { color: "4472C4" },
|
||||||
|
color: "FFFFFF",
|
||||||
|
bold: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
["Product", "Sales", "Market Share"],
|
||||||
|
["Product A", "$25M", "35%"],
|
||||||
|
["Product B", "$18M", "25%"],
|
||||||
|
];
|
||||||
|
|
||||||
|
slide.addTable(mergedTableData, {
|
||||||
|
x: 1,
|
||||||
|
y: 1,
|
||||||
|
w: 8,
|
||||||
|
h: 2.5,
|
||||||
|
colW: [3, 2.5, 2.5],
|
||||||
|
border: { pt: 1, color: "DDDDDD" },
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Table Options
|
||||||
|
|
||||||
|
Common table options:
|
||||||
|
|
||||||
|
- `x, y, w, h` - Position and size
|
||||||
|
- `colW` - Array of column widths (in inches)
|
||||||
|
- `rowH` - Array of row heights (in inches)
|
||||||
|
- `border` - Border style: `{ pt: 1, color: "999999" }`
|
||||||
|
- `fill` - Background color (no # prefix)
|
||||||
|
- `align` - Text alignment: "left", "center", "right"
|
||||||
|
- `valign` - Vertical alignment: "top", "middle", "bottom"
|
||||||
|
- `fontSize` - Text size
|
||||||
|
- `autoPage` - Auto-create new slides if content overflows
|
||||||
BIN
skills/pptx/html2pptx.tgz
Normal file
BIN
skills/pptx/html2pptx.tgz
Normal file
Binary file not shown.
427
skills/pptx/ooxml.md
Normal file
427
skills/pptx/ooxml.md
Normal file
@@ -0,0 +1,427 @@
|
|||||||
|
# Office Open XML Technical Reference for PowerPoint
|
||||||
|
|
||||||
|
**Important: Read this entire document before starting.** Critical XML schema rules and formatting requirements are covered throughout. Incorrect implementation can create invalid PPTX files that PowerPoint cannot open.
|
||||||
|
|
||||||
|
## Technical Guidelines
|
||||||
|
|
||||||
|
### Schema Compliance
|
||||||
|
- **Element ordering in `<p:txBody>`**: `<a:bodyPr>`, `<a:lstStyle>`, `<a:p>`
|
||||||
|
- **Whitespace**: Add `xml:space='preserve'` to `<a:t>` elements with leading/trailing spaces
|
||||||
|
- **Unicode**: Escape characters in ASCII content: `"` becomes `“`
|
||||||
|
- **Images**: Add to `ppt/media/`, reference in slide XML, set dimensions to fit slide bounds
|
||||||
|
- **Relationships**: Update `ppt/slides/_rels/slideN.xml.rels` for each slide's resources
|
||||||
|
- **Dirty attribute**: Add `dirty="0"` to `<a:rPr>` and `<a:endParaRPr>` elements to indicate clean state
|
||||||
|
|
||||||
|
## Presentation Structure
|
||||||
|
|
||||||
|
### Basic Slide Structure
|
||||||
|
```xml
|
||||||
|
<!-- ppt/slides/slide1.xml -->
|
||||||
|
<p:sld>
|
||||||
|
<p:cSld>
|
||||||
|
<p:spTree>
|
||||||
|
<p:nvGrpSpPr>...</p:nvGrpSpPr>
|
||||||
|
<p:grpSpPr>...</p:grpSpPr>
|
||||||
|
<!-- Shapes go here -->
|
||||||
|
</p:spTree>
|
||||||
|
</p:cSld>
|
||||||
|
</p:sld>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Text Box / Shape with Text
|
||||||
|
```xml
|
||||||
|
<p:sp>
|
||||||
|
<p:nvSpPr>
|
||||||
|
<p:cNvPr id="2" name="Title"/>
|
||||||
|
<p:cNvSpPr>
|
||||||
|
<a:spLocks noGrp="1"/>
|
||||||
|
</p:cNvSpPr>
|
||||||
|
<p:nvPr>
|
||||||
|
<p:ph type="ctrTitle"/>
|
||||||
|
</p:nvPr>
|
||||||
|
</p:nvSpPr>
|
||||||
|
<p:spPr>
|
||||||
|
<a:xfrm>
|
||||||
|
<a:off x="838200" y="365125"/>
|
||||||
|
<a:ext cx="7772400" cy="1470025"/>
|
||||||
|
</a:xfrm>
|
||||||
|
</p:spPr>
|
||||||
|
<p:txBody>
|
||||||
|
<a:bodyPr/>
|
||||||
|
<a:lstStyle/>
|
||||||
|
<a:p>
|
||||||
|
<a:r>
|
||||||
|
<a:t>Slide Title</a:t>
|
||||||
|
</a:r>
|
||||||
|
</a:p>
|
||||||
|
</p:txBody>
|
||||||
|
</p:sp>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Text Formatting
|
||||||
|
```xml
|
||||||
|
<!-- Bold -->
|
||||||
|
<a:r>
|
||||||
|
<a:rPr b="1"/>
|
||||||
|
<a:t>Bold Text</a:t>
|
||||||
|
</a:r>
|
||||||
|
|
||||||
|
<!-- Italic -->
|
||||||
|
<a:r>
|
||||||
|
<a:rPr i="1"/>
|
||||||
|
<a:t>Italic Text</a:t>
|
||||||
|
</a:r>
|
||||||
|
|
||||||
|
<!-- Underline -->
|
||||||
|
<a:r>
|
||||||
|
<a:rPr u="sng"/>
|
||||||
|
<a:t>Underlined</a:t>
|
||||||
|
</a:r>
|
||||||
|
|
||||||
|
<!-- Highlight -->
|
||||||
|
<a:r>
|
||||||
|
<a:rPr>
|
||||||
|
<a:highlight>
|
||||||
|
<a:srgbClr val="FFFF00"/>
|
||||||
|
</a:highlight>
|
||||||
|
</a:rPr>
|
||||||
|
<a:t>Highlighted Text</a:t>
|
||||||
|
</a:r>
|
||||||
|
|
||||||
|
<!-- Font and Size -->
|
||||||
|
<a:r>
|
||||||
|
<a:rPr sz="2400" typeface="Arial">
|
||||||
|
<a:solidFill>
|
||||||
|
<a:srgbClr val="FF0000"/>
|
||||||
|
</a:solidFill>
|
||||||
|
</a:rPr>
|
||||||
|
<a:t>Colored Arial 24pt</a:t>
|
||||||
|
</a:r>
|
||||||
|
|
||||||
|
<!-- Complete formatting example -->
|
||||||
|
<a:r>
|
||||||
|
<a:rPr lang="en-US" sz="1400" b="1" dirty="0">
|
||||||
|
<a:solidFill>
|
||||||
|
<a:srgbClr val="FAFAFA"/>
|
||||||
|
</a:solidFill>
|
||||||
|
</a:rPr>
|
||||||
|
<a:t>Formatted text</a:t>
|
||||||
|
</a:r>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lists
|
||||||
|
```xml
|
||||||
|
<!-- Bullet list -->
|
||||||
|
<a:p>
|
||||||
|
<a:pPr lvl="0">
|
||||||
|
<a:buChar char="•"/>
|
||||||
|
</a:pPr>
|
||||||
|
<a:r>
|
||||||
|
<a:t>First bullet point</a:t>
|
||||||
|
</a:r>
|
||||||
|
</a:p>
|
||||||
|
|
||||||
|
<!-- Numbered list -->
|
||||||
|
<a:p>
|
||||||
|
<a:pPr lvl="0">
|
||||||
|
<a:buAutoNum type="arabicPeriod"/>
|
||||||
|
</a:pPr>
|
||||||
|
<a:r>
|
||||||
|
<a:t>First numbered item</a:t>
|
||||||
|
</a:r>
|
||||||
|
</a:p>
|
||||||
|
|
||||||
|
<!-- Second level indent -->
|
||||||
|
<a:p>
|
||||||
|
<a:pPr lvl="1">
|
||||||
|
<a:buChar char="•"/>
|
||||||
|
</a:pPr>
|
||||||
|
<a:r>
|
||||||
|
<a:t>Indented bullet</a:t>
|
||||||
|
</a:r>
|
||||||
|
</a:p>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shapes
|
||||||
|
```xml
|
||||||
|
<!-- Rectangle -->
|
||||||
|
<p:sp>
|
||||||
|
<p:nvSpPr>
|
||||||
|
<p:cNvPr id="3" name="Rectangle"/>
|
||||||
|
<p:cNvSpPr/>
|
||||||
|
<p:nvPr/>
|
||||||
|
</p:nvSpPr>
|
||||||
|
<p:spPr>
|
||||||
|
<a:xfrm>
|
||||||
|
<a:off x="1000000" y="1000000"/>
|
||||||
|
<a:ext cx="3000000" cy="2000000"/>
|
||||||
|
</a:xfrm>
|
||||||
|
<a:prstGeom prst="rect">
|
||||||
|
<a:avLst/>
|
||||||
|
</a:prstGeom>
|
||||||
|
<a:solidFill>
|
||||||
|
<a:srgbClr val="FF0000"/>
|
||||||
|
</a:solidFill>
|
||||||
|
<a:ln w="25400">
|
||||||
|
<a:solidFill>
|
||||||
|
<a:srgbClr val="000000"/>
|
||||||
|
</a:solidFill>
|
||||||
|
</a:ln>
|
||||||
|
</p:spPr>
|
||||||
|
</p:sp>
|
||||||
|
|
||||||
|
<!-- Rounded Rectangle -->
|
||||||
|
<p:sp>
|
||||||
|
<p:spPr>
|
||||||
|
<a:prstGeom prst="roundRect">
|
||||||
|
<a:avLst/>
|
||||||
|
</a:prstGeom>
|
||||||
|
</p:spPr>
|
||||||
|
</p:sp>
|
||||||
|
|
||||||
|
<!-- Circle/Ellipse -->
|
||||||
|
<p:sp>
|
||||||
|
<p:spPr>
|
||||||
|
<a:prstGeom prst="ellipse">
|
||||||
|
<a:avLst/>
|
||||||
|
</a:prstGeom>
|
||||||
|
</p:spPr>
|
||||||
|
</p:sp>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Images
|
||||||
|
```xml
|
||||||
|
<p:pic>
|
||||||
|
<p:nvPicPr>
|
||||||
|
<p:cNvPr id="4" name="Picture">
|
||||||
|
<a:hlinkClick r:id="" action="ppaction://media"/>
|
||||||
|
</p:cNvPr>
|
||||||
|
<p:cNvPicPr>
|
||||||
|
<a:picLocks noChangeAspect="1"/>
|
||||||
|
</p:cNvPicPr>
|
||||||
|
<p:nvPr/>
|
||||||
|
</p:nvPicPr>
|
||||||
|
<p:blipFill>
|
||||||
|
<a:blip r:embed="rId2"/>
|
||||||
|
<a:stretch>
|
||||||
|
<a:fillRect/>
|
||||||
|
</a:stretch>
|
||||||
|
</p:blipFill>
|
||||||
|
<p:spPr>
|
||||||
|
<a:xfrm>
|
||||||
|
<a:off x="1000000" y="1000000"/>
|
||||||
|
<a:ext cx="3000000" cy="2000000"/>
|
||||||
|
</a:xfrm>
|
||||||
|
<a:prstGeom prst="rect">
|
||||||
|
<a:avLst/>
|
||||||
|
</a:prstGeom>
|
||||||
|
</p:spPr>
|
||||||
|
</p:pic>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Tables
|
||||||
|
```xml
|
||||||
|
<p:graphicFrame>
|
||||||
|
<p:nvGraphicFramePr>
|
||||||
|
<p:cNvPr id="5" name="Table"/>
|
||||||
|
<p:cNvGraphicFramePr>
|
||||||
|
<a:graphicFrameLocks noGrp="1"/>
|
||||||
|
</p:cNvGraphicFramePr>
|
||||||
|
<p:nvPr/>
|
||||||
|
</p:nvGraphicFramePr>
|
||||||
|
<p:xfrm>
|
||||||
|
<a:off x="1000000" y="1000000"/>
|
||||||
|
<a:ext cx="6000000" cy="2000000"/>
|
||||||
|
</p:xfrm>
|
||||||
|
<a:graphic>
|
||||||
|
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/table">
|
||||||
|
<a:tbl>
|
||||||
|
<a:tblGrid>
|
||||||
|
<a:gridCol w="3000000"/>
|
||||||
|
<a:gridCol w="3000000"/>
|
||||||
|
</a:tblGrid>
|
||||||
|
<a:tr h="500000">
|
||||||
|
<a:tc>
|
||||||
|
<a:txBody>
|
||||||
|
<a:bodyPr/>
|
||||||
|
<a:lstStyle/>
|
||||||
|
<a:p>
|
||||||
|
<a:r>
|
||||||
|
<a:t>Cell 1</a:t>
|
||||||
|
</a:r>
|
||||||
|
</a:p>
|
||||||
|
</a:txBody>
|
||||||
|
</a:tc>
|
||||||
|
<a:tc>
|
||||||
|
<a:txBody>
|
||||||
|
<a:bodyPr/>
|
||||||
|
<a:lstStyle/>
|
||||||
|
<a:p>
|
||||||
|
<a:r>
|
||||||
|
<a:t>Cell 2</a:t>
|
||||||
|
</a:r>
|
||||||
|
</a:p>
|
||||||
|
</a:txBody>
|
||||||
|
</a:tc>
|
||||||
|
</a:tr>
|
||||||
|
</a:tbl>
|
||||||
|
</a:graphicData>
|
||||||
|
</a:graphic>
|
||||||
|
</p:graphicFrame>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Slide Layouts
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- Title Slide Layout -->
|
||||||
|
<p:sp>
|
||||||
|
<p:nvSpPr>
|
||||||
|
<p:nvPr>
|
||||||
|
<p:ph type="ctrTitle"/>
|
||||||
|
</p:nvPr>
|
||||||
|
</p:nvSpPr>
|
||||||
|
<!-- Title content -->
|
||||||
|
</p:sp>
|
||||||
|
|
||||||
|
<p:sp>
|
||||||
|
<p:nvSpPr>
|
||||||
|
<p:nvPr>
|
||||||
|
<p:ph type="subTitle" idx="1"/>
|
||||||
|
</p:nvPr>
|
||||||
|
</p:nvSpPr>
|
||||||
|
<!-- Subtitle content -->
|
||||||
|
</p:sp>
|
||||||
|
|
||||||
|
<!-- Content Slide Layout -->
|
||||||
|
<p:sp>
|
||||||
|
<p:nvSpPr>
|
||||||
|
<p:nvPr>
|
||||||
|
<p:ph type="title"/>
|
||||||
|
</p:nvPr>
|
||||||
|
</p:nvSpPr>
|
||||||
|
<!-- Slide title -->
|
||||||
|
</p:sp>
|
||||||
|
|
||||||
|
<p:sp>
|
||||||
|
<p:nvSpPr>
|
||||||
|
<p:nvPr>
|
||||||
|
<p:ph type="body" idx="1"/>
|
||||||
|
</p:nvPr>
|
||||||
|
</p:nvSpPr>
|
||||||
|
<!-- Content body -->
|
||||||
|
</p:sp>
|
||||||
|
```
|
||||||
|
|
||||||
|
## File Updates
|
||||||
|
|
||||||
|
When adding content, update these files:
|
||||||
|
|
||||||
|
**`ppt/_rels/presentation.xml.rels`:**
|
||||||
|
```xml
|
||||||
|
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide1.xml"/>
|
||||||
|
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
**`ppt/slides/_rels/slide1.xml.rels`:**
|
||||||
|
```xml
|
||||||
|
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>
|
||||||
|
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="../media/image1.png"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
**`[Content_Types].xml`:**
|
||||||
|
```xml
|
||||||
|
<Default Extension="png" ContentType="image/png"/>
|
||||||
|
<Default Extension="jpg" ContentType="image/jpeg"/>
|
||||||
|
<Override PartName="/ppt/slides/slide1.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.slide+xml"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
**`ppt/presentation.xml`:**
|
||||||
|
```xml
|
||||||
|
<p:sldIdLst>
|
||||||
|
<p:sldId id="256" r:id="rId1"/>
|
||||||
|
<p:sldId id="257" r:id="rId2"/>
|
||||||
|
</p:sldIdLst>
|
||||||
|
```
|
||||||
|
|
||||||
|
**`docProps/app.xml`:** Update slide count and statistics
|
||||||
|
```xml
|
||||||
|
<Slides>2</Slides>
|
||||||
|
<Paragraphs>10</Paragraphs>
|
||||||
|
<Words>50</Words>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Slide Operations
|
||||||
|
|
||||||
|
### Adding a New Slide
|
||||||
|
When adding a slide to the end of the presentation:
|
||||||
|
|
||||||
|
1. **Create the slide file** (`ppt/slides/slideN.xml`)
|
||||||
|
2. **Update `[Content_Types].xml`**: Add Override for the new slide
|
||||||
|
3. **Update `ppt/_rels/presentation.xml.rels`**: Add relationship for the new slide
|
||||||
|
4. **Update `ppt/presentation.xml`**: Add slide ID to `<p:sldIdLst>`
|
||||||
|
5. **Create slide relationships** (`ppt/slides/_rels/slideN.xml.rels`) if needed
|
||||||
|
6. **Update `docProps/app.xml`**: Increment slide count and update statistics (if present)
|
||||||
|
|
||||||
|
### Duplicating a Slide
|
||||||
|
1. Copy the source slide XML file with a new name
|
||||||
|
2. Update all IDs in the new slide to be unique
|
||||||
|
3. Follow the "Adding a New Slide" steps above
|
||||||
|
4. **CRITICAL**: Remove or update any notes slide references in `_rels` files
|
||||||
|
5. Remove references to unused media files
|
||||||
|
|
||||||
|
### Reordering Slides
|
||||||
|
1. **Update `ppt/presentation.xml`**: Reorder `<p:sldId>` elements in `<p:sldIdLst>`
|
||||||
|
2. The order of `<p:sldId>` elements determines slide order
|
||||||
|
3. Keep slide IDs and relationship IDs unchanged
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```xml
|
||||||
|
<!-- Original order -->
|
||||||
|
<p:sldIdLst>
|
||||||
|
<p:sldId id="256" r:id="rId2"/>
|
||||||
|
<p:sldId id="257" r:id="rId3"/>
|
||||||
|
<p:sldId id="258" r:id="rId4"/>
|
||||||
|
</p:sldIdLst>
|
||||||
|
|
||||||
|
<!-- After moving slide 3 to position 2 -->
|
||||||
|
<p:sldIdLst>
|
||||||
|
<p:sldId id="256" r:id="rId2"/>
|
||||||
|
<p:sldId id="258" r:id="rId4"/>
|
||||||
|
<p:sldId id="257" r:id="rId3"/>
|
||||||
|
</p:sldIdLst>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deleting a Slide
|
||||||
|
1. **Remove from `ppt/presentation.xml`**: Delete the `<p:sldId>` entry
|
||||||
|
2. **Remove from `ppt/_rels/presentation.xml.rels`**: Delete the relationship
|
||||||
|
3. **Remove from `[Content_Types].xml`**: Delete the Override entry
|
||||||
|
4. **Delete files**: Remove `ppt/slides/slideN.xml` and `ppt/slides/_rels/slideN.xml.rels`
|
||||||
|
5. **Update `docProps/app.xml`**: Decrement slide count and update statistics
|
||||||
|
6. **Clean up unused media**: Remove orphaned images from `ppt/media/`
|
||||||
|
|
||||||
|
Note: Don't renumber remaining slides - keep their original IDs and filenames.
|
||||||
|
|
||||||
|
|
||||||
|
## Common Errors to Avoid
|
||||||
|
|
||||||
|
- **Encodings**: Escape unicode characters in ASCII content: `"` becomes `“`
|
||||||
|
- **Images**: Add to `ppt/media/` and update relationship files
|
||||||
|
- **Lists**: Omit bullets from list headers
|
||||||
|
- **IDs**: Use valid hexadecimal values for UUIDs
|
||||||
|
- **Themes**: Check all themes in `theme` directory for colors
|
||||||
|
|
||||||
|
## Validation Checklist for Template-Based Presentations
|
||||||
|
|
||||||
|
### Before Packing, Always:
|
||||||
|
- **Clean unused resources**: Remove unreferenced media, fonts, and notes directories
|
||||||
|
- **Fix Content_Types.xml**: Declare ALL slides, layouts, and themes present in the package
|
||||||
|
- **Fix relationship IDs**:
|
||||||
|
- Remove font embed references if not using embedded fonts
|
||||||
|
- **Remove broken references**: Check all `_rels` files for references to deleted resources
|
||||||
|
|
||||||
|
### Common Template Duplication Pitfalls:
|
||||||
|
- Multiple slides referencing the same notes slide after duplication
|
||||||
|
- Image/media references from template slides that no longer exist
|
||||||
|
- Font embedding references when fonts aren't included
|
||||||
|
- Missing slideLayout declarations for layouts 12-25
|
||||||
|
- docProps directory may not unpack - this is optional
|
||||||
1499
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd
Normal file
1499
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:complexType name="CT_ShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textlink" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ConnectorNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Connector">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional" default=""/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrameNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGraphicFramePr" type="CT_GraphicFrameNonVisual" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ObjectChoices">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_MarkerCoordinate">
|
||||||
|
<xsd:restriction base="xsd:double">
|
||||||
|
<xsd:minInclusive value="0.0"/>
|
||||||
|
<xsd:maxInclusive value="1.0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Marker">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="x" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="y" type="ST_MarkerCoordinate" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RelSizeAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AbsSizeAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_Anchor">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="relSizeAnchor" type="CT_RelSizeAnchor"/>
|
||||||
|
<xsd:element name="absSizeAnchor" type="CT_AbsSizeAnchor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Drawing">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
1085
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd
Normal file
1085
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:element name="lockedCanvas" type="a:CT_GvmlGroupShape"/>
|
||||||
|
</xsd:schema>
|
||||||
3081
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd
Normal file
3081
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/picture">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:import schemaLocation="shared-relationshipReference.xsd"
|
||||||
|
namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:complexType name="CT_AnchorClientData">
|
||||||
|
<xsd:attribute name="fLocksWithSheet" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPrintsWithSheet" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1" maxOccurs="1"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Shape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvSpPr" type="CT_ShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="txBody" type="a:CT_TextBody" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="textlink" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fLocksText" type="xsd:boolean" use="optional" default="true"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ConnectorNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCxnSpPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Connector">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvCxnSpPr" type="CT_ConnectorNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PictureNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvPicPr" type="a:CT_NonVisualPictureProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Picture">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvPicPr" type="CT_PictureNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="blipFill" type="a:CT_BlipFillProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional" default=""/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicalObjectFrameNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicalObjectFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGraphicFramePr" type="CT_GraphicalObjectFrameNonVisual" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="macro" type="xsd:string" use="optional"/>
|
||||||
|
<xsd:attribute name="fPublished" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShapeNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupShape">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvGrpSpPr" type="CT_GroupShapeNonVisual" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ObjectChoices">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="sp" type="CT_Shape"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_GroupShape"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicalObjectFrame"/>
|
||||||
|
<xsd:element name="cxnSp" type="CT_Connector"/>
|
||||||
|
<xsd:element name="pic" type="CT_Picture"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_Rel"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Rel">
|
||||||
|
<xsd:attribute ref="r:id" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_ColID">
|
||||||
|
<xsd:restriction base="xsd:int">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RowID">
|
||||||
|
<xsd:restriction base="xsd:int">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Marker">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="col" type="ST_ColID"/>
|
||||||
|
<xsd:element name="colOff" type="a:ST_Coordinate"/>
|
||||||
|
<xsd:element name="row" type="ST_RowID"/>
|
||||||
|
<xsd:element name="rowOff" type="a:ST_Coordinate"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_EditAs">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="twoCell"/>
|
||||||
|
<xsd:enumeration value="oneCell"/>
|
||||||
|
<xsd:enumeration value="absolute"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_TwoCellAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="to" type="CT_Marker"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="editAs" type="ST_EditAs" use="optional" default="twoCell"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OneCellAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="from" type="CT_Marker"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AbsoluteAnchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="pos" type="a:CT_Point2D"/>
|
||||||
|
<xsd:element name="ext" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:group ref="EG_ObjectChoices"/>
|
||||||
|
<xsd:element name="clientData" type="CT_AnchorClientData" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_Anchor">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="twoCellAnchor" type="CT_TwoCellAnchor"/>
|
||||||
|
<xsd:element name="oneCellAnchor" type="CT_OneCellAnchor"/>
|
||||||
|
<xsd:element name="absoluteAnchor" type="CT_AbsoluteAnchor"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_Drawing">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_Anchor" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wsDr" type="CT_Drawing"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,287 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
xmlns:dpct="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/main"
|
||||||
|
schemaLocation="dml-main.xsd"/>
|
||||||
|
<xsd:import schemaLocation="wml.xsd"
|
||||||
|
namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/drawingml/2006/picture"
|
||||||
|
schemaLocation="dml-picture.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
schemaLocation="shared-relationshipReference.xsd"/>
|
||||||
|
<xsd:complexType name="CT_EffectExtent">
|
||||||
|
<xsd:attribute name="l" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="t" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="r" type="a:ST_Coordinate" use="required"/>
|
||||||
|
<xsd:attribute name="b" type="a:ST_Coordinate" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_WrapDistance">
|
||||||
|
<xsd:restriction base="xsd:unsignedInt"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Inline">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
<xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_WrapText">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="bothSides"/>
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="largest"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_WrapPath">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="start" type="a:CT_Point2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="lineTo" type="a:CT_Point2D" minOccurs="2" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="edited" type="xsd:boolean" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapNone"/>
|
||||||
|
<xsd:complexType name="CT_WrapSquare">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapTight">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapThrough">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="wrapPolygon" type="CT_WrapPath" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="wrapText" type="ST_WrapText" use="required"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WrapTopBottom">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_WrapType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="wrapNone" type="CT_WrapNone" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapSquare" type="CT_WrapSquare" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapTight" type="CT_WrapTight" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapThrough" type="CT_WrapThrough" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="wrapTopAndBottom" type="CT_WrapTopBottom" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:simpleType name="ST_PositionOffset">
|
||||||
|
<xsd:restriction base="xsd:int"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlignH">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RelFromH">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="column"/>
|
||||||
|
<xsd:enumeration value="character"/>
|
||||||
|
<xsd:enumeration value="leftMargin"/>
|
||||||
|
<xsd:enumeration value="rightMargin"/>
|
||||||
|
<xsd:enumeration value="insideMargin"/>
|
||||||
|
<xsd:enumeration value="outsideMargin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_PosH">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="align" type="ST_AlignH" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="relativeFrom" type="ST_RelFromH" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_AlignV">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_RelFromV">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:enumeration value="margin"/>
|
||||||
|
<xsd:enumeration value="page"/>
|
||||||
|
<xsd:enumeration value="paragraph"/>
|
||||||
|
<xsd:enumeration value="line"/>
|
||||||
|
<xsd:enumeration value="topMargin"/>
|
||||||
|
<xsd:enumeration value="bottomMargin"/>
|
||||||
|
<xsd:enumeration value="insideMargin"/>
|
||||||
|
<xsd:enumeration value="outsideMargin"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_PosV">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="align" type="ST_AlignV" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="posOffset" type="ST_PositionOffset" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="relativeFrom" type="ST_RelFromV" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Anchor">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="simplePos" type="a:CT_Point2D"/>
|
||||||
|
<xsd:element name="positionH" type="CT_PosH"/>
|
||||||
|
<xsd:element name="positionV" type="CT_PosV"/>
|
||||||
|
<xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
|
<xsd:element name="effectExtent" type="CT_EffectExtent" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_WrapType"/>
|
||||||
|
<xsd:element name="docPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGraphicFramePr" type="a:CT_NonVisualGraphicFrameProperties"
|
||||||
|
minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="distT" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distB" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distL" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="distR" type="ST_WrapDistance" use="optional"/>
|
||||||
|
<xsd:attribute name="simplePos" type="xsd:boolean"/>
|
||||||
|
<xsd:attribute name="relativeHeight" type="xsd:unsignedInt" use="required"/>
|
||||||
|
<xsd:attribute name="behindDoc" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="locked" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="layoutInCell" type="xsd:boolean" use="required"/>
|
||||||
|
<xsd:attribute name="hidden" type="xsd:boolean" use="optional"/>
|
||||||
|
<xsd:attribute name="allowOverlap" type="xsd:boolean" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TxbxContent">
|
||||||
|
<xsd:group ref="w:EG_BlockLevelElts" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TextboxInfo">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="txbxContent" type="CT_TxbxContent" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:unsignedShort" use="optional" default="0"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LinkedTextboxInformation">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="id" type="xsd:unsignedShort" use="required"/>
|
||||||
|
<xsd:attribute name="seq" type="xsd:unsignedShort" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingShape">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvSpPr" type="a:CT_NonVisualDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvCnPr" type="a:CT_NonVisualConnectorProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="spPr" type="a:CT_ShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="style" type="a:CT_ShapeStyle" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:element name="txbx" type="CT_TextboxInfo" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="linkedTxbx" type="CT_LinkedTextboxInformation" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="bodyPr" type="a:CT_TextBodyProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="normalEastAsianFlow" type="xsd:boolean" use="optional" default="false"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GraphicFrame">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvFrPr" type="a:CT_NonVisualGraphicFrameProperties" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element ref="a:graphic" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingContentPartNonVisual">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvContentPartPr" type="a:CT_NonVisualContentPartProperties" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingContentPart">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="nvContentPartPr" type="CT_WordprocessingContentPartNonVisual" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="xfrm" type="a:CT_Transform2D" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="bwMode" type="a:ST_BlackWhiteMode" use="optional"/>
|
||||||
|
<xsd:attribute ref="r:id" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingGroup">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="cNvPr" type="a:CT_NonVisualDrawingProps" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="cNvGrpSpPr" type="a:CT_NonVisualGroupDrawingShapeProps" minOccurs="1"
|
||||||
|
maxOccurs="1"/>
|
||||||
|
<xsd:element name="grpSpPr" type="a:CT_GroupShapeProperties" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="wsp"/>
|
||||||
|
<xsd:element name="grpSp" type="CT_WordprocessingGroup"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
<xsd:element ref="dpct:pic"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_WordprocessingContentPart"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_WordprocessingCanvas">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element name="bg" type="a:CT_BackgroundFormatting" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:element name="whole" type="a:CT_WholeE2oFormatting" minOccurs="0" maxOccurs="1"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="wsp"/>
|
||||||
|
<xsd:element ref="dpct:pic"/>
|
||||||
|
<xsd:element name="contentPart" type="CT_WordprocessingContentPart"/>
|
||||||
|
<xsd:element ref="wgp"/>
|
||||||
|
<xsd:element name="graphicFrame" type="CT_GraphicFrame"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="extLst" type="a:CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="wpc" type="CT_WordprocessingCanvas"/>
|
||||||
|
<xsd:element name="wgp" type="CT_WordprocessingGroup"/>
|
||||||
|
<xsd:element name="wsp" type="CT_WordprocessingShape"/>
|
||||||
|
<xsd:element name="inline" type="CT_Inline"/>
|
||||||
|
<xsd:element name="anchor" type="CT_Anchor"/>
|
||||||
|
</xsd:schema>
|
||||||
1676
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd
Normal file
1676
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/characteristics"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/characteristics"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:complexType name="CT_AdditionalCharacteristics">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="characteristic" type="CT_Characteristic" minOccurs="0"
|
||||||
|
maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Characteristic">
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="relation" type="ST_Relation" use="required"/>
|
||||||
|
<xsd:attribute name="val" type="xsd:string" use="required"/>
|
||||||
|
<xsd:attribute name="vocabulary" type="xsd:anyURI" use="optional"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Relation">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="ge"/>
|
||||||
|
<xsd:enumeration value="le"/>
|
||||||
|
<xsd:enumeration value="gt"/>
|
||||||
|
<xsd:enumeration value="lt"/>
|
||||||
|
<xsd:enumeration value="eq"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:element name="additionalCharacteristics" type="CT_AdditionalCharacteristics"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_SourceType">
|
||||||
|
<xsd:restriction base="s:ST_String">
|
||||||
|
<xsd:enumeration value="ArticleInAPeriodical"/>
|
||||||
|
<xsd:enumeration value="Book"/>
|
||||||
|
<xsd:enumeration value="BookSection"/>
|
||||||
|
<xsd:enumeration value="JournalArticle"/>
|
||||||
|
<xsd:enumeration value="ConferenceProceedings"/>
|
||||||
|
<xsd:enumeration value="Report"/>
|
||||||
|
<xsd:enumeration value="SoundRecording"/>
|
||||||
|
<xsd:enumeration value="Performance"/>
|
||||||
|
<xsd:enumeration value="Art"/>
|
||||||
|
<xsd:enumeration value="DocumentFromInternetSite"/>
|
||||||
|
<xsd:enumeration value="InternetSite"/>
|
||||||
|
<xsd:enumeration value="Film"/>
|
||||||
|
<xsd:enumeration value="Interview"/>
|
||||||
|
<xsd:enumeration value="Patent"/>
|
||||||
|
<xsd:enumeration value="ElectronicSource"/>
|
||||||
|
<xsd:enumeration value="Case"/>
|
||||||
|
<xsd:enumeration value="Misc"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_NameListType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Person" type="CT_PersonType" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PersonType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Last" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="First" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="Middle" type="s:ST_String" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NameType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NameOrCorporateType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<xsd:element name="NameList" type="CT_NameListType" minOccurs="1" maxOccurs="1"/>
|
||||||
|
<xsd:element name="Corporate" minOccurs="1" maxOccurs="1" type="s:ST_String"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AuthorType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="Artist" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Author" type="CT_NameOrCorporateType"/>
|
||||||
|
<xsd:element name="BookAuthor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Compiler" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Composer" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Conductor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Counsel" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Director" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Editor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Interviewee" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Interviewer" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Inventor" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Performer" type="CT_NameOrCorporateType"/>
|
||||||
|
<xsd:element name="ProducerName" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Translator" type="CT_NameType"/>
|
||||||
|
<xsd:element name="Writer" type="CT_NameType"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SourceType">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:element name="AbbreviatedCaseNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="AlbumTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Author" type="CT_AuthorType"/>
|
||||||
|
<xsd:element name="BookTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Broadcaster" type="s:ST_String"/>
|
||||||
|
<xsd:element name="BroadcastTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="CaseNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ChapterNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="City" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Comments" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ConferenceName" type="s:ST_String"/>
|
||||||
|
<xsd:element name="CountryRegion" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Court" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Day" type="s:ST_String"/>
|
||||||
|
<xsd:element name="DayAccessed" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Department" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Distributor" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Edition" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Guid" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Institution" type="s:ST_String"/>
|
||||||
|
<xsd:element name="InternetSiteTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Issue" type="s:ST_String"/>
|
||||||
|
<xsd:element name="JournalName" type="s:ST_String"/>
|
||||||
|
<xsd:element name="LCID" type="s:ST_Lang"/>
|
||||||
|
<xsd:element name="Medium" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Month" type="s:ST_String"/>
|
||||||
|
<xsd:element name="MonthAccessed" type="s:ST_String"/>
|
||||||
|
<xsd:element name="NumberVolumes" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Pages" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PatentNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PeriodicalTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ProductionCompany" type="s:ST_String"/>
|
||||||
|
<xsd:element name="PublicationTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Publisher" type="s:ST_String"/>
|
||||||
|
<xsd:element name="RecordingNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="RefOrder" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Reporter" type="s:ST_String"/>
|
||||||
|
<xsd:element name="SourceType" type="ST_SourceType"/>
|
||||||
|
<xsd:element name="ShortTitle" type="s:ST_String"/>
|
||||||
|
<xsd:element name="StandardNumber" type="s:ST_String"/>
|
||||||
|
<xsd:element name="StateProvince" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Station" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Tag" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Theater" type="s:ST_String"/>
|
||||||
|
<xsd:element name="ThesisType" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Title" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Type" type="s:ST_String"/>
|
||||||
|
<xsd:element name="URL" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Version" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Volume" type="s:ST_String"/>
|
||||||
|
<xsd:element name="Year" type="s:ST_String"/>
|
||||||
|
<xsd:element name="YearAccessed" type="s:ST_String"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="Sources" type="CT_Sources"/>
|
||||||
|
<xsd:complexType name="CT_Sources">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="Source" type="CT_SourceType" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="SelectedStyle" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="StyleName" type="s:ST_String"/>
|
||||||
|
<xsd:attribute name="URI" type="s:ST_String"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
elementFormDefault="qualified">
|
||||||
|
<xsd:simpleType name="ST_Lang">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_HexColorRGB">
|
||||||
|
<xsd:restriction base="xsd:hexBinary">
|
||||||
|
<xsd:length value="3" fixed="true"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Panose">
|
||||||
|
<xsd:restriction base="xsd:hexBinary">
|
||||||
|
<xsd:length value="10"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CalendarType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="gregorian"/>
|
||||||
|
<xsd:enumeration value="gregorianUs"/>
|
||||||
|
<xsd:enumeration value="gregorianMeFrench"/>
|
||||||
|
<xsd:enumeration value="gregorianArabic"/>
|
||||||
|
<xsd:enumeration value="hijri"/>
|
||||||
|
<xsd:enumeration value="hebrew"/>
|
||||||
|
<xsd:enumeration value="taiwan"/>
|
||||||
|
<xsd:enumeration value="japan"/>
|
||||||
|
<xsd:enumeration value="thai"/>
|
||||||
|
<xsd:enumeration value="korea"/>
|
||||||
|
<xsd:enumeration value="saka"/>
|
||||||
|
<xsd:enumeration value="gregorianXlitEnglish"/>
|
||||||
|
<xsd:enumeration value="gregorianXlitFrench"/>
|
||||||
|
<xsd:enumeration value="none"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlgClass">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="hash"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_CryptProv">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="rsaAES"/>
|
||||||
|
<xsd:enumeration value="rsaFull"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_AlgType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="typeAny"/>
|
||||||
|
<xsd:enumeration value="custom"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ColorType">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Guid">
|
||||||
|
<xsd:restriction base="xsd:token">
|
||||||
|
<xsd:pattern value="\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OnOff">
|
||||||
|
<xsd:union memberTypes="xsd:boolean ST_OnOff1"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_OnOff1">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="on"/>
|
||||||
|
<xsd:enumeration value="off"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_String">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_XmlName">
|
||||||
|
<xsd:restriction base="xsd:NCName">
|
||||||
|
<xsd:minLength value="1"/>
|
||||||
|
<xsd:maxLength value="255"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TrueFalse">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TrueFalseBlank">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="t"/>
|
||||||
|
<xsd:enumeration value="f"/>
|
||||||
|
<xsd:enumeration value="true"/>
|
||||||
|
<xsd:enumeration value="false"/>
|
||||||
|
<xsd:enumeration value=""/>
|
||||||
|
<xsd:enumeration value="True"/>
|
||||||
|
<xsd:enumeration value="False"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_UnsignedDecimalNumber">
|
||||||
|
<xsd:restriction base="xsd:decimal">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_TwipsMeasure">
|
||||||
|
<xsd:union memberTypes="ST_UnsignedDecimalNumber ST_PositiveUniversalMeasure"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_VerticalAlignRun">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="baseline"/>
|
||||||
|
<xsd:enumeration value="superscript"/>
|
||||||
|
<xsd:enumeration value="subscript"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Xstring">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_XAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_YAlign">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="inline"/>
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="bottom"/>
|
||||||
|
<xsd:enumeration value="inside"/>
|
||||||
|
<xsd:enumeration value="outside"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ConformanceClass">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="strict"/>
|
||||||
|
<xsd:enumeration value="transitional"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_UniversalMeasure">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="-?[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositiveUniversalMeasure">
|
||||||
|
<xsd:restriction base="ST_UniversalMeasure">
|
||||||
|
<xsd:pattern value="[0-9]+(\.[0-9]+)?(mm|cm|in|pt|pc|pi)"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Percentage">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="-?[0-9]+(\.[0-9]+)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_FixedPercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="-?((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositivePercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="[0-9]+(\.[0-9]+)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_PositiveFixedPercentage">
|
||||||
|
<xsd:restriction base="ST_Percentage">
|
||||||
|
<xsd:pattern value="((100)|([0-9][0-9]?))(\.[0-9][0-9]?)?%"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/customXml"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/customXml"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:complexType name="CT_DatastoreSchemaRef">
|
||||||
|
<xsd:attribute name="uri" type="xsd:string" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DatastoreSchemaRefs">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="schemaRef" type="CT_DatastoreSchemaRef" minOccurs="0" maxOccurs="unbounded"
|
||||||
|
/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DatastoreItem">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="schemaRefs" type="CT_DatastoreSchemaRefs" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="itemID" type="s:ST_Guid" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="datastoreItem" type="CT_DatastoreItem"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/schemaLibrary/2006/main"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/schemaLibrary/2006/main"
|
||||||
|
attributeFormDefault="qualified" elementFormDefault="qualified">
|
||||||
|
<xsd:complexType name="CT_Schema">
|
||||||
|
<xsd:attribute name="uri" type="xsd:string" default=""/>
|
||||||
|
<xsd:attribute name="manifestLocation" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="schemaLocation" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="schemaLanguage" type="xsd:token"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SchemaLibrary">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="schema" type="CT_Schema" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="schemaLibrary" type="CT_SchemaLibrary"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
|
||||||
|
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
|
||||||
|
blockDefault="#all" elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
schemaLocation="shared-documentPropertiesVariantTypes.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:element name="Properties" type="CT_Properties"/>
|
||||||
|
<xsd:complexType name="CT_Properties">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="property" minOccurs="0" maxOccurs="unbounded" type="CT_Property"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Property">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:vector"/>
|
||||||
|
<xsd:element ref="vt:array"/>
|
||||||
|
<xsd:element ref="vt:blob"/>
|
||||||
|
<xsd:element ref="vt:oblob"/>
|
||||||
|
<xsd:element ref="vt:empty"/>
|
||||||
|
<xsd:element ref="vt:null"/>
|
||||||
|
<xsd:element ref="vt:i1"/>
|
||||||
|
<xsd:element ref="vt:i2"/>
|
||||||
|
<xsd:element ref="vt:i4"/>
|
||||||
|
<xsd:element ref="vt:i8"/>
|
||||||
|
<xsd:element ref="vt:int"/>
|
||||||
|
<xsd:element ref="vt:ui1"/>
|
||||||
|
<xsd:element ref="vt:ui2"/>
|
||||||
|
<xsd:element ref="vt:ui4"/>
|
||||||
|
<xsd:element ref="vt:ui8"/>
|
||||||
|
<xsd:element ref="vt:uint"/>
|
||||||
|
<xsd:element ref="vt:r4"/>
|
||||||
|
<xsd:element ref="vt:r8"/>
|
||||||
|
<xsd:element ref="vt:decimal"/>
|
||||||
|
<xsd:element ref="vt:lpstr"/>
|
||||||
|
<xsd:element ref="vt:lpwstr"/>
|
||||||
|
<xsd:element ref="vt:bstr"/>
|
||||||
|
<xsd:element ref="vt:date"/>
|
||||||
|
<xsd:element ref="vt:filetime"/>
|
||||||
|
<xsd:element ref="vt:bool"/>
|
||||||
|
<xsd:element ref="vt:cy"/>
|
||||||
|
<xsd:element ref="vt:error"/>
|
||||||
|
<xsd:element ref="vt:stream"/>
|
||||||
|
<xsd:element ref="vt:ostream"/>
|
||||||
|
<xsd:element ref="vt:storage"/>
|
||||||
|
<xsd:element ref="vt:ostorage"/>
|
||||||
|
<xsd:element ref="vt:vstream"/>
|
||||||
|
<xsd:element ref="vt:clsid"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="fmtid" use="required" type="s:ST_Guid"/>
|
||||||
|
<xsd:attribute name="pid" use="required" type="xsd:int"/>
|
||||||
|
<xsd:attribute name="name" use="optional" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="linkTarget" use="optional" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||||
|
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||||
|
elementFormDefault="qualified" blockDefault="#all">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
schemaLocation="shared-documentPropertiesVariantTypes.xsd"/>
|
||||||
|
<xsd:element name="Properties" type="CT_Properties"/>
|
||||||
|
<xsd:complexType name="CT_Properties">
|
||||||
|
<xsd:all>
|
||||||
|
<xsd:element name="Template" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Manager" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Company" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Pages" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Words" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Characters" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="PresentationFormat" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="Lines" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Paragraphs" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Slides" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="Notes" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="TotalTime" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="HiddenSlides" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="MMClips" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="ScaleCrop" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="HeadingPairs" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/>
|
||||||
|
<xsd:element name="TitlesOfParts" minOccurs="0" maxOccurs="1" type="CT_VectorLpstr"/>
|
||||||
|
<xsd:element name="LinksUpToDate" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="CharactersWithSpaces" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
<xsd:element name="SharedDoc" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="HyperlinkBase" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="HLinks" minOccurs="0" maxOccurs="1" type="CT_VectorVariant"/>
|
||||||
|
<xsd:element name="HyperlinksChanged" minOccurs="0" maxOccurs="1" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="DigSig" minOccurs="0" maxOccurs="1" type="CT_DigSigBlob"/>
|
||||||
|
<xsd:element name="Application" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="AppVersion" minOccurs="0" maxOccurs="1" type="xsd:string"/>
|
||||||
|
<xsd:element name="DocSecurity" minOccurs="0" maxOccurs="1" type="xsd:int"/>
|
||||||
|
</xsd:all>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_VectorVariant">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:vector"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_VectorLpstr">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:vector"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DigSigBlob">
|
||||||
|
<xsd:sequence minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="vt:blob"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"
|
||||||
|
blockDefault="#all" elementFormDefault="qualified">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_VectorBaseType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="variant"/>
|
||||||
|
<xsd:enumeration value="i1"/>
|
||||||
|
<xsd:enumeration value="i2"/>
|
||||||
|
<xsd:enumeration value="i4"/>
|
||||||
|
<xsd:enumeration value="i8"/>
|
||||||
|
<xsd:enumeration value="ui1"/>
|
||||||
|
<xsd:enumeration value="ui2"/>
|
||||||
|
<xsd:enumeration value="ui4"/>
|
||||||
|
<xsd:enumeration value="ui8"/>
|
||||||
|
<xsd:enumeration value="r4"/>
|
||||||
|
<xsd:enumeration value="r8"/>
|
||||||
|
<xsd:enumeration value="lpstr"/>
|
||||||
|
<xsd:enumeration value="lpwstr"/>
|
||||||
|
<xsd:enumeration value="bstr"/>
|
||||||
|
<xsd:enumeration value="date"/>
|
||||||
|
<xsd:enumeration value="filetime"/>
|
||||||
|
<xsd:enumeration value="bool"/>
|
||||||
|
<xsd:enumeration value="cy"/>
|
||||||
|
<xsd:enumeration value="error"/>
|
||||||
|
<xsd:enumeration value="clsid"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_ArrayBaseType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="variant"/>
|
||||||
|
<xsd:enumeration value="i1"/>
|
||||||
|
<xsd:enumeration value="i2"/>
|
||||||
|
<xsd:enumeration value="i4"/>
|
||||||
|
<xsd:enumeration value="int"/>
|
||||||
|
<xsd:enumeration value="ui1"/>
|
||||||
|
<xsd:enumeration value="ui2"/>
|
||||||
|
<xsd:enumeration value="ui4"/>
|
||||||
|
<xsd:enumeration value="uint"/>
|
||||||
|
<xsd:enumeration value="r4"/>
|
||||||
|
<xsd:enumeration value="r8"/>
|
||||||
|
<xsd:enumeration value="decimal"/>
|
||||||
|
<xsd:enumeration value="bstr"/>
|
||||||
|
<xsd:enumeration value="date"/>
|
||||||
|
<xsd:enumeration value="bool"/>
|
||||||
|
<xsd:enumeration value="cy"/>
|
||||||
|
<xsd:enumeration value="error"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Cy">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="\s*[0-9]*\.[0-9]{4}\s*"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:simpleType name="ST_Error">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:pattern value="\s*0x[0-9A-Za-z]{8}\s*"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Empty"/>
|
||||||
|
<xsd:complexType name="CT_Null"/>
|
||||||
|
<xsd:complexType name="CT_Vector">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="variant"/>
|
||||||
|
<xsd:element ref="i1"/>
|
||||||
|
<xsd:element ref="i2"/>
|
||||||
|
<xsd:element ref="i4"/>
|
||||||
|
<xsd:element ref="i8"/>
|
||||||
|
<xsd:element ref="ui1"/>
|
||||||
|
<xsd:element ref="ui2"/>
|
||||||
|
<xsd:element ref="ui4"/>
|
||||||
|
<xsd:element ref="ui8"/>
|
||||||
|
<xsd:element ref="r4"/>
|
||||||
|
<xsd:element ref="r8"/>
|
||||||
|
<xsd:element ref="lpstr"/>
|
||||||
|
<xsd:element ref="lpwstr"/>
|
||||||
|
<xsd:element ref="bstr"/>
|
||||||
|
<xsd:element ref="date"/>
|
||||||
|
<xsd:element ref="filetime"/>
|
||||||
|
<xsd:element ref="bool"/>
|
||||||
|
<xsd:element ref="cy"/>
|
||||||
|
<xsd:element ref="error"/>
|
||||||
|
<xsd:element ref="clsid"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="baseType" type="ST_VectorBaseType" use="required"/>
|
||||||
|
<xsd:attribute name="size" type="xsd:unsignedInt" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Array">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="unbounded">
|
||||||
|
<xsd:element ref="variant"/>
|
||||||
|
<xsd:element ref="i1"/>
|
||||||
|
<xsd:element ref="i2"/>
|
||||||
|
<xsd:element ref="i4"/>
|
||||||
|
<xsd:element ref="int"/>
|
||||||
|
<xsd:element ref="ui1"/>
|
||||||
|
<xsd:element ref="ui2"/>
|
||||||
|
<xsd:element ref="ui4"/>
|
||||||
|
<xsd:element ref="uint"/>
|
||||||
|
<xsd:element ref="r4"/>
|
||||||
|
<xsd:element ref="r8"/>
|
||||||
|
<xsd:element ref="decimal"/>
|
||||||
|
<xsd:element ref="bstr"/>
|
||||||
|
<xsd:element ref="date"/>
|
||||||
|
<xsd:element ref="bool"/>
|
||||||
|
<xsd:element ref="error"/>
|
||||||
|
<xsd:element ref="cy"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:attribute name="lBounds" type="xsd:int" use="required"/>
|
||||||
|
<xsd:attribute name="uBounds" type="xsd:int" use="required"/>
|
||||||
|
<xsd:attribute name="baseType" type="ST_ArrayBaseType" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Variant">
|
||||||
|
<xsd:choice minOccurs="1" maxOccurs="1">
|
||||||
|
<xsd:element ref="variant"/>
|
||||||
|
<xsd:element ref="vector"/>
|
||||||
|
<xsd:element ref="array"/>
|
||||||
|
<xsd:element ref="blob"/>
|
||||||
|
<xsd:element ref="oblob"/>
|
||||||
|
<xsd:element ref="empty"/>
|
||||||
|
<xsd:element ref="null"/>
|
||||||
|
<xsd:element ref="i1"/>
|
||||||
|
<xsd:element ref="i2"/>
|
||||||
|
<xsd:element ref="i4"/>
|
||||||
|
<xsd:element ref="i8"/>
|
||||||
|
<xsd:element ref="int"/>
|
||||||
|
<xsd:element ref="ui1"/>
|
||||||
|
<xsd:element ref="ui2"/>
|
||||||
|
<xsd:element ref="ui4"/>
|
||||||
|
<xsd:element ref="ui8"/>
|
||||||
|
<xsd:element ref="uint"/>
|
||||||
|
<xsd:element ref="r4"/>
|
||||||
|
<xsd:element ref="r8"/>
|
||||||
|
<xsd:element ref="decimal"/>
|
||||||
|
<xsd:element ref="lpstr"/>
|
||||||
|
<xsd:element ref="lpwstr"/>
|
||||||
|
<xsd:element ref="bstr"/>
|
||||||
|
<xsd:element ref="date"/>
|
||||||
|
<xsd:element ref="filetime"/>
|
||||||
|
<xsd:element ref="bool"/>
|
||||||
|
<xsd:element ref="cy"/>
|
||||||
|
<xsd:element ref="error"/>
|
||||||
|
<xsd:element ref="stream"/>
|
||||||
|
<xsd:element ref="ostream"/>
|
||||||
|
<xsd:element ref="storage"/>
|
||||||
|
<xsd:element ref="ostorage"/>
|
||||||
|
<xsd:element ref="vstream"/>
|
||||||
|
<xsd:element ref="clsid"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Vstream">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="xsd:base64Binary">
|
||||||
|
<xsd:attribute name="version" type="s:ST_Guid"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="variant" type="CT_Variant"/>
|
||||||
|
<xsd:element name="vector" type="CT_Vector"/>
|
||||||
|
<xsd:element name="array" type="CT_Array"/>
|
||||||
|
<xsd:element name="blob" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="oblob" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="empty" type="CT_Empty"/>
|
||||||
|
<xsd:element name="null" type="CT_Null"/>
|
||||||
|
<xsd:element name="i1" type="xsd:byte"/>
|
||||||
|
<xsd:element name="i2" type="xsd:short"/>
|
||||||
|
<xsd:element name="i4" type="xsd:int"/>
|
||||||
|
<xsd:element name="i8" type="xsd:long"/>
|
||||||
|
<xsd:element name="int" type="xsd:int"/>
|
||||||
|
<xsd:element name="ui1" type="xsd:unsignedByte"/>
|
||||||
|
<xsd:element name="ui2" type="xsd:unsignedShort"/>
|
||||||
|
<xsd:element name="ui4" type="xsd:unsignedInt"/>
|
||||||
|
<xsd:element name="ui8" type="xsd:unsignedLong"/>
|
||||||
|
<xsd:element name="uint" type="xsd:unsignedInt"/>
|
||||||
|
<xsd:element name="r4" type="xsd:float"/>
|
||||||
|
<xsd:element name="r8" type="xsd:double"/>
|
||||||
|
<xsd:element name="decimal" type="xsd:decimal"/>
|
||||||
|
<xsd:element name="lpstr" type="xsd:string"/>
|
||||||
|
<xsd:element name="lpwstr" type="xsd:string"/>
|
||||||
|
<xsd:element name="bstr" type="xsd:string"/>
|
||||||
|
<xsd:element name="date" type="xsd:dateTime"/>
|
||||||
|
<xsd:element name="filetime" type="xsd:dateTime"/>
|
||||||
|
<xsd:element name="bool" type="xsd:boolean"/>
|
||||||
|
<xsd:element name="cy" type="ST_Cy"/>
|
||||||
|
<xsd:element name="error" type="ST_Error"/>
|
||||||
|
<xsd:element name="stream" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="ostream" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="storage" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="ostorage" type="xsd:base64Binary"/>
|
||||||
|
<xsd:element name="vstream" type="CT_Vstream"/>
|
||||||
|
<xsd:element name="clsid" type="s:ST_Guid"/>
|
||||||
|
</xsd:schema>
|
||||||
582
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd
Normal file
582
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
||||||
|
xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
|
||||||
|
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
xmlns:s="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
elementFormDefault="qualified" attributeFormDefault="qualified" blockDefault="#all"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/math">
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
||||||
|
schemaLocation="wml.xsd"/>
|
||||||
|
<xsd:import namespace="http://schemas.openxmlformats.org/officeDocument/2006/sharedTypes"
|
||||||
|
schemaLocation="shared-commonSimpleTypes.xsd"/>
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
|
||||||
|
<xsd:simpleType name="ST_Integer255">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:minInclusive value="1"/>
|
||||||
|
<xsd:maxInclusive value="255"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Integer255">
|
||||||
|
<xsd:attribute name="val" type="ST_Integer255" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Integer2">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:minInclusive value="-2"/>
|
||||||
|
<xsd:maxInclusive value="2"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Integer2">
|
||||||
|
<xsd:attribute name="val" type="ST_Integer2" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_SpacingRule">
|
||||||
|
<xsd:restriction base="xsd:integer">
|
||||||
|
<xsd:minInclusive value="0"/>
|
||||||
|
<xsd:maxInclusive value="4"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_SpacingRule">
|
||||||
|
<xsd:attribute name="val" type="ST_SpacingRule" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_UnSignedInteger">
|
||||||
|
<xsd:restriction base="xsd:unsignedInt"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_UnSignedInteger">
|
||||||
|
<xsd:attribute name="val" type="ST_UnSignedInteger" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Char">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:maxLength value="1"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Char">
|
||||||
|
<xsd:attribute name="val" type="ST_Char" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OnOff">
|
||||||
|
<xsd:attribute name="val" type="s:ST_OnOff"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_String">
|
||||||
|
<xsd:attribute name="val" type="s:ST_String"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_XAlign">
|
||||||
|
<xsd:attribute name="val" type="s:ST_XAlign" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_YAlign">
|
||||||
|
<xsd:attribute name="val" type="s:ST_YAlign" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Shp">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="centered"/>
|
||||||
|
<xsd:enumeration value="match"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Shp">
|
||||||
|
<xsd:attribute name="val" type="ST_Shp" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_FType">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="bar"/>
|
||||||
|
<xsd:enumeration value="skw"/>
|
||||||
|
<xsd:enumeration value="lin"/>
|
||||||
|
<xsd:enumeration value="noBar"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_FType">
|
||||||
|
<xsd:attribute name="val" type="ST_FType" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_LimLoc">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="undOvr"/>
|
||||||
|
<xsd:enumeration value="subSup"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_LimLoc">
|
||||||
|
<xsd:attribute name="val" type="ST_LimLoc" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_TopBot">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="top"/>
|
||||||
|
<xsd:enumeration value="bot"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_TopBot">
|
||||||
|
<xsd:attribute name="val" type="ST_TopBot" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Script">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="roman"/>
|
||||||
|
<xsd:enumeration value="script"/>
|
||||||
|
<xsd:enumeration value="fraktur"/>
|
||||||
|
<xsd:enumeration value="double-struck"/>
|
||||||
|
<xsd:enumeration value="sans-serif"/>
|
||||||
|
<xsd:enumeration value="monospace"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Script">
|
||||||
|
<xsd:attribute name="val" type="ST_Script"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Style">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="p"/>
|
||||||
|
<xsd:enumeration value="b"/>
|
||||||
|
<xsd:enumeration value="i"/>
|
||||||
|
<xsd:enumeration value="bi"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_Style">
|
||||||
|
<xsd:attribute name="val" type="ST_Style"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_ManualBreak">
|
||||||
|
<xsd:attribute name="alnAt" type="ST_Integer255"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_ScriptStyle">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="scr" minOccurs="0" type="CT_Script"/>
|
||||||
|
<xsd:element name="sty" minOccurs="0" type="CT_Style"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_RPR">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="lit" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="nor" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_ScriptStyle"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="brk" minOccurs="0" type="CT_ManualBreak"/>
|
||||||
|
<xsd:element name="aln" minOccurs="0" type="CT_OnOff"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Text">
|
||||||
|
<xsd:simpleContent>
|
||||||
|
<xsd:extension base="s:ST_String">
|
||||||
|
<xsd:attribute ref="xml:space" use="optional"/>
|
||||||
|
</xsd:extension>
|
||||||
|
</xsd:simpleContent>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_R">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="rPr" type="CT_RPR" minOccurs="0"/>
|
||||||
|
<xsd:group ref="w:EG_RPr" minOccurs="0"/>
|
||||||
|
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||||
|
<xsd:group ref="w:EG_RunInnerContent"/>
|
||||||
|
<xsd:element name="t" type="CT_Text" minOccurs="0"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_CtrlPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="w:EG_RPrMath" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_AccPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Acc">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="accPr" type="CT_AccPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BarPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="pos" type="CT_TopBot" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Bar">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="barPr" type="CT_BarPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BoxPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="opEmu" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="noBreak" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="diff" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="brk" type="CT_ManualBreak" minOccurs="0"/>
|
||||||
|
<xsd:element name="aln" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Box">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="boxPr" type="CT_BoxPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BorderBoxPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="hideTop" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="hideBot" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="hideLeft" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="hideRight" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeH" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeV" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeBLTR" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="strikeTLBR" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_BorderBox">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="borderBoxPr" type="CT_BorderBoxPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_DPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="begChr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="sepChr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="endChr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="grow" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="shp" type="CT_Shp" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_D">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="dPr" type="CT_DPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_EqArrPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/>
|
||||||
|
<xsd:element name="maxDist" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="objDist" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_EqArr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="eqArrPr" type="CT_EqArrPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_FPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="type" type="CT_FType" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_F">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="fPr" type="CT_FPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="num" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="den" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_FuncPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Func">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="funcPr" type="CT_FuncPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="fName" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupChrPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="pos" type="CT_TopBot" minOccurs="0"/>
|
||||||
|
<xsd:element name="vertJc" type="CT_TopBot" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_GroupChr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="groupChrPr" type="CT_GroupChrPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimLowPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimLow">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="limLowPr" type="CT_LimLowPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="lim" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimUppPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_LimUpp">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="limUppPr" type="CT_LimUppPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="lim" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MCPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="count" type="CT_Integer255" minOccurs="0"/>
|
||||||
|
<xsd:element name="mcJc" type="CT_XAlign" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MC">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mcPr" type="CT_MCPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MCS">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mc" type="CT_MC" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="baseJc" type="CT_YAlign" minOccurs="0"/>
|
||||||
|
<xsd:element name="plcHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||||
|
<xsd:element name="cGpRule" type="CT_SpacingRule" minOccurs="0"/>
|
||||||
|
<xsd:element name="rSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="cSp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="cGp" type="CT_UnSignedInteger" minOccurs="0"/>
|
||||||
|
<xsd:element name="mcs" type="CT_MCS" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MR">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_M">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mPr" type="CT_MPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="mr" type="CT_MR" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_NaryPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="chr" type="CT_Char" minOccurs="0"/>
|
||||||
|
<xsd:element name="limLoc" type="CT_LimLoc" minOccurs="0"/>
|
||||||
|
<xsd:element name="grow" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="subHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="supHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Nary">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="naryPr" type="CT_NaryPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_PhantPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="show" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="zeroWid" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="zeroAsc" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="zeroDesc" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="transp" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Phant">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="phantPr" type="CT_PhantPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_RadPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="degHide" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_Rad">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="radPr" type="CT_RadPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="deg" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SPrePr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SPre">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sPrePr" type="CT_SPrePr" minOccurs="0"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSubPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSub">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sSubPr" type="CT_SSubPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSubSupPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="alnScr" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSubSup">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sSubSupPr" type="CT_SSubSupPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sub" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSupPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_SSup">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="sSupPr" type="CT_SSupPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="e" type="CT_OMathArg"/>
|
||||||
|
<xsd:element name="sup" type="CT_OMathArg"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:group name="EG_OMathMathElements">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:element name="acc" type="CT_Acc"/>
|
||||||
|
<xsd:element name="bar" type="CT_Bar"/>
|
||||||
|
<xsd:element name="box" type="CT_Box"/>
|
||||||
|
<xsd:element name="borderBox" type="CT_BorderBox"/>
|
||||||
|
<xsd:element name="d" type="CT_D"/>
|
||||||
|
<xsd:element name="eqArr" type="CT_EqArr"/>
|
||||||
|
<xsd:element name="f" type="CT_F"/>
|
||||||
|
<xsd:element name="func" type="CT_Func"/>
|
||||||
|
<xsd:element name="groupChr" type="CT_GroupChr"/>
|
||||||
|
<xsd:element name="limLow" type="CT_LimLow"/>
|
||||||
|
<xsd:element name="limUpp" type="CT_LimUpp"/>
|
||||||
|
<xsd:element name="m" type="CT_M"/>
|
||||||
|
<xsd:element name="nary" type="CT_Nary"/>
|
||||||
|
<xsd:element name="phant" type="CT_Phant"/>
|
||||||
|
<xsd:element name="rad" type="CT_Rad"/>
|
||||||
|
<xsd:element name="sPre" type="CT_SPre"/>
|
||||||
|
<xsd:element name="sSub" type="CT_SSub"/>
|
||||||
|
<xsd:element name="sSubSup" type="CT_SSubSup"/>
|
||||||
|
<xsd:element name="sSup" type="CT_SSup"/>
|
||||||
|
<xsd:element name="r" type="CT_R"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:group name="EG_OMathElements">
|
||||||
|
<xsd:choice>
|
||||||
|
<xsd:group ref="EG_OMathMathElements"/>
|
||||||
|
<xsd:group ref="w:EG_PContentMath"/>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:group>
|
||||||
|
<xsd:complexType name="CT_OMathArgPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="argSz" type="CT_Integer2" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OMathArg">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="argPr" type="CT_OMathArgPr" minOccurs="0"/>
|
||||||
|
<xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<xsd:element name="ctrlPr" type="CT_CtrlPr" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_Jc">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="left"/>
|
||||||
|
<xsd:enumeration value="right"/>
|
||||||
|
<xsd:enumeration value="center"/>
|
||||||
|
<xsd:enumeration value="centerGroup"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_OMathJc">
|
||||||
|
<xsd:attribute name="val" type="ST_Jc"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OMathParaPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="jc" type="CT_OMathJc" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_TwipsMeasure">
|
||||||
|
<xsd:attribute name="val" type="s:ST_TwipsMeasure" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_BreakBin">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="before"/>
|
||||||
|
<xsd:enumeration value="after"/>
|
||||||
|
<xsd:enumeration value="repeat"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_BreakBin">
|
||||||
|
<xsd:attribute name="val" type="ST_BreakBin"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:simpleType name="ST_BreakBinSub">
|
||||||
|
<xsd:restriction base="xsd:string">
|
||||||
|
<xsd:enumeration value="--"/>
|
||||||
|
<xsd:enumeration value="-+"/>
|
||||||
|
<xsd:enumeration value="+-"/>
|
||||||
|
</xsd:restriction>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:complexType name="CT_BreakBinSub">
|
||||||
|
<xsd:attribute name="val" type="ST_BreakBinSub"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_MathPr">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="mathFont" type="CT_String" minOccurs="0"/>
|
||||||
|
<xsd:element name="brkBin" type="CT_BreakBin" minOccurs="0"/>
|
||||||
|
<xsd:element name="brkBinSub" type="CT_BreakBinSub" minOccurs="0"/>
|
||||||
|
<xsd:element name="smallFrac" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="dispDef" type="CT_OnOff" minOccurs="0"/>
|
||||||
|
<xsd:element name="lMargin" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="rMargin" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="defJc" type="CT_OMathJc" minOccurs="0"/>
|
||||||
|
<xsd:element name="preSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="postSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="interSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:element name="intraSp" type="CT_TwipsMeasure" minOccurs="0"/>
|
||||||
|
<xsd:choice minOccurs="0">
|
||||||
|
<xsd:element name="wrapIndent" type="CT_TwipsMeasure"/>
|
||||||
|
<xsd:element name="wrapRight" type="CT_OnOff"/>
|
||||||
|
</xsd:choice>
|
||||||
|
<xsd:element name="intLim" type="CT_LimLoc" minOccurs="0"/>
|
||||||
|
<xsd:element name="naryLim" type="CT_LimLoc" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="mathPr" type="CT_MathPr"/>
|
||||||
|
<xsd:complexType name="CT_OMathPara">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="oMathParaPr" type="CT_OMathParaPr" minOccurs="0"/>
|
||||||
|
<xsd:element name="oMath" type="CT_OMath" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="CT_OMath">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:group ref="EG_OMathElements" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:element name="oMathPara" type="CT_OMathPara"/>
|
||||||
|
<xsd:element name="oMath" type="CT_OMath"/>
|
||||||
|
</xsd:schema>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
elementFormDefault="qualified"
|
||||||
|
targetNamespace="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
||||||
|
blockDefault="#all">
|
||||||
|
<xsd:simpleType name="ST_RelationshipId">
|
||||||
|
<xsd:restriction base="xsd:string"/>
|
||||||
|
</xsd:simpleType>
|
||||||
|
<xsd:attribute name="id" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="embed" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="link" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="dm" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="lo" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="qs" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="cs" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="blip" type="ST_RelationshipId" default=""/>
|
||||||
|
<xsd:attribute name="pict" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="href" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="topLeft" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="topRight" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="bottomLeft" type="ST_RelationshipId"/>
|
||||||
|
<xsd:attribute name="bottomRight" type="ST_RelationshipId"/>
|
||||||
|
</xsd:schema>
|
||||||
4439
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd
Normal file
4439
skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user