Compare commits
467 Commits
d63a34f4e6
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
405a9dfb72 | ||
| d1be841688 | |||
|
|
9b8655748e | ||
| 00fd6c8710 | |||
| bbd9d48fa6 | |||
| 8fb1d3e583 | |||
| 34ba7cae6a | |||
| 305ab15436 | |||
| 46a7076460 | |||
| e0e6693897 | |||
|
|
7d1e50d045 | ||
| 25ce12cebf | |||
| 7d55717037 | |||
|
|
290e8f8f15 | ||
| fc84fd61ab | |||
|
|
d79690a371 | ||
| 7bccbc7085 | |||
|
|
059ef483ca | ||
|
|
4beb4c40c5 | ||
| 914f2d8229 | |||
| 2f57b3e7c1 | |||
|
|
39ccd27df8 | ||
| d370b6a888 | |||
| 3c61e39e09 | |||
| f2c71b08bb | |||
| 90cf7f43d7 | |||
| 1f5d392c08 | |||
| d52bbda8c3 | |||
|
|
986510278b | ||
| 758921b633 | |||
| 8e7ebd3461 | |||
| 8c05782549 | |||
| 060d1910dd | |||
| 44ae216612 | |||
| 0076753c19 | |||
|
|
957d426042 | ||
|
|
76094d6eff | ||
| dc43ce335a | |||
| d27b5147ec | |||
| 4fb540cfa5 | |||
| 72e1f927e9 | |||
|
|
e7beb3f5c3 | ||
|
|
dc7e3c1de8 | ||
| 1242d41499 | |||
| 091b6e83b6 | |||
| b53cdfa617 | |||
| fe2a79773f | |||
| 22b47fcc95 | |||
| 328ccbbd99 | |||
| 6b6e56c79b | |||
| 41fe89447f | |||
| 0d11d411ea | |||
|
|
d525a50f52 | ||
|
|
5d97975e7f | ||
|
|
03e89e0577 | ||
| 9c48744cb1 | |||
| 24758414f2 | |||
| 2d55387ba9 | |||
| 1fc2032aa8 | |||
| adc89a5ed2 | |||
| 278676957e | |||
| 988c17cd30 | |||
| 08ee473671 | |||
|
|
6962a8b1c1 | ||
|
|
95e379e5a5 | ||
| 2a8e662b44 | |||
| 0b8a7245f6 | |||
| 17e148ce7a | |||
| 937b4508ae | |||
| 87d4214541 | |||
|
|
acc59ab87c | ||
| 78bcdef7fd | |||
| 72c0ceac29 | |||
|
|
e2808fd6b9 | ||
| 0cfdce042f | |||
|
|
cd54a3903c | ||
|
|
063eb1fe08 | ||
| f125c8dc85 | |||
| d663c46422 | |||
| a8ab52589e | |||
| 14333f47ea | |||
|
|
88d9e19cc5 | ||
|
|
994ffcb8b8 | ||
|
|
5ab4650c4e | ||
| ed75b148a8 | |||
| 210c463130 | |||
| 6922aa1d2a | |||
|
|
4e2097fc7b | ||
| 38b4ff5c92 | |||
| e294952a60 | |||
| 3380b2787e | |||
| 0758ba401b | |||
| 73ebc20471 | |||
| 3f36ed4ce8 | |||
| 76fdc047b9 | |||
| 309c470f8a | |||
|
|
f3fd150235 | ||
|
|
283cf784a3 | ||
| 53080648a1 | |||
| 26e0665eeb | |||
|
|
fe7778e6e0 | ||
|
|
4daf92d4cd | ||
| 51d4b1e3f2 | |||
|
|
0080d89f7e | ||
| 6da4770f47 | |||
| 918c766b90 | |||
|
|
95235b810e | ||
| 349beae4a2 | |||
|
|
0550d6a619 | ||
|
|
d195ebe3c9 | ||
|
|
687f19a1eb | ||
|
|
b810c08ae5 | ||
|
|
d99daa3048 | ||
|
|
740208b13f | ||
| 509d4026e2 | |||
| cb5023bcea | |||
|
|
49eed7c784 | ||
|
|
13e83e0c82 | ||
|
|
4395c14744 | ||
|
|
d052d268f5 | ||
| 74e28be0b0 | |||
| c5f1f46e97 | |||
| 09e0691feb | |||
| 64ad5cb676 | |||
| 8a98fc9f70 | |||
| 2ed805dbb1 | |||
| 7450904532 | |||
| f9b6447f6b | |||
| 8deefd2cb1 | |||
|
|
d8511ecb1b | ||
| 6642fd9e1c | |||
|
|
8a4be4e2ce | ||
|
|
9238044bc1 | ||
|
|
f204e46e07 | ||
|
|
f439b1ffc0 | ||
|
|
9c4d55a352 | ||
|
|
c210d57316 | ||
|
|
41b1d47bba | ||
|
|
3a02e327c7 | ||
|
|
4d976ade19 | ||
|
|
82951fe941 | ||
|
|
8af6933a89 | ||
|
|
0cb6ebeea7 | ||
|
|
afc94b6879 | ||
|
|
8e7413ee3f | ||
|
|
f68e699486 | ||
|
|
583a77f8dc | ||
|
|
3f0a0c863a | ||
|
|
345917e199 | ||
|
|
6f44e4dd36 | ||
|
|
7c7891cebe | ||
|
|
062089598f | ||
|
|
4142723985 | ||
|
|
054f4c3049 | ||
|
|
098aae5aef | ||
| 03f408cb76 | |||
| a894f0f8ee | |||
|
|
f87afba566 | ||
| 6fedfe1e40 | |||
|
|
7827e58aac | ||
| 5d280640e8 | |||
| e7413396b2 | |||
|
|
ce64c4519c | ||
|
|
e9d4f57815 | ||
| e573d9f68b | |||
| 2584c8f076 | |||
| 7b6c972a12 | |||
|
|
c3f1b105e9 | ||
| 616c2d21a6 | |||
| 63a9e26abf | |||
|
|
d2dfc714ec | ||
|
|
5c8bfbc98b | ||
|
|
885a147420 | ||
|
|
afbf3f9075 | ||
|
|
720cac8a8f | ||
| 5497c99f0c | |||
|
|
d8b4aed16c | ||
| efc97c855c | |||
|
|
0c5353cf8b | ||
|
|
8a84b40ee5 | ||
| f6b39a4815 | |||
|
|
1b3d4e3dc0 | ||
|
|
cb46461ede | ||
| 3b0a359412 | |||
| 6fa26e895d | |||
| 8ab8691c17 | |||
|
|
35b8a7d10a | ||
| 22de02f132 | |||
| 11244aa48f | |||
| 0a5f26e9c0 | |||
| 4a8e9b5a22 | |||
| bfb2491842 | |||
|
|
b747f80507 | ||
| ced931a280 | |||
| b497eb853c | |||
| 7a2342ea2e | |||
|
|
09fdfa294a | ||
|
|
4ef9aa07d2 | ||
| 08085403b3 | |||
| 2d7dcb4aeb | |||
| ad29502488 | |||
| 5b0acede89 | |||
| ac1cd3afc8 | |||
|
|
8a863b4ecb | ||
|
|
882d63249c | ||
|
|
6315ca5658 | ||
|
|
9f802b67f0 | ||
| 6694ae52ba | |||
| 9491ceaa5d | |||
| db9a70a99d | |||
|
|
9105e687d6 | ||
| b1d6c6008e | |||
| 6b9f9a107e | |||
| 11a7f49162 | |||
| b4e5061b73 | |||
| f5a1ad7f3f | |||
| eeac88b1d1 | |||
| 1ab9b020c1 | |||
| 3055518d2b | |||
| 9f619ccdd4 | |||
| df78ff29bd | |||
| 4d13acacc2 | |||
| 67573c1d9d | |||
| b27d8a6703 | |||
| 6f3d4272e6 | |||
| 6e5315fdd6 | |||
| 544d7ee95c | |||
| 7f7f7d69f7 | |||
|
|
ae9a96822e | ||
| bbef0322a3 | |||
| a8a205aa48 | |||
| c052ea7c39 | |||
| 6accaa35c9 | |||
| 466e7296fa | |||
|
|
5678535d88 | ||
| b7993885bb | |||
| 3b8ef380ae | |||
|
|
2334a27467 | ||
|
|
92511c2777 | ||
| 64b02466b1 | |||
| 2ffbe73305 | |||
| 48d3941701 | |||
| 0ad1889029 | |||
| 7dc98dcf84 | |||
| 681fb695bd | |||
| 518d8385e6 | |||
|
|
7073ef0be0 | ||
| 2288162ad7 | |||
| 6f701d7fa6 | |||
| 34253f88b2 | |||
|
|
488c311788 | ||
|
|
b5527cc07f | ||
| 6d23d36a9c | |||
|
|
e2e5999276 | ||
|
|
112ec2e4a3 | ||
| 4b92be10b4 | |||
| 0b361df0a4 | |||
| 3a242074ff | |||
|
|
353f267488 | ||
|
|
2d705d2f81 | ||
| 184871e84f | |||
| ffcdaed087 | |||
| 91a0b48662 | |||
| c509a804ec | |||
| 1a7b6c0cd4 | |||
|
|
11cf88fd49 | ||
| 3f0fa3bbb3 | |||
| d7c15848f0 | |||
|
|
188b907907 | ||
| 71e3601d51 | |||
| f04c3d112c | |||
| 8739959be0 | |||
| 24bc049fa0 | |||
| b42cffdd8a | |||
| 927691a27b | |||
| 6c36ae5340 | |||
| 5473a21418 | |||
| b14c19a887 | |||
| 979dc0a34c | |||
| c2fa13de82 | |||
|
|
77b054a86c | ||
|
|
20eb020071 | ||
|
|
d3deb244c0 | ||
| d20a95c3c4 | |||
| 1f84a641ea | |||
| c542b057b5 | |||
|
|
03d980e0cf | ||
| b03f563df4 | |||
| 8fa0a239b5 | |||
| ee51ab2960 | |||
|
|
22d73e5b44 | ||
| b31cacd930 | |||
| 1440cd45a0 | |||
|
|
07829b93c7 | ||
| c2b1d7d9d9 | |||
| 9f6e94da4b | |||
| e0b9081649 | |||
| e1dc5c895f | |||
|
|
4e58601b2c | ||
| 4060be4de7 | |||
|
|
059078c264 | ||
| cc51d0b345 | |||
| bedad38ca3 | |||
| c15c091718 | |||
| e90e541af3 | |||
|
|
88088c01ac | ||
| 251cf263ff | |||
| f1a4fc87c8 | |||
| d28ac34ae0 | |||
| 4d2a321999 | |||
| b5cf685b13 | |||
|
|
316c1478fc | ||
|
|
24e8a3cfdf | ||
| 888ac1fee3 | |||
| 427d567337 | |||
| 5d73de3072 | |||
| 1fdaafb1e8 | |||
| dbdaba5a6a | |||
| 4210f32a05 | |||
|
|
dc2e4098ae | ||
|
|
83747d8626 | ||
| 68c0c098c8 | |||
| dc1366890f | |||
| f1087b04f0 | |||
|
|
0b4b4f7283 | ||
| d41d3066b3 | |||
| 3bfe25c2f2 | |||
|
|
266b06114a | ||
|
|
6ed41eb513 | ||
|
|
0a8428a4ca | ||
|
|
d058b30872 | ||
| 0c06b05764 | |||
|
|
557f626c05 | ||
| 32bfef6686 | |||
|
|
5795d9eb74 | ||
| 7c29c6359f | |||
|
|
40c5d26dfd | ||
|
|
81c97de170 | ||
| 0cdf332ee7 | |||
| b4e13e1305 | |||
| dd1cd17801 | |||
| 6d87b7c445 | |||
| 0d1710f201 | |||
| a3650aa386 | |||
| 0f9ef726bf | |||
| 8f2405ee34 | |||
|
|
6d59c6491c | ||
| 1e7e0453e6 | |||
| 257ea42db7 | |||
| 872a5308ef | |||
| 32f7077fc1 | |||
| 4f917b0121 | |||
| 8a7d2abb4a | |||
| 03939fb232 | |||
|
|
16f6fbb8cf | ||
| 28f85ceb05 | |||
|
|
b43688e483 | ||
|
|
0bf29a53a4 | ||
|
|
0c70b224f9 | ||
|
|
449209a79b | ||
|
|
d6663c9667 | ||
|
|
53d29cbe14 | ||
|
|
e16a70dd50 | ||
|
|
bba63d2f1b | ||
|
|
f3d011951b | ||
| 7dc76d7b59 | |||
| b2dec2667a | |||
|
|
879d31b51d | ||
|
|
473a5f7f06 | ||
| 2eec988c56 | |||
| 8820048d55 | |||
| 6af7720470 | |||
|
|
5f134945ab | ||
| bc12cc1b08 | |||
| 17b8ea7192 | |||
|
|
2bfdd686c7 | ||
|
|
066cfaba46 | ||
| e8850e85fc | |||
| d083a3123a | |||
| 96c1927f8d | |||
| bdac9d0709 | |||
| 8faba1ea21 | |||
| dd9b77f6bb | |||
| d45955f6de | |||
| f905915f34 | |||
|
|
52951d7296 | ||
| 3c47979913 | |||
| 9aad809322 | |||
| b7850e5b8a | |||
|
|
effcdfbbe6 | ||
| 4277a369d2 | |||
| cf3f971741 | |||
| 75737cf95c | |||
| 4b544dc214 | |||
| 597e621b69 | |||
| 725ac4b76a | |||
| 8e8b35faa4 | |||
| 664ee0312c | |||
| cceaf7fb07 | |||
| d5d638b60b | |||
| 8de5ae3a4f | |||
| 8f20c48baa | |||
|
|
547cccbeb7 | ||
| 86e665bcae | |||
|
|
d1aa91f727 | ||
| bc021924e4 | |||
| 6179a89b6c | |||
| 7c12028f63 | |||
| befb4739ee | |||
| fe07cee58c | |||
|
|
066c457d90 | ||
| 39b608dfd0 | |||
| 6b600b44ca | |||
|
|
b26ad75299 | ||
| b69f312611 | |||
| c65db9abc3 | |||
| 1b4ad5e710 | |||
| e46e2be830 | |||
| f515b90c43 | |||
| 6aff10e240 | |||
|
|
5d02da03b4 | ||
| d99188bfb9 | |||
| c3776c642b | |||
| 46a99ecd55 | |||
| 81744b9b9e | |||
| 469b325f0e | |||
| 8a3fe5461e | |||
| b65841c0cc | |||
| 8ef334ba1b | |||
|
|
2492daa0ad | ||
| 8af06f6916 | |||
| 7008fb007f | |||
| dc039fcced | |||
|
|
fcb1d771f4 | ||
| 30ca81090a | |||
| e722841e60 | |||
| b4ab67aed9 | |||
| 6a8f82bb2e | |||
| 09761c8ce8 | |||
|
|
5e3affcf3a | ||
|
|
455f7938be | ||
|
|
9525b1d927 | ||
| 8810c678c9 | |||
| cd3155e63c | |||
| 45fdca65a7 | |||
| 491db8bc03 | |||
| c735bc3a78 | |||
| e2db4bd3a5 | |||
| fc0f5a11be | |||
| c5528ce1b7 | |||
| 9116ea4a84 | |||
| ce8b0b16b1 | |||
| 259c62b6b4 | |||
| 208b8fc41d | |||
| c611c0ce6f | |||
| 25c266babb | |||
| 04ad139eae | |||
|
|
6add091a7b | ||
|
|
a05b3a8d3c | ||
| 35bc735ecc | |||
|
|
fcd2d03424 | ||
| 87c7981ad9 | |||
| 9edf8936ba | |||
|
|
753bd8bb4b | ||
| 3e09b4cc10 | |||
| 55970622f1 | |||
| 98164c65a2 |
@@ -1,386 +0,0 @@
|
|||||||
---
|
|
||||||
name: ui-ux-pro-max
|
|
||||||
description: "UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 9 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient. Integrations: shadcn/ui MCP for component search and examples."
|
|
||||||
---
|
|
||||||
|
|
||||||
# UI/UX Pro Max - Design Intelligence
|
|
||||||
|
|
||||||
Comprehensive design guide for web and mobile applications. Contains 50+ styles, 97 color palettes, 57 font pairings, 99 UX guidelines, and 25 chart types across 9 technology stacks. Searchable database with priority-based recommendations.
|
|
||||||
|
|
||||||
## When to Apply
|
|
||||||
|
|
||||||
Reference these guidelines when:
|
|
||||||
- Designing new UI components or pages
|
|
||||||
- Choosing color palettes and typography
|
|
||||||
- Reviewing code for UX issues
|
|
||||||
- Building landing pages or dashboards
|
|
||||||
- Implementing accessibility requirements
|
|
||||||
|
|
||||||
## Rule Categories by Priority
|
|
||||||
|
|
||||||
| Priority | Category | Impact | Domain |
|
|
||||||
|----------|----------|--------|--------|
|
|
||||||
| 1 | Accessibility | CRITICAL | `ux` |
|
|
||||||
| 2 | Touch & Interaction | CRITICAL | `ux` |
|
|
||||||
| 3 | Performance | HIGH | `ux` |
|
|
||||||
| 4 | Layout & Responsive | HIGH | `ux` |
|
|
||||||
| 5 | Typography & Color | MEDIUM | `typography`, `color` |
|
|
||||||
| 6 | Animation | MEDIUM | `ux` |
|
|
||||||
| 7 | Style Selection | MEDIUM | `style`, `product` |
|
|
||||||
| 8 | Charts & Data | LOW | `chart` |
|
|
||||||
|
|
||||||
## Quick Reference
|
|
||||||
|
|
||||||
### 1. Accessibility (CRITICAL)
|
|
||||||
|
|
||||||
- `color-contrast` - Minimum 4.5:1 ratio for normal text
|
|
||||||
- `focus-states` - Visible focus rings on interactive elements
|
|
||||||
- `alt-text` - Descriptive alt text for meaningful images
|
|
||||||
- `aria-labels` - aria-label for icon-only buttons
|
|
||||||
- `keyboard-nav` - Tab order matches visual order
|
|
||||||
- `form-labels` - Use label with for attribute
|
|
||||||
|
|
||||||
### 2. Touch & Interaction (CRITICAL)
|
|
||||||
|
|
||||||
- `touch-target-size` - Minimum 44x44px touch targets
|
|
||||||
- `hover-vs-tap` - Use click/tap for primary interactions
|
|
||||||
- `loading-buttons` - Disable button during async operations
|
|
||||||
- `error-feedback` - Clear error messages near problem
|
|
||||||
- `cursor-pointer` - Add cursor-pointer to clickable elements
|
|
||||||
|
|
||||||
### 3. Performance (HIGH)
|
|
||||||
|
|
||||||
- `image-optimization` - Use WebP, srcset, lazy loading
|
|
||||||
- `reduced-motion` - Check prefers-reduced-motion
|
|
||||||
- `content-jumping` - Reserve space for async content
|
|
||||||
|
|
||||||
### 4. Layout & Responsive (HIGH)
|
|
||||||
|
|
||||||
- `viewport-meta` - width=device-width initial-scale=1
|
|
||||||
- `readable-font-size` - Minimum 16px body text on mobile
|
|
||||||
- `horizontal-scroll` - Ensure content fits viewport width
|
|
||||||
- `z-index-management` - Define z-index scale (10, 20, 30, 50)
|
|
||||||
|
|
||||||
### 5. Typography & Color (MEDIUM)
|
|
||||||
|
|
||||||
- `line-height` - Use 1.5-1.75 for body text
|
|
||||||
- `line-length` - Limit to 65-75 characters per line
|
|
||||||
- `font-pairing` - Match heading/body font personalities
|
|
||||||
|
|
||||||
### 6. Animation (MEDIUM)
|
|
||||||
|
|
||||||
- `duration-timing` - Use 150-300ms for micro-interactions
|
|
||||||
- `transform-performance` - Use transform/opacity, not width/height
|
|
||||||
- `loading-states` - Skeleton screens or spinners
|
|
||||||
|
|
||||||
### 7. Style Selection (MEDIUM)
|
|
||||||
|
|
||||||
- `style-match` - Match style to product type
|
|
||||||
- `consistency` - Use same style across all pages
|
|
||||||
- `no-emoji-icons` - Use SVG icons, not emojis
|
|
||||||
|
|
||||||
### 8. Charts & Data (LOW)
|
|
||||||
|
|
||||||
- `chart-type` - Match chart type to data type
|
|
||||||
- `color-guidance` - Use accessible color palettes
|
|
||||||
- `data-table` - Provide table alternative for accessibility
|
|
||||||
|
|
||||||
## How to Use
|
|
||||||
|
|
||||||
Search specific domains using the CLI tool below.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Check if Python is installed:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 --version || python --version
|
|
||||||
```
|
|
||||||
|
|
||||||
If Python is not installed, install it based on user's OS:
|
|
||||||
|
|
||||||
**macOS:**
|
|
||||||
```bash
|
|
||||||
brew install python3
|
|
||||||
```
|
|
||||||
|
|
||||||
**Ubuntu/Debian:**
|
|
||||||
```bash
|
|
||||||
sudo apt update && sudo apt install python3
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows:**
|
|
||||||
```powershell
|
|
||||||
winget install Python.Python.3.12
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## How to Use This Skill
|
|
||||||
|
|
||||||
When user requests UI/UX work (design, build, create, implement, review, fix, improve), follow this workflow:
|
|
||||||
|
|
||||||
### Step 1: Analyze User Requirements
|
|
||||||
|
|
||||||
Extract key information from user request:
|
|
||||||
- **Product type**: SaaS, e-commerce, portfolio, dashboard, landing page, etc.
|
|
||||||
- **Style keywords**: minimal, playful, professional, elegant, dark mode, etc.
|
|
||||||
- **Industry**: healthcare, fintech, gaming, education, etc.
|
|
||||||
- **Stack**: React, Vue, Next.js, or default to `html-tailwind`
|
|
||||||
|
|
||||||
### Step 2: Generate Design System (REQUIRED)
|
|
||||||
|
|
||||||
**Always start with `--design-system`** to get comprehensive recommendations with reasoning:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "<product_type> <industry> <keywords>" --design-system [-p "Project Name"]
|
|
||||||
```
|
|
||||||
|
|
||||||
This command:
|
|
||||||
1. Searches 5 domains in parallel (product, style, color, landing, typography)
|
|
||||||
2. Applies reasoning rules from `ui-reasoning.csv` to select best matches
|
|
||||||
3. Returns complete design system: pattern, style, colors, typography, effects
|
|
||||||
4. Includes anti-patterns to avoid
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "beauty spa wellness service" --design-system -p "Serenity Spa"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 2b: Persist Design System (Master + Overrides Pattern)
|
|
||||||
|
|
||||||
To save the design system for **hierarchical retrieval across sessions**, add `--persist`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "<query>" --design-system --persist -p "Project Name"
|
|
||||||
```
|
|
||||||
|
|
||||||
This creates:
|
|
||||||
- `design-system/MASTER.md` — Global Source of Truth with all design rules
|
|
||||||
- `design-system/pages/` — Folder for page-specific overrides
|
|
||||||
|
|
||||||
**With page-specific override:**
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "<query>" --design-system --persist -p "Project Name" --page "dashboard"
|
|
||||||
```
|
|
||||||
|
|
||||||
This also creates:
|
|
||||||
- `design-system/pages/dashboard.md` — Page-specific deviations from Master
|
|
||||||
|
|
||||||
**How hierarchical retrieval works:**
|
|
||||||
1. When building a specific page (e.g., "Checkout"), first check `design-system/pages/checkout.md`
|
|
||||||
2. If the page file exists, its rules **override** the Master file
|
|
||||||
3. If not, use `design-system/MASTER.md` exclusively
|
|
||||||
|
|
||||||
**Context-aware retrieval prompt:**
|
|
||||||
```
|
|
||||||
I am building the [Page Name] page. Please read design-system/MASTER.md.
|
|
||||||
Also check if design-system/pages/[page-name].md exists.
|
|
||||||
If the page file exists, prioritize its rules.
|
|
||||||
If not, use the Master rules exclusively.
|
|
||||||
Now, generate the code...
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 3: Supplement with Detailed Searches (as needed)
|
|
||||||
|
|
||||||
After getting the design system, use domain searches to get additional details:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "<keyword>" --domain <domain> [-n <max_results>]
|
|
||||||
```
|
|
||||||
|
|
||||||
**When to use detailed searches:**
|
|
||||||
|
|
||||||
| Need | Domain | Example |
|
|
||||||
|------|--------|---------|
|
|
||||||
| More style options | `style` | `--domain style "glassmorphism dark"` |
|
|
||||||
| Chart recommendations | `chart` | `--domain chart "real-time dashboard"` |
|
|
||||||
| UX best practices | `ux` | `--domain ux "animation accessibility"` |
|
|
||||||
| Alternative fonts | `typography` | `--domain typography "elegant luxury"` |
|
|
||||||
| Landing structure | `landing` | `--domain landing "hero social-proof"` |
|
|
||||||
|
|
||||||
### Step 4: Stack Guidelines (Default: html-tailwind)
|
|
||||||
|
|
||||||
Get implementation-specific best practices. If user doesn't specify a stack, **default to `html-tailwind`**.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "<keyword>" --stack html-tailwind
|
|
||||||
```
|
|
||||||
|
|
||||||
Available stacks: `html-tailwind`, `react`, `nextjs`, `vue`, `svelte`, `swiftui`, `react-native`, `flutter`, `shadcn`, `jetpack-compose`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Search Reference
|
|
||||||
|
|
||||||
### Available Domains
|
|
||||||
|
|
||||||
| Domain | Use For | Example Keywords |
|
|
||||||
|--------|---------|------------------|
|
|
||||||
| `product` | Product type recommendations | SaaS, e-commerce, portfolio, healthcare, beauty, service |
|
|
||||||
| `style` | UI styles, colors, effects | glassmorphism, minimalism, dark mode, brutalism |
|
|
||||||
| `typography` | Font pairings, Google Fonts | elegant, playful, professional, modern |
|
|
||||||
| `color` | Color palettes by product type | saas, ecommerce, healthcare, beauty, fintech, service |
|
|
||||||
| `landing` | Page structure, CTA strategies | hero, hero-centric, testimonial, pricing, social-proof |
|
|
||||||
| `chart` | Chart types, library recommendations | trend, comparison, timeline, funnel, pie |
|
|
||||||
| `ux` | Best practices, anti-patterns | animation, accessibility, z-index, loading |
|
|
||||||
| `react` | React/Next.js performance | waterfall, bundle, suspense, memo, rerender, cache |
|
|
||||||
| `web` | Web interface guidelines | aria, focus, keyboard, semantic, virtualize |
|
|
||||||
| `prompt` | AI prompts, CSS keywords | (style name) |
|
|
||||||
|
|
||||||
### Available Stacks
|
|
||||||
|
|
||||||
| Stack | Focus |
|
|
||||||
|-------|-------|
|
|
||||||
| `html-tailwind` | Tailwind utilities, responsive, a11y (DEFAULT) |
|
|
||||||
| `react` | State, hooks, performance, patterns |
|
|
||||||
| `nextjs` | SSR, routing, images, API routes |
|
|
||||||
| `vue` | Composition API, Pinia, Vue Router |
|
|
||||||
| `svelte` | Runes, stores, SvelteKit |
|
|
||||||
| `swiftui` | Views, State, Navigation, Animation |
|
|
||||||
| `react-native` | Components, Navigation, Lists |
|
|
||||||
| `flutter` | Widgets, State, Layout, Theming |
|
|
||||||
| `shadcn` | shadcn/ui components, theming, forms, patterns |
|
|
||||||
| `jetpack-compose` | Composables, Modifiers, State Hoisting, Recomposition |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Example Workflow
|
|
||||||
|
|
||||||
**User request:** "Làm landing page cho dịch vụ chăm sóc da chuyên nghiệp"
|
|
||||||
|
|
||||||
### Step 1: Analyze Requirements
|
|
||||||
- Product type: Beauty/Spa service
|
|
||||||
- Style keywords: elegant, professional, soft
|
|
||||||
- Industry: Beauty/Wellness
|
|
||||||
- Stack: html-tailwind (default)
|
|
||||||
|
|
||||||
### Step 2: Generate Design System (REQUIRED)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "beauty spa wellness service elegant" --design-system -p "Serenity Spa"
|
|
||||||
```
|
|
||||||
|
|
||||||
**Output:** Complete design system with pattern, style, colors, typography, effects, and anti-patterns.
|
|
||||||
|
|
||||||
### Step 3: Supplement with Detailed Searches (as needed)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Get UX guidelines for animation and accessibility
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "animation accessibility" --domain ux
|
|
||||||
|
|
||||||
# Get alternative typography options if needed
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "elegant luxury serif" --domain typography
|
|
||||||
```
|
|
||||||
|
|
||||||
### Step 4: Stack Guidelines
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "layout responsive form" --stack html-tailwind
|
|
||||||
```
|
|
||||||
|
|
||||||
**Then:** Synthesize design system + detailed searches and implement the design.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Output Formats
|
|
||||||
|
|
||||||
The `--design-system` flag supports two output formats:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# ASCII box (default) - best for terminal display
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "fintech crypto" --design-system
|
|
||||||
|
|
||||||
# Markdown - best for documentation
|
|
||||||
python3 skills/ui-ux-pro-max/scripts/search.py "fintech crypto" --design-system -f markdown
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Tips for Better Results
|
|
||||||
|
|
||||||
1. **Be specific with keywords** - "healthcare SaaS dashboard" > "app"
|
|
||||||
2. **Search multiple times** - Different keywords reveal different insights
|
|
||||||
3. **Combine domains** - Style + Typography + Color = Complete design system
|
|
||||||
4. **Always check UX** - Search "animation", "z-index", "accessibility" for common issues
|
|
||||||
5. **Use stack flag** - Get implementation-specific best practices
|
|
||||||
6. **Iterate** - If first search doesn't match, try different keywords
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Common Rules for Professional UI
|
|
||||||
|
|
||||||
These are frequently overlooked issues that make UI look unprofessional:
|
|
||||||
|
|
||||||
### Icons & Visual Elements
|
|
||||||
|
|
||||||
| Rule | Do | Don't |
|
|
||||||
|------|----|----- |
|
|
||||||
| **No emoji icons** | Use SVG icons (Heroicons, Lucide, Simple Icons) | Use emojis like 🎨 🚀 ⚙️ as UI icons |
|
|
||||||
| **Stable hover states** | Use color/opacity transitions on hover | Use scale transforms that shift layout |
|
|
||||||
| **Correct brand logos** | Research official SVG from Simple Icons | Guess or use incorrect logo paths |
|
|
||||||
| **Consistent icon sizing** | Use fixed viewBox (24x24) with w-6 h-6 | Mix different icon sizes randomly |
|
|
||||||
|
|
||||||
### Interaction & Cursor
|
|
||||||
|
|
||||||
| Rule | Do | Don't |
|
|
||||||
|------|----|----- |
|
|
||||||
| **Cursor pointer** | Add `cursor-pointer` to all clickable/hoverable cards | Leave default cursor on interactive elements |
|
|
||||||
| **Hover feedback** | Provide visual feedback (color, shadow, border) | No indication element is interactive |
|
|
||||||
| **Smooth transitions** | Use `transition-colors duration-200` | Instant state changes or too slow (>500ms) |
|
|
||||||
|
|
||||||
### Light/Dark Mode Contrast
|
|
||||||
|
|
||||||
| Rule | Do | Don't |
|
|
||||||
|------|----|----- |
|
|
||||||
| **Glass card light mode** | Use `bg-white/80` or higher opacity | Use `bg-white/10` (too transparent) |
|
|
||||||
| **Text contrast light** | Use `#0F172A` (slate-900) for text | Use `#94A3B8` (slate-400) for body text |
|
|
||||||
| **Muted text light** | Use `#475569` (slate-600) minimum | Use gray-400 or lighter |
|
|
||||||
| **Border visibility** | Use `border-gray-200` in light mode | Use `border-white/10` (invisible) |
|
|
||||||
|
|
||||||
### Layout & Spacing
|
|
||||||
|
|
||||||
| Rule | Do | Don't |
|
|
||||||
|------|----|----- |
|
|
||||||
| **Floating navbar** | Add `top-4 left-4 right-4` spacing | Stick navbar to `top-0 left-0 right-0` |
|
|
||||||
| **Content padding** | Account for fixed navbar height | Let content hide behind fixed elements |
|
|
||||||
| **Consistent max-width** | Use same `max-w-6xl` or `max-w-7xl` | Mix different container widths |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Pre-Delivery Checklist
|
|
||||||
|
|
||||||
Before delivering UI code, verify these items:
|
|
||||||
|
|
||||||
### Visual Quality
|
|
||||||
- [ ] No emojis used as icons (use SVG instead)
|
|
||||||
- [ ] All icons from consistent icon set (Heroicons/Lucide)
|
|
||||||
- [ ] Brand logos are correct (verified from Simple Icons)
|
|
||||||
- [ ] Hover states don't cause layout shift
|
|
||||||
- [ ] Use theme colors directly (bg-primary) not var() wrapper
|
|
||||||
|
|
||||||
### Interaction
|
|
||||||
- [ ] All clickable elements have `cursor-pointer`
|
|
||||||
- [ ] Hover states provide clear visual feedback
|
|
||||||
- [ ] Transitions are smooth (150-300ms)
|
|
||||||
- [ ] Focus states visible for keyboard navigation
|
|
||||||
|
|
||||||
### Light/Dark Mode
|
|
||||||
- [ ] Light mode text has sufficient contrast (4.5:1 minimum)
|
|
||||||
- [ ] Glass/transparent elements visible in light mode
|
|
||||||
- [ ] Borders visible in both modes
|
|
||||||
- [ ] Test both modes before delivery
|
|
||||||
|
|
||||||
### Layout
|
|
||||||
- [ ] Floating elements have proper spacing from edges
|
|
||||||
- [ ] No content hidden behind fixed navbars
|
|
||||||
- [ ] Responsive at 375px, 768px, 1024px, 1440px
|
|
||||||
- [ ] No horizontal scroll on mobile
|
|
||||||
|
|
||||||
### Accessibility
|
|
||||||
- [ ] All images have alt text
|
|
||||||
- [ ] Form inputs have labels
|
|
||||||
- [ ] Color is not the only indicator
|
|
||||||
- [ ] `prefers-reduced-motion` respected
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../src/ui-ux-pro-max/data
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../../src/ui-ux-pro-max/scripts
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
name: web-design-guidelines
|
|
||||||
description: Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
|
|
||||||
metadata:
|
|
||||||
author: vercel
|
|
||||||
version: "1.0.0"
|
|
||||||
argument-hint: <file-or-pattern>
|
|
||||||
---
|
|
||||||
|
|
||||||
# Web Interface Guidelines
|
|
||||||
|
|
||||||
Review files for compliance with Web Interface Guidelines.
|
|
||||||
|
|
||||||
## How It Works
|
|
||||||
|
|
||||||
1. Fetch the latest guidelines from the source URL below
|
|
||||||
2. Read the specified files (or prompt user for files/pattern)
|
|
||||||
3. Check against all rules in the fetched guidelines
|
|
||||||
4. Output findings in the terse `file:line` format
|
|
||||||
|
|
||||||
## Guidelines Source
|
|
||||||
|
|
||||||
Fetch fresh guidelines before each review:
|
|
||||||
|
|
||||||
```
|
|
||||||
https://raw.githubusercontent.com/vercel-labs/web-interface-guidelines/main/command.md
|
|
||||||
```
|
|
||||||
|
|
||||||
Use WebFetch to retrieve the latest rules. The fetched content contains all the rules and output format instructions.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
When a user provides a file or pattern argument:
|
|
||||||
1. Fetch guidelines from the source URL above
|
|
||||||
2. Read the specified files
|
|
||||||
3. Apply all rules from the fetched guidelines
|
|
||||||
4. Output findings using the format specified in the guidelines
|
|
||||||
|
|
||||||
If no files specified, ask the user which files to review.
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
© 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.
|
|
||||||
@@ -1,292 +0,0 @@
|
|||||||
---
|
|
||||||
name: xlsx
|
|
||||||
description: "Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved."
|
|
||||||
license: Proprietary. LICENSE.txt has complete terms
|
|
||||||
---
|
|
||||||
|
|
||||||
# Requirements for Outputs
|
|
||||||
|
|
||||||
## All Excel files
|
|
||||||
|
|
||||||
### Professional Font
|
|
||||||
- Use a consistent, professional font (e.g., Arial, Times New Roman) for all deliverables unless otherwise instructed by the user
|
|
||||||
|
|
||||||
### Zero Formula Errors
|
|
||||||
- Every Excel model MUST be delivered with ZERO formula errors (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)
|
|
||||||
|
|
||||||
### Preserve Existing Templates (when updating templates)
|
|
||||||
- Study and EXACTLY match existing format, style, and conventions when modifying files
|
|
||||||
- Never impose standardized formatting on files with established patterns
|
|
||||||
- Existing template conventions ALWAYS override these guidelines
|
|
||||||
|
|
||||||
## Financial models
|
|
||||||
|
|
||||||
### Color Coding Standards
|
|
||||||
Unless otherwise stated by the user or existing template
|
|
||||||
|
|
||||||
#### Industry-Standard Color Conventions
|
|
||||||
- **Blue text (RGB: 0,0,255)**: Hardcoded inputs, and numbers users will change for scenarios
|
|
||||||
- **Black text (RGB: 0,0,0)**: ALL formulas and calculations
|
|
||||||
- **Green text (RGB: 0,128,0)**: Links pulling from other worksheets within same workbook
|
|
||||||
- **Red text (RGB: 255,0,0)**: External links to other files
|
|
||||||
- **Yellow background (RGB: 255,255,0)**: Key assumptions needing attention or cells that need to be updated
|
|
||||||
|
|
||||||
### Number Formatting Standards
|
|
||||||
|
|
||||||
#### Required Format Rules
|
|
||||||
- **Years**: Format as text strings (e.g., "2024" not "2,024")
|
|
||||||
- **Currency**: Use $#,##0 format; ALWAYS specify units in headers ("Revenue ($mm)")
|
|
||||||
- **Zeros**: Use number formatting to make all zeros "-", including percentages (e.g., "$#,##0;($#,##0);-")
|
|
||||||
- **Percentages**: Default to 0.0% format (one decimal)
|
|
||||||
- **Multiples**: Format as 0.0x for valuation multiples (EV/EBITDA, P/E)
|
|
||||||
- **Negative numbers**: Use parentheses (123) not minus -123
|
|
||||||
|
|
||||||
### Formula Construction Rules
|
|
||||||
|
|
||||||
#### Assumptions Placement
|
|
||||||
- Place ALL assumptions (growth rates, margins, multiples, etc.) in separate assumption cells
|
|
||||||
- Use cell references instead of hardcoded values in formulas
|
|
||||||
- Example: Use =B5*(1+$B$6) instead of =B5*1.05
|
|
||||||
|
|
||||||
#### Formula Error Prevention
|
|
||||||
- Verify all cell references are correct
|
|
||||||
- Check for off-by-one errors in ranges
|
|
||||||
- Ensure consistent formulas across all projection periods
|
|
||||||
- Test with edge cases (zero values, negative numbers)
|
|
||||||
- Verify no unintended circular references
|
|
||||||
|
|
||||||
#### Documentation Requirements for Hardcodes
|
|
||||||
- Comment or in cells beside (if end of table). Format: "Source: [System/Document], [Date], [Specific Reference], [URL if applicable]"
|
|
||||||
- Examples:
|
|
||||||
- "Source: Company 10-K, FY2024, Page 45, Revenue Note, [SEC EDGAR URL]"
|
|
||||||
- "Source: Company 10-Q, Q2 2025, Exhibit 99.1, [SEC EDGAR URL]"
|
|
||||||
- "Source: Bloomberg Terminal, 8/15/2025, AAPL US Equity"
|
|
||||||
- "Source: FactSet, 8/20/2025, Consensus Estimates Screen"
|
|
||||||
|
|
||||||
# XLSX creation, editing, and analysis
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
A user may ask you to create, edit, or analyze the contents of an .xlsx file. You have different tools and workflows available for different tasks.
|
|
||||||
|
|
||||||
## Important Requirements
|
|
||||||
|
|
||||||
**LibreOffice Required for Formula Recalculation**: You can assume LibreOffice is installed for recalculating formula values using the `scripts/recalc.py` script. The script automatically configures LibreOffice on first run, including in sandboxed environments where Unix sockets are restricted (handled by `scripts/office/soffice.py`)
|
|
||||||
|
|
||||||
## Reading and analyzing data
|
|
||||||
|
|
||||||
### Data analysis with pandas
|
|
||||||
For data analysis, visualization, and basic operations, use **pandas** which provides powerful data manipulation capabilities:
|
|
||||||
|
|
||||||
```python
|
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
# Read Excel
|
|
||||||
df = pd.read_excel('file.xlsx') # Default: first sheet
|
|
||||||
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # All sheets as dict
|
|
||||||
|
|
||||||
# Analyze
|
|
||||||
df.head() # Preview data
|
|
||||||
df.info() # Column info
|
|
||||||
df.describe() # Statistics
|
|
||||||
|
|
||||||
# Write Excel
|
|
||||||
df.to_excel('output.xlsx', index=False)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Excel File Workflows
|
|
||||||
|
|
||||||
## CRITICAL: Use Formulas, Not Hardcoded Values
|
|
||||||
|
|
||||||
**Always use Excel formulas instead of calculating values in Python and hardcoding them.** This ensures the spreadsheet remains dynamic and updateable.
|
|
||||||
|
|
||||||
### ❌ WRONG - Hardcoding Calculated Values
|
|
||||||
```python
|
|
||||||
# Bad: Calculating in Python and hardcoding result
|
|
||||||
total = df['Sales'].sum()
|
|
||||||
sheet['B10'] = total # Hardcodes 5000
|
|
||||||
|
|
||||||
# Bad: Computing growth rate in Python
|
|
||||||
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
|
|
||||||
sheet['C5'] = growth # Hardcodes 0.15
|
|
||||||
|
|
||||||
# Bad: Python calculation for average
|
|
||||||
avg = sum(values) / len(values)
|
|
||||||
sheet['D20'] = avg # Hardcodes 42.5
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ CORRECT - Using Excel Formulas
|
|
||||||
```python
|
|
||||||
# Good: Let Excel calculate the sum
|
|
||||||
sheet['B10'] = '=SUM(B2:B9)'
|
|
||||||
|
|
||||||
# Good: Growth rate as Excel formula
|
|
||||||
sheet['C5'] = '=(C4-C2)/C2'
|
|
||||||
|
|
||||||
# Good: Average using Excel function
|
|
||||||
sheet['D20'] = '=AVERAGE(D2:D19)'
|
|
||||||
```
|
|
||||||
|
|
||||||
This applies to ALL calculations - totals, percentages, ratios, differences, etc. The spreadsheet should be able to recalculate when source data changes.
|
|
||||||
|
|
||||||
## Common Workflow
|
|
||||||
1. **Choose tool**: pandas for data, openpyxl for formulas/formatting
|
|
||||||
2. **Create/Load**: Create new workbook or load existing file
|
|
||||||
3. **Modify**: Add/edit data, formulas, and formatting
|
|
||||||
4. **Save**: Write to file
|
|
||||||
5. **Recalculate formulas (MANDATORY IF USING FORMULAS)**: Use the scripts/recalc.py script
|
|
||||||
```bash
|
|
||||||
python scripts/recalc.py output.xlsx
|
|
||||||
```
|
|
||||||
6. **Verify and fix any errors**:
|
|
||||||
- The script returns JSON with error details
|
|
||||||
- If `status` is `errors_found`, check `error_summary` for specific error types and locations
|
|
||||||
- Fix the identified errors and recalculate again
|
|
||||||
- Common errors to fix:
|
|
||||||
- `#REF!`: Invalid cell references
|
|
||||||
- `#DIV/0!`: Division by zero
|
|
||||||
- `#VALUE!`: Wrong data type in formula
|
|
||||||
- `#NAME?`: Unrecognized formula name
|
|
||||||
|
|
||||||
### Creating new Excel files
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Using openpyxl for formulas and formatting
|
|
||||||
from openpyxl import Workbook
|
|
||||||
from openpyxl.styles import Font, PatternFill, Alignment
|
|
||||||
|
|
||||||
wb = Workbook()
|
|
||||||
sheet = wb.active
|
|
||||||
|
|
||||||
# Add data
|
|
||||||
sheet['A1'] = 'Hello'
|
|
||||||
sheet['B1'] = 'World'
|
|
||||||
sheet.append(['Row', 'of', 'data'])
|
|
||||||
|
|
||||||
# Add formula
|
|
||||||
sheet['B2'] = '=SUM(A1:A10)'
|
|
||||||
|
|
||||||
# Formatting
|
|
||||||
sheet['A1'].font = Font(bold=True, color='FF0000')
|
|
||||||
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
|
|
||||||
sheet['A1'].alignment = Alignment(horizontal='center')
|
|
||||||
|
|
||||||
# Column width
|
|
||||||
sheet.column_dimensions['A'].width = 20
|
|
||||||
|
|
||||||
wb.save('output.xlsx')
|
|
||||||
```
|
|
||||||
|
|
||||||
### Editing existing Excel files
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Using openpyxl to preserve formulas and formatting
|
|
||||||
from openpyxl import load_workbook
|
|
||||||
|
|
||||||
# Load existing file
|
|
||||||
wb = load_workbook('existing.xlsx')
|
|
||||||
sheet = wb.active # or wb['SheetName'] for specific sheet
|
|
||||||
|
|
||||||
# Working with multiple sheets
|
|
||||||
for sheet_name in wb.sheetnames:
|
|
||||||
sheet = wb[sheet_name]
|
|
||||||
print(f"Sheet: {sheet_name}")
|
|
||||||
|
|
||||||
# Modify cells
|
|
||||||
sheet['A1'] = 'New Value'
|
|
||||||
sheet.insert_rows(2) # Insert row at position 2
|
|
||||||
sheet.delete_cols(3) # Delete column 3
|
|
||||||
|
|
||||||
# Add new sheet
|
|
||||||
new_sheet = wb.create_sheet('NewSheet')
|
|
||||||
new_sheet['A1'] = 'Data'
|
|
||||||
|
|
||||||
wb.save('modified.xlsx')
|
|
||||||
```
|
|
||||||
|
|
||||||
## Recalculating formulas
|
|
||||||
|
|
||||||
Excel files created or modified by openpyxl contain formulas as strings but not calculated values. Use the provided `scripts/recalc.py` script to recalculate formulas:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python scripts/recalc.py <excel_file> [timeout_seconds]
|
|
||||||
```
|
|
||||||
|
|
||||||
Example:
|
|
||||||
```bash
|
|
||||||
python scripts/recalc.py output.xlsx 30
|
|
||||||
```
|
|
||||||
|
|
||||||
The script:
|
|
||||||
- Automatically sets up LibreOffice macro on first run
|
|
||||||
- Recalculates all formulas in all sheets
|
|
||||||
- Scans ALL cells for Excel errors (#REF!, #DIV/0!, etc.)
|
|
||||||
- Returns JSON with detailed error locations and counts
|
|
||||||
- Works on both Linux and macOS
|
|
||||||
|
|
||||||
## Formula Verification Checklist
|
|
||||||
|
|
||||||
Quick checks to ensure formulas work correctly:
|
|
||||||
|
|
||||||
### Essential Verification
|
|
||||||
- [ ] **Test 2-3 sample references**: Verify they pull correct values before building full model
|
|
||||||
- [ ] **Column mapping**: Confirm Excel columns match (e.g., column 64 = BL, not BK)
|
|
||||||
- [ ] **Row offset**: Remember Excel rows are 1-indexed (DataFrame row 5 = Excel row 6)
|
|
||||||
|
|
||||||
### Common Pitfalls
|
|
||||||
- [ ] **NaN handling**: Check for null values with `pd.notna()`
|
|
||||||
- [ ] **Far-right columns**: FY data often in columns 50+
|
|
||||||
- [ ] **Multiple matches**: Search all occurrences, not just first
|
|
||||||
- [ ] **Division by zero**: Check denominators before using `/` in formulas (#DIV/0!)
|
|
||||||
- [ ] **Wrong references**: Verify all cell references point to intended cells (#REF!)
|
|
||||||
- [ ] **Cross-sheet references**: Use correct format (Sheet1!A1) for linking sheets
|
|
||||||
|
|
||||||
### Formula Testing Strategy
|
|
||||||
- [ ] **Start small**: Test formulas on 2-3 cells before applying broadly
|
|
||||||
- [ ] **Verify dependencies**: Check all cells referenced in formulas exist
|
|
||||||
- [ ] **Test edge cases**: Include zero, negative, and very large values
|
|
||||||
|
|
||||||
### Interpreting scripts/recalc.py Output
|
|
||||||
The script returns JSON with error details:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"status": "success", // or "errors_found"
|
|
||||||
"total_errors": 0, // Total error count
|
|
||||||
"total_formulas": 42, // Number of formulas in file
|
|
||||||
"error_summary": { // Only present if errors found
|
|
||||||
"#REF!": {
|
|
||||||
"count": 2,
|
|
||||||
"locations": ["Sheet1!B5", "Sheet1!C10"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Best Practices
|
|
||||||
|
|
||||||
### Library Selection
|
|
||||||
- **pandas**: Best for data analysis, bulk operations, and simple data export
|
|
||||||
- **openpyxl**: Best for complex formatting, formulas, and Excel-specific features
|
|
||||||
|
|
||||||
### Working with openpyxl
|
|
||||||
- Cell indices are 1-based (row=1, column=1 refers to cell A1)
|
|
||||||
- Use `data_only=True` to read calculated values: `load_workbook('file.xlsx', data_only=True)`
|
|
||||||
- **Warning**: If opened with `data_only=True` and saved, formulas are replaced with values and permanently lost
|
|
||||||
- For large files: Use `read_only=True` for reading or `write_only=True` for writing
|
|
||||||
- Formulas are preserved but not evaluated - use scripts/recalc.py to update values
|
|
||||||
|
|
||||||
### Working with pandas
|
|
||||||
- Specify data types to avoid inference issues: `pd.read_excel('file.xlsx', dtype={'id': str})`
|
|
||||||
- For large files, read specific columns: `pd.read_excel('file.xlsx', usecols=['A', 'C', 'E'])`
|
|
||||||
- Handle dates properly: `pd.read_excel('file.xlsx', parse_dates=['date_column'])`
|
|
||||||
|
|
||||||
## Code Style Guidelines
|
|
||||||
**IMPORTANT**: When generating Python code for Excel operations:
|
|
||||||
- Write minimal, concise Python code without unnecessary comments
|
|
||||||
- Avoid verbose variable names and redundant operations
|
|
||||||
- Avoid unnecessary print statements
|
|
||||||
|
|
||||||
**For Excel files themselves**:
|
|
||||||
- Add comments to cells with complex formulas or important assumptions
|
|
||||||
- Document data sources for hardcoded values
|
|
||||||
- Include notes for key calculations and model sections
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
"""Merge adjacent runs with identical formatting in DOCX.
|
|
||||||
|
|
||||||
Merges adjacent <w:r> elements that have identical <w:rPr> properties.
|
|
||||||
Works on runs in paragraphs and inside tracked changes (<w:ins>, <w:del>).
|
|
||||||
|
|
||||||
Also:
|
|
||||||
- Removes rsid attributes from runs (revision metadata that doesn't affect rendering)
|
|
||||||
- Removes proofErr elements (spell/grammar markers that block merging)
|
|
||||||
"""
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import defusedxml.minidom
|
|
||||||
|
|
||||||
|
|
||||||
def merge_runs(input_dir: str) -> tuple[int, str]:
|
|
||||||
doc_xml = Path(input_dir) / "word" / "document.xml"
|
|
||||||
|
|
||||||
if not doc_xml.exists():
|
|
||||||
return 0, f"Error: {doc_xml} not found"
|
|
||||||
|
|
||||||
try:
|
|
||||||
dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8"))
|
|
||||||
root = dom.documentElement
|
|
||||||
|
|
||||||
_remove_elements(root, "proofErr")
|
|
||||||
_strip_run_rsid_attrs(root)
|
|
||||||
|
|
||||||
containers = {run.parentNode for run in _find_elements(root, "r")}
|
|
||||||
|
|
||||||
merge_count = 0
|
|
||||||
for container in containers:
|
|
||||||
merge_count += _merge_runs_in(container)
|
|
||||||
|
|
||||||
doc_xml.write_bytes(dom.toxml(encoding="UTF-8"))
|
|
||||||
return merge_count, f"Merged {merge_count} runs"
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return 0, f"Error: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _find_elements(root, tag: str) -> list:
|
|
||||||
results = []
|
|
||||||
|
|
||||||
def traverse(node):
|
|
||||||
if node.nodeType == node.ELEMENT_NODE:
|
|
||||||
name = node.localName or node.tagName
|
|
||||||
if name == tag or name.endswith(f":{tag}"):
|
|
||||||
results.append(node)
|
|
||||||
for child in node.childNodes:
|
|
||||||
traverse(child)
|
|
||||||
|
|
||||||
traverse(root)
|
|
||||||
return results
|
|
||||||
|
|
||||||
|
|
||||||
def _get_child(parent, tag: str):
|
|
||||||
for child in parent.childNodes:
|
|
||||||
if child.nodeType == child.ELEMENT_NODE:
|
|
||||||
name = child.localName or child.tagName
|
|
||||||
if name == tag or name.endswith(f":{tag}"):
|
|
||||||
return child
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def _get_children(parent, tag: str) -> list:
|
|
||||||
results = []
|
|
||||||
for child in parent.childNodes:
|
|
||||||
if child.nodeType == child.ELEMENT_NODE:
|
|
||||||
name = child.localName or child.tagName
|
|
||||||
if name == tag or name.endswith(f":{tag}"):
|
|
||||||
results.append(child)
|
|
||||||
return results
|
|
||||||
|
|
||||||
|
|
||||||
def _is_adjacent(elem1, elem2) -> bool:
|
|
||||||
node = elem1.nextSibling
|
|
||||||
while node:
|
|
||||||
if node == elem2:
|
|
||||||
return True
|
|
||||||
if node.nodeType == node.ELEMENT_NODE:
|
|
||||||
return False
|
|
||||||
if node.nodeType == node.TEXT_NODE and node.data.strip():
|
|
||||||
return False
|
|
||||||
node = node.nextSibling
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _remove_elements(root, tag: str):
|
|
||||||
for elem in _find_elements(root, tag):
|
|
||||||
if elem.parentNode:
|
|
||||||
elem.parentNode.removeChild(elem)
|
|
||||||
|
|
||||||
|
|
||||||
def _strip_run_rsid_attrs(root):
|
|
||||||
for run in _find_elements(root, "r"):
|
|
||||||
for attr in list(run.attributes.values()):
|
|
||||||
if "rsid" in attr.name.lower():
|
|
||||||
run.removeAttribute(attr.name)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _merge_runs_in(container) -> int:
|
|
||||||
merge_count = 0
|
|
||||||
run = _first_child_run(container)
|
|
||||||
|
|
||||||
while run:
|
|
||||||
while True:
|
|
||||||
next_elem = _next_element_sibling(run)
|
|
||||||
if next_elem and _is_run(next_elem) and _can_merge(run, next_elem):
|
|
||||||
_merge_run_content(run, next_elem)
|
|
||||||
container.removeChild(next_elem)
|
|
||||||
merge_count += 1
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
_consolidate_text(run)
|
|
||||||
run = _next_sibling_run(run)
|
|
||||||
|
|
||||||
return merge_count
|
|
||||||
|
|
||||||
|
|
||||||
def _first_child_run(container):
|
|
||||||
for child in container.childNodes:
|
|
||||||
if child.nodeType == child.ELEMENT_NODE and _is_run(child):
|
|
||||||
return child
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def _next_element_sibling(node):
|
|
||||||
sibling = node.nextSibling
|
|
||||||
while sibling:
|
|
||||||
if sibling.nodeType == sibling.ELEMENT_NODE:
|
|
||||||
return sibling
|
|
||||||
sibling = sibling.nextSibling
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def _next_sibling_run(node):
|
|
||||||
sibling = node.nextSibling
|
|
||||||
while sibling:
|
|
||||||
if sibling.nodeType == sibling.ELEMENT_NODE:
|
|
||||||
if _is_run(sibling):
|
|
||||||
return sibling
|
|
||||||
sibling = sibling.nextSibling
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def _is_run(node) -> bool:
|
|
||||||
name = node.localName or node.tagName
|
|
||||||
return name == "r" or name.endswith(":r")
|
|
||||||
|
|
||||||
|
|
||||||
def _can_merge(run1, run2) -> bool:
|
|
||||||
rpr1 = _get_child(run1, "rPr")
|
|
||||||
rpr2 = _get_child(run2, "rPr")
|
|
||||||
|
|
||||||
if (rpr1 is None) != (rpr2 is None):
|
|
||||||
return False
|
|
||||||
if rpr1 is None:
|
|
||||||
return True
|
|
||||||
return rpr1.toxml() == rpr2.toxml()
|
|
||||||
|
|
||||||
|
|
||||||
def _merge_run_content(target, source):
|
|
||||||
for child in list(source.childNodes):
|
|
||||||
if child.nodeType == child.ELEMENT_NODE:
|
|
||||||
name = child.localName or child.tagName
|
|
||||||
if name != "rPr" and not name.endswith(":rPr"):
|
|
||||||
target.appendChild(child)
|
|
||||||
|
|
||||||
|
|
||||||
def _consolidate_text(run):
|
|
||||||
t_elements = _get_children(run, "t")
|
|
||||||
|
|
||||||
for i in range(len(t_elements) - 1, 0, -1):
|
|
||||||
curr, prev = t_elements[i], t_elements[i - 1]
|
|
||||||
|
|
||||||
if _is_adjacent(prev, curr):
|
|
||||||
prev_text = prev.firstChild.data if prev.firstChild else ""
|
|
||||||
curr_text = curr.firstChild.data if curr.firstChild else ""
|
|
||||||
merged = prev_text + curr_text
|
|
||||||
|
|
||||||
if prev.firstChild:
|
|
||||||
prev.firstChild.data = merged
|
|
||||||
else:
|
|
||||||
prev.appendChild(run.ownerDocument.createTextNode(merged))
|
|
||||||
|
|
||||||
if merged.startswith(" ") or merged.endswith(" "):
|
|
||||||
prev.setAttribute("xml:space", "preserve")
|
|
||||||
elif prev.hasAttribute("xml:space"):
|
|
||||||
prev.removeAttribute("xml:space")
|
|
||||||
|
|
||||||
run.removeChild(curr)
|
|
||||||
@@ -1,197 +0,0 @@
|
|||||||
"""Simplify tracked changes by merging adjacent w:ins or w:del elements.
|
|
||||||
|
|
||||||
Merges adjacent <w:ins> elements from the same author into a single element.
|
|
||||||
Same for <w:del> elements. This makes heavily-redlined documents easier to
|
|
||||||
work with by reducing the number of tracked change wrappers.
|
|
||||||
|
|
||||||
Rules:
|
|
||||||
- Only merges w:ins with w:ins, w:del with w:del (same element type)
|
|
||||||
- Only merges if same author (ignores timestamp differences)
|
|
||||||
- Only merges if truly adjacent (only whitespace between them)
|
|
||||||
"""
|
|
||||||
|
|
||||||
import xml.etree.ElementTree as ET
|
|
||||||
import zipfile
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import defusedxml.minidom
|
|
||||||
|
|
||||||
WORD_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
||||||
|
|
||||||
|
|
||||||
def simplify_redlines(input_dir: str) -> tuple[int, str]:
|
|
||||||
doc_xml = Path(input_dir) / "word" / "document.xml"
|
|
||||||
|
|
||||||
if not doc_xml.exists():
|
|
||||||
return 0, f"Error: {doc_xml} not found"
|
|
||||||
|
|
||||||
try:
|
|
||||||
dom = defusedxml.minidom.parseString(doc_xml.read_text(encoding="utf-8"))
|
|
||||||
root = dom.documentElement
|
|
||||||
|
|
||||||
merge_count = 0
|
|
||||||
|
|
||||||
containers = _find_elements(root, "p") + _find_elements(root, "tc")
|
|
||||||
|
|
||||||
for container in containers:
|
|
||||||
merge_count += _merge_tracked_changes_in(container, "ins")
|
|
||||||
merge_count += _merge_tracked_changes_in(container, "del")
|
|
||||||
|
|
||||||
doc_xml.write_bytes(dom.toxml(encoding="UTF-8"))
|
|
||||||
return merge_count, f"Simplified {merge_count} tracked changes"
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return 0, f"Error: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
def _merge_tracked_changes_in(container, tag: str) -> int:
|
|
||||||
merge_count = 0
|
|
||||||
|
|
||||||
tracked = [
|
|
||||||
child
|
|
||||||
for child in container.childNodes
|
|
||||||
if child.nodeType == child.ELEMENT_NODE and _is_element(child, tag)
|
|
||||||
]
|
|
||||||
|
|
||||||
if len(tracked) < 2:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
while i < len(tracked) - 1:
|
|
||||||
curr = tracked[i]
|
|
||||||
next_elem = tracked[i + 1]
|
|
||||||
|
|
||||||
if _can_merge_tracked(curr, next_elem):
|
|
||||||
_merge_tracked_content(curr, next_elem)
|
|
||||||
container.removeChild(next_elem)
|
|
||||||
tracked.pop(i + 1)
|
|
||||||
merge_count += 1
|
|
||||||
else:
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
return merge_count
|
|
||||||
|
|
||||||
|
|
||||||
def _is_element(node, tag: str) -> bool:
|
|
||||||
name = node.localName or node.tagName
|
|
||||||
return name == tag or name.endswith(f":{tag}")
|
|
||||||
|
|
||||||
|
|
||||||
def _get_author(elem) -> str:
|
|
||||||
author = elem.getAttribute("w:author")
|
|
||||||
if not author:
|
|
||||||
for attr in elem.attributes.values():
|
|
||||||
if attr.localName == "author" or attr.name.endswith(":author"):
|
|
||||||
return attr.value
|
|
||||||
return author
|
|
||||||
|
|
||||||
|
|
||||||
def _can_merge_tracked(elem1, elem2) -> bool:
|
|
||||||
if _get_author(elem1) != _get_author(elem2):
|
|
||||||
return False
|
|
||||||
|
|
||||||
node = elem1.nextSibling
|
|
||||||
while node and node != elem2:
|
|
||||||
if node.nodeType == node.ELEMENT_NODE:
|
|
||||||
return False
|
|
||||||
if node.nodeType == node.TEXT_NODE and node.data.strip():
|
|
||||||
return False
|
|
||||||
node = node.nextSibling
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def _merge_tracked_content(target, source):
|
|
||||||
while source.firstChild:
|
|
||||||
child = source.firstChild
|
|
||||||
source.removeChild(child)
|
|
||||||
target.appendChild(child)
|
|
||||||
|
|
||||||
|
|
||||||
def _find_elements(root, tag: str) -> list:
|
|
||||||
results = []
|
|
||||||
|
|
||||||
def traverse(node):
|
|
||||||
if node.nodeType == node.ELEMENT_NODE:
|
|
||||||
name = node.localName or node.tagName
|
|
||||||
if name == tag or name.endswith(f":{tag}"):
|
|
||||||
results.append(node)
|
|
||||||
for child in node.childNodes:
|
|
||||||
traverse(child)
|
|
||||||
|
|
||||||
traverse(root)
|
|
||||||
return results
|
|
||||||
|
|
||||||
|
|
||||||
def get_tracked_change_authors(doc_xml_path: Path) -> dict[str, int]:
|
|
||||||
if not doc_xml_path.exists():
|
|
||||||
return {}
|
|
||||||
|
|
||||||
try:
|
|
||||||
tree = ET.parse(doc_xml_path)
|
|
||||||
root = tree.getroot()
|
|
||||||
except ET.ParseError:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
namespaces = {"w": WORD_NS}
|
|
||||||
author_attr = f"{{{WORD_NS}}}author"
|
|
||||||
|
|
||||||
authors: dict[str, int] = {}
|
|
||||||
for tag in ["ins", "del"]:
|
|
||||||
for elem in root.findall(f".//w:{tag}", namespaces):
|
|
||||||
author = elem.get(author_attr)
|
|
||||||
if author:
|
|
||||||
authors[author] = authors.get(author, 0) + 1
|
|
||||||
|
|
||||||
return authors
|
|
||||||
|
|
||||||
|
|
||||||
def _get_authors_from_docx(docx_path: Path) -> dict[str, int]:
|
|
||||||
try:
|
|
||||||
with zipfile.ZipFile(docx_path, "r") as zf:
|
|
||||||
if "word/document.xml" not in zf.namelist():
|
|
||||||
return {}
|
|
||||||
with zf.open("word/document.xml") as f:
|
|
||||||
tree = ET.parse(f)
|
|
||||||
root = tree.getroot()
|
|
||||||
|
|
||||||
namespaces = {"w": WORD_NS}
|
|
||||||
author_attr = f"{{{WORD_NS}}}author"
|
|
||||||
|
|
||||||
authors: dict[str, int] = {}
|
|
||||||
for tag in ["ins", "del"]:
|
|
||||||
for elem in root.findall(f".//w:{tag}", namespaces):
|
|
||||||
author = elem.get(author_attr)
|
|
||||||
if author:
|
|
||||||
authors[author] = authors.get(author, 0) + 1
|
|
||||||
return authors
|
|
||||||
except (zipfile.BadZipFile, ET.ParseError):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
def infer_author(modified_dir: Path, original_docx: Path, default: str = "Claude") -> str:
|
|
||||||
modified_xml = modified_dir / "word" / "document.xml"
|
|
||||||
modified_authors = get_tracked_change_authors(modified_xml)
|
|
||||||
|
|
||||||
if not modified_authors:
|
|
||||||
return default
|
|
||||||
|
|
||||||
original_authors = _get_authors_from_docx(original_docx)
|
|
||||||
|
|
||||||
new_changes: dict[str, int] = {}
|
|
||||||
for author, count in modified_authors.items():
|
|
||||||
original_count = original_authors.get(author, 0)
|
|
||||||
diff = count - original_count
|
|
||||||
if diff > 0:
|
|
||||||
new_changes[author] = diff
|
|
||||||
|
|
||||||
if not new_changes:
|
|
||||||
return default
|
|
||||||
|
|
||||||
if len(new_changes) == 1:
|
|
||||||
return next(iter(new_changes))
|
|
||||||
|
|
||||||
raise ValueError(
|
|
||||||
f"Multiple authors added new changes: {new_changes}. "
|
|
||||||
"Cannot infer which author to validate."
|
|
||||||
)
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
"""Pack a directory into a DOCX, PPTX, or XLSX file.
|
|
||||||
|
|
||||||
Validates with auto-repair, condenses XML formatting, and creates the Office file.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
python pack.py <input_directory> <output_file> [--original <file>] [--validate true|false]
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
python pack.py unpacked/ output.docx --original input.docx
|
|
||||||
python pack.py unpacked/ output.pptx --validate false
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import sys
|
|
||||||
import shutil
|
|
||||||
import tempfile
|
|
||||||
import zipfile
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import defusedxml.minidom
|
|
||||||
|
|
||||||
from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
|
|
||||||
|
|
||||||
def pack(
|
|
||||||
input_directory: str,
|
|
||||||
output_file: str,
|
|
||||||
original_file: str | None = None,
|
|
||||||
validate: bool = True,
|
|
||||||
infer_author_func=None,
|
|
||||||
) -> tuple[None, str]:
|
|
||||||
input_dir = Path(input_directory)
|
|
||||||
output_path = Path(output_file)
|
|
||||||
suffix = output_path.suffix.lower()
|
|
||||||
|
|
||||||
if not input_dir.is_dir():
|
|
||||||
return None, f"Error: {input_dir} is not a directory"
|
|
||||||
|
|
||||||
if suffix not in {".docx", ".pptx", ".xlsx"}:
|
|
||||||
return None, f"Error: {output_file} must be a .docx, .pptx, or .xlsx file"
|
|
||||||
|
|
||||||
if validate and original_file:
|
|
||||||
original_path = Path(original_file)
|
|
||||||
if original_path.exists():
|
|
||||||
success, output = _run_validation(
|
|
||||||
input_dir, original_path, suffix, infer_author_func
|
|
||||||
)
|
|
||||||
if output:
|
|
||||||
print(output)
|
|
||||||
if not success:
|
|
||||||
return None, f"Error: Validation failed for {input_dir}"
|
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
|
||||||
temp_content_dir = Path(temp_dir) / "content"
|
|
||||||
shutil.copytree(input_dir, temp_content_dir)
|
|
||||||
|
|
||||||
for pattern in ["*.xml", "*.rels"]:
|
|
||||||
for xml_file in temp_content_dir.rglob(pattern):
|
|
||||||
_condense_xml(xml_file)
|
|
||||||
|
|
||||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
with zipfile.ZipFile(output_path, "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))
|
|
||||||
|
|
||||||
return None, f"Successfully packed {input_dir} to {output_file}"
|
|
||||||
|
|
||||||
|
|
||||||
def _run_validation(
|
|
||||||
unpacked_dir: Path,
|
|
||||||
original_file: Path,
|
|
||||||
suffix: str,
|
|
||||||
infer_author_func=None,
|
|
||||||
) -> tuple[bool, str | None]:
|
|
||||||
output_lines = []
|
|
||||||
validators = []
|
|
||||||
|
|
||||||
if suffix == ".docx":
|
|
||||||
author = "Claude"
|
|
||||||
if infer_author_func:
|
|
||||||
try:
|
|
||||||
author = infer_author_func(unpacked_dir, original_file)
|
|
||||||
except ValueError as e:
|
|
||||||
print(f"Warning: {e} Using default author 'Claude'.", file=sys.stderr)
|
|
||||||
|
|
||||||
validators = [
|
|
||||||
DOCXSchemaValidator(unpacked_dir, original_file),
|
|
||||||
RedliningValidator(unpacked_dir, original_file, author=author),
|
|
||||||
]
|
|
||||||
elif suffix == ".pptx":
|
|
||||||
validators = [PPTXSchemaValidator(unpacked_dir, original_file)]
|
|
||||||
|
|
||||||
if not validators:
|
|
||||||
return True, None
|
|
||||||
|
|
||||||
total_repairs = sum(v.repair() for v in validators)
|
|
||||||
if total_repairs:
|
|
||||||
output_lines.append(f"Auto-repaired {total_repairs} issue(s)")
|
|
||||||
|
|
||||||
success = all(v.validate() for v in validators)
|
|
||||||
|
|
||||||
if success:
|
|
||||||
output_lines.append("All validations PASSED!")
|
|
||||||
|
|
||||||
return success, "\n".join(output_lines) if output_lines else None
|
|
||||||
|
|
||||||
|
|
||||||
def _condense_xml(xml_file: Path) -> None:
|
|
||||||
try:
|
|
||||||
with open(xml_file, encoding="utf-8") as f:
|
|
||||||
dom = defusedxml.minidom.parse(f)
|
|
||||||
|
|
||||||
for element in dom.getElementsByTagName("*"):
|
|
||||||
if element.tagName.endswith(":t"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
xml_file.write_bytes(dom.toxml(encoding="UTF-8"))
|
|
||||||
except Exception as e:
|
|
||||||
print(f"ERROR: Failed to parse {xml_file.name}: {e}", file=sys.stderr)
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="Pack a directory into a DOCX, PPTX, or XLSX 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(
|
|
||||||
"--original",
|
|
||||||
help="Original file for validation comparison",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--validate",
|
|
||||||
type=lambda x: x.lower() == "true",
|
|
||||||
default=True,
|
|
||||||
metavar="true|false",
|
|
||||||
help="Run validation with auto-repair (default: true)",
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
_, message = pack(
|
|
||||||
args.input_directory,
|
|
||||||
args.output_file,
|
|
||||||
original_file=args.original,
|
|
||||||
validate=args.validate,
|
|
||||||
)
|
|
||||||
print(message)
|
|
||||||
|
|
||||||
if "Error" in message:
|
|
||||||
sys.exit(1)
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,146 +0,0 @@
|
|||||||
<?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>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +0,0 @@
|
|||||||
<?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>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,23 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,287 +0,0 @@
|
|||||||
<?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>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,28 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,582 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?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>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,570 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,509 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
<?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>
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,116 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,560 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<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>
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
"""
|
|
||||||
Helper for running LibreOffice (soffice) in environments where AF_UNIX
|
|
||||||
sockets may be blocked (e.g., sandboxed VMs). Detects the restriction
|
|
||||||
at runtime and applies an LD_PRELOAD shim if needed.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
from office.soffice import run_soffice, get_soffice_env
|
|
||||||
|
|
||||||
# Option 1 – run soffice directly
|
|
||||||
result = run_soffice(["--headless", "--convert-to", "pdf", "input.docx"])
|
|
||||||
|
|
||||||
# Option 2 – get env dict for your own subprocess calls
|
|
||||||
env = get_soffice_env()
|
|
||||||
subprocess.run(["soffice", ...], env=env)
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import socket
|
|
||||||
import subprocess
|
|
||||||
import tempfile
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
def get_soffice_env() -> dict:
|
|
||||||
env = os.environ.copy()
|
|
||||||
env["SAL_USE_VCLPLUGIN"] = "svp"
|
|
||||||
|
|
||||||
if _needs_shim():
|
|
||||||
shim = _ensure_shim()
|
|
||||||
env["LD_PRELOAD"] = str(shim)
|
|
||||||
|
|
||||||
return env
|
|
||||||
|
|
||||||
|
|
||||||
def run_soffice(args: list[str], **kwargs) -> subprocess.CompletedProcess:
|
|
||||||
env = get_soffice_env()
|
|
||||||
return subprocess.run(["soffice"] + args, env=env, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_SHIM_SO = Path(tempfile.gettempdir()) / "lo_socket_shim.so"
|
|
||||||
|
|
||||||
|
|
||||||
def _needs_shim() -> bool:
|
|
||||||
try:
|
|
||||||
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
||||||
s.close()
|
|
||||||
return False
|
|
||||||
except OSError:
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def _ensure_shim() -> Path:
|
|
||||||
if _SHIM_SO.exists():
|
|
||||||
return _SHIM_SO
|
|
||||||
|
|
||||||
src = Path(tempfile.gettempdir()) / "lo_socket_shim.c"
|
|
||||||
src.write_text(_SHIM_SOURCE)
|
|
||||||
subprocess.run(
|
|
||||||
["gcc", "-shared", "-fPIC", "-o", str(_SHIM_SO), str(src), "-ldl"],
|
|
||||||
check=True,
|
|
||||||
capture_output=True,
|
|
||||||
)
|
|
||||||
src.unlink()
|
|
||||||
return _SHIM_SO
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_SHIM_SOURCE = r"""
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static int (*real_socket)(int, int, int);
|
|
||||||
static int (*real_socketpair)(int, int, int, int[2]);
|
|
||||||
static int (*real_listen)(int, int);
|
|
||||||
static int (*real_accept)(int, struct sockaddr *, socklen_t *);
|
|
||||||
static int (*real_close)(int);
|
|
||||||
static int (*real_read)(int, void *, size_t);
|
|
||||||
|
|
||||||
/* Per-FD bookkeeping (FDs >= 1024 are passed through unshimmed). */
|
|
||||||
static int is_shimmed[1024];
|
|
||||||
static int peer_of[1024];
|
|
||||||
static int wake_r[1024]; /* accept() blocks reading this */
|
|
||||||
static int wake_w[1024]; /* close() writes to this */
|
|
||||||
static int listener_fd = -1; /* FD that received listen() */
|
|
||||||
|
|
||||||
__attribute__((constructor))
|
|
||||||
static void init(void) {
|
|
||||||
real_socket = dlsym(RTLD_NEXT, "socket");
|
|
||||||
real_socketpair = dlsym(RTLD_NEXT, "socketpair");
|
|
||||||
real_listen = dlsym(RTLD_NEXT, "listen");
|
|
||||||
real_accept = dlsym(RTLD_NEXT, "accept");
|
|
||||||
real_close = dlsym(RTLD_NEXT, "close");
|
|
||||||
real_read = dlsym(RTLD_NEXT, "read");
|
|
||||||
for (int i = 0; i < 1024; i++) {
|
|
||||||
peer_of[i] = -1;
|
|
||||||
wake_r[i] = -1;
|
|
||||||
wake_w[i] = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- socket ---------------------------------------------------------- */
|
|
||||||
int socket(int domain, int type, int protocol) {
|
|
||||||
if (domain == AF_UNIX) {
|
|
||||||
int fd = real_socket(domain, type, protocol);
|
|
||||||
if (fd >= 0) return fd;
|
|
||||||
/* socket(AF_UNIX) blocked – fall back to socketpair(). */
|
|
||||||
int sv[2];
|
|
||||||
if (real_socketpair(domain, type, protocol, sv) == 0) {
|
|
||||||
if (sv[0] >= 0 && sv[0] < 1024) {
|
|
||||||
is_shimmed[sv[0]] = 1;
|
|
||||||
peer_of[sv[0]] = sv[1];
|
|
||||||
int wp[2];
|
|
||||||
if (pipe(wp) == 0) {
|
|
||||||
wake_r[sv[0]] = wp[0];
|
|
||||||
wake_w[sv[0]] = wp[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sv[0];
|
|
||||||
}
|
|
||||||
errno = EPERM;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return real_socket(domain, type, protocol);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- listen ---------------------------------------------------------- */
|
|
||||||
int listen(int sockfd, int backlog) {
|
|
||||||
if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) {
|
|
||||||
listener_fd = sockfd;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return real_listen(sockfd, backlog);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- accept ---------------------------------------------------------- */
|
|
||||||
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
|
|
||||||
if (sockfd >= 0 && sockfd < 1024 && is_shimmed[sockfd]) {
|
|
||||||
/* Block until close() writes to the wake pipe. */
|
|
||||||
if (wake_r[sockfd] >= 0) {
|
|
||||||
char buf;
|
|
||||||
real_read(wake_r[sockfd], &buf, 1);
|
|
||||||
}
|
|
||||||
errno = ECONNABORTED;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return real_accept(sockfd, addr, addrlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- close ----------------------------------------------------------- */
|
|
||||||
int close(int fd) {
|
|
||||||
if (fd >= 0 && fd < 1024 && is_shimmed[fd]) {
|
|
||||||
int was_listener = (fd == listener_fd);
|
|
||||||
is_shimmed[fd] = 0;
|
|
||||||
|
|
||||||
if (wake_w[fd] >= 0) { /* unblock accept() */
|
|
||||||
char c = 0;
|
|
||||||
write(wake_w[fd], &c, 1);
|
|
||||||
real_close(wake_w[fd]);
|
|
||||||
wake_w[fd] = -1;
|
|
||||||
}
|
|
||||||
if (wake_r[fd] >= 0) { real_close(wake_r[fd]); wake_r[fd] = -1; }
|
|
||||||
if (peer_of[fd] >= 0) { real_close(peer_of[fd]); peer_of[fd] = -1; }
|
|
||||||
|
|
||||||
if (was_listener)
|
|
||||||
_exit(0); /* conversion done – exit */
|
|
||||||
}
|
|
||||||
return real_close(fd);
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import sys
|
|
||||||
result = run_soffice(sys.argv[1:])
|
|
||||||
sys.exit(result.returncode)
|
|
||||||
@@ -1,132 +0,0 @@
|
|||||||
"""Unpack Office files (DOCX, PPTX, XLSX) for editing.
|
|
||||||
|
|
||||||
Extracts the ZIP archive, pretty-prints XML files, and optionally:
|
|
||||||
- Merges adjacent runs with identical formatting (DOCX only)
|
|
||||||
- Simplifies adjacent tracked changes from same author (DOCX only)
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
python unpack.py <office_file> <output_dir> [options]
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
python unpack.py document.docx unpacked/
|
|
||||||
python unpack.py presentation.pptx unpacked/
|
|
||||||
python unpack.py document.docx unpacked/ --merge-runs false
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import sys
|
|
||||||
import zipfile
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import defusedxml.minidom
|
|
||||||
|
|
||||||
from helpers.merge_runs import merge_runs as do_merge_runs
|
|
||||||
from helpers.simplify_redlines import simplify_redlines as do_simplify_redlines
|
|
||||||
|
|
||||||
SMART_QUOTE_REPLACEMENTS = {
|
|
||||||
"\u201c": "“",
|
|
||||||
"\u201d": "”",
|
|
||||||
"\u2018": "‘",
|
|
||||||
"\u2019": "’",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def unpack(
|
|
||||||
input_file: str,
|
|
||||||
output_directory: str,
|
|
||||||
merge_runs: bool = True,
|
|
||||||
simplify_redlines: bool = True,
|
|
||||||
) -> tuple[None, str]:
|
|
||||||
input_path = Path(input_file)
|
|
||||||
output_path = Path(output_directory)
|
|
||||||
suffix = input_path.suffix.lower()
|
|
||||||
|
|
||||||
if not input_path.exists():
|
|
||||||
return None, f"Error: {input_file} does not exist"
|
|
||||||
|
|
||||||
if suffix not in {".docx", ".pptx", ".xlsx"}:
|
|
||||||
return None, f"Error: {input_file} must be a .docx, .pptx, or .xlsx file"
|
|
||||||
|
|
||||||
try:
|
|
||||||
output_path.mkdir(parents=True, exist_ok=True)
|
|
||||||
|
|
||||||
with zipfile.ZipFile(input_path, "r") as zf:
|
|
||||||
zf.extractall(output_path)
|
|
||||||
|
|
||||||
xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels"))
|
|
||||||
for xml_file in xml_files:
|
|
||||||
_pretty_print_xml(xml_file)
|
|
||||||
|
|
||||||
message = f"Unpacked {input_file} ({len(xml_files)} XML files)"
|
|
||||||
|
|
||||||
if suffix == ".docx":
|
|
||||||
if simplify_redlines:
|
|
||||||
simplify_count, _ = do_simplify_redlines(str(output_path))
|
|
||||||
message += f", simplified {simplify_count} tracked changes"
|
|
||||||
|
|
||||||
if merge_runs:
|
|
||||||
merge_count, _ = do_merge_runs(str(output_path))
|
|
||||||
message += f", merged {merge_count} runs"
|
|
||||||
|
|
||||||
for xml_file in xml_files:
|
|
||||||
_escape_smart_quotes(xml_file)
|
|
||||||
|
|
||||||
return None, message
|
|
||||||
|
|
||||||
except zipfile.BadZipFile:
|
|
||||||
return None, f"Error: {input_file} is not a valid Office file"
|
|
||||||
except Exception as e:
|
|
||||||
return None, f"Error unpacking: {e}"
|
|
||||||
|
|
||||||
|
|
||||||
def _pretty_print_xml(xml_file: Path) -> None:
|
|
||||||
try:
|
|
||||||
content = xml_file.read_text(encoding="utf-8")
|
|
||||||
dom = defusedxml.minidom.parseString(content)
|
|
||||||
xml_file.write_bytes(dom.toprettyxml(indent=" ", encoding="utf-8"))
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def _escape_smart_quotes(xml_file: Path) -> None:
|
|
||||||
try:
|
|
||||||
content = xml_file.read_text(encoding="utf-8")
|
|
||||||
for char, entity in SMART_QUOTE_REPLACEMENTS.items():
|
|
||||||
content = content.replace(char, entity)
|
|
||||||
xml_file.write_text(content, encoding="utf-8")
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="Unpack an Office file (DOCX, PPTX, XLSX) for editing"
|
|
||||||
)
|
|
||||||
parser.add_argument("input_file", help="Office file to unpack")
|
|
||||||
parser.add_argument("output_directory", help="Output directory")
|
|
||||||
parser.add_argument(
|
|
||||||
"--merge-runs",
|
|
||||||
type=lambda x: x.lower() == "true",
|
|
||||||
default=True,
|
|
||||||
metavar="true|false",
|
|
||||||
help="Merge adjacent runs with identical formatting (DOCX only, default: true)",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--simplify-redlines",
|
|
||||||
type=lambda x: x.lower() == "true",
|
|
||||||
default=True,
|
|
||||||
metavar="true|false",
|
|
||||||
help="Merge adjacent tracked changes from same author (DOCX only, default: true)",
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
_, message = unpack(
|
|
||||||
args.input_file,
|
|
||||||
args.output_directory,
|
|
||||||
merge_runs=args.merge_runs,
|
|
||||||
simplify_redlines=args.simplify_redlines,
|
|
||||||
)
|
|
||||||
print(message)
|
|
||||||
|
|
||||||
if "Error" in message:
|
|
||||||
sys.exit(1)
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
"""
|
|
||||||
Command line tool to validate Office document XML files against XSD schemas and tracked changes.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
python validate.py <path> [--original <original_file>] [--auto-repair] [--author NAME]
|
|
||||||
|
|
||||||
The first argument can be either:
|
|
||||||
- An unpacked directory containing the Office document XML files
|
|
||||||
- A packed Office file (.docx/.pptx/.xlsx) which will be unpacked to a temp directory
|
|
||||||
|
|
||||||
Auto-repair fixes:
|
|
||||||
- paraId/durableId values that exceed OOXML limits
|
|
||||||
- Missing xml:space="preserve" on w:t elements with whitespace
|
|
||||||
"""
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import sys
|
|
||||||
import tempfile
|
|
||||||
import zipfile
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(description="Validate Office document XML files")
|
|
||||||
parser.add_argument(
|
|
||||||
"path",
|
|
||||||
help="Path to unpacked directory or packed Office file (.docx/.pptx/.xlsx)",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--original",
|
|
||||||
required=False,
|
|
||||||
default=None,
|
|
||||||
help="Path to original file (.docx/.pptx/.xlsx). If omitted, all XSD errors are reported and redlining validation is skipped.",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"-v",
|
|
||||||
"--verbose",
|
|
||||||
action="store_true",
|
|
||||||
help="Enable verbose output",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--auto-repair",
|
|
||||||
action="store_true",
|
|
||||||
help="Automatically repair common issues (hex IDs, whitespace preservation)",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--author",
|
|
||||||
default="Claude",
|
|
||||||
help="Author name for redlining validation (default: Claude)",
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
path = Path(args.path)
|
|
||||||
assert path.exists(), f"Error: {path} does not exist"
|
|
||||||
|
|
||||||
original_file = None
|
|
||||||
if args.original:
|
|
||||||
original_file = Path(args.original)
|
|
||||||
assert original_file.is_file(), f"Error: {original_file} is not a file"
|
|
||||||
assert original_file.suffix.lower() in [".docx", ".pptx", ".xlsx"], (
|
|
||||||
f"Error: {original_file} must be a .docx, .pptx, or .xlsx file"
|
|
||||||
)
|
|
||||||
|
|
||||||
file_extension = (original_file or path).suffix.lower()
|
|
||||||
assert file_extension in [".docx", ".pptx", ".xlsx"], (
|
|
||||||
f"Error: Cannot determine file type from {path}. Use --original or provide a .docx/.pptx/.xlsx file."
|
|
||||||
)
|
|
||||||
|
|
||||||
if path.is_file() and path.suffix.lower() in [".docx", ".pptx", ".xlsx"]:
|
|
||||||
temp_dir = tempfile.mkdtemp()
|
|
||||||
with zipfile.ZipFile(path, "r") as zf:
|
|
||||||
zf.extractall(temp_dir)
|
|
||||||
unpacked_dir = Path(temp_dir)
|
|
||||||
else:
|
|
||||||
assert path.is_dir(), f"Error: {path} is not a directory or Office file"
|
|
||||||
unpacked_dir = path
|
|
||||||
|
|
||||||
match file_extension:
|
|
||||||
case ".docx":
|
|
||||||
validators = [
|
|
||||||
DOCXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose),
|
|
||||||
]
|
|
||||||
if original_file:
|
|
||||||
validators.append(
|
|
||||||
RedliningValidator(unpacked_dir, original_file, verbose=args.verbose, author=args.author)
|
|
||||||
)
|
|
||||||
case ".pptx":
|
|
||||||
validators = [
|
|
||||||
PPTXSchemaValidator(unpacked_dir, original_file, verbose=args.verbose),
|
|
||||||
]
|
|
||||||
case _:
|
|
||||||
print(f"Error: Validation not supported for file type {file_extension}")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if args.auto_repair:
|
|
||||||
total_repairs = sum(v.repair() for v in validators)
|
|
||||||
if total_repairs:
|
|
||||||
print(f"Auto-repaired {total_repairs} issue(s)")
|
|
||||||
|
|
||||||
success = all(v.validate() for v in validators)
|
|
||||||
|
|
||||||
if success:
|
|
||||||
print("All validations PASSED!")
|
|
||||||
|
|
||||||
sys.exit(0 if success else 1)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,847 +0,0 @@
|
|||||||
"""
|
|
||||||
Base validator with common validation logic for document files.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import re
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import defusedxml.minidom
|
|
||||||
import lxml.etree
|
|
||||||
|
|
||||||
|
|
||||||
class BaseSchemaValidator:
|
|
||||||
|
|
||||||
IGNORED_VALIDATION_ERRORS = [
|
|
||||||
"hyphenationZone",
|
|
||||||
"purl.org/dc/terms",
|
|
||||||
]
|
|
||||||
|
|
||||||
UNIQUE_ID_REQUIREMENTS = {
|
|
||||||
"comment": ("id", "file"),
|
|
||||||
"commentrangestart": ("id", "file"),
|
|
||||||
"commentrangeend": ("id", "file"),
|
|
||||||
"bookmarkstart": ("id", "file"),
|
|
||||||
"bookmarkend": ("id", "file"),
|
|
||||||
"sldid": ("id", "file"),
|
|
||||||
"sldmasterid": ("id", "global"),
|
|
||||||
"sldlayoutid": ("id", "global"),
|
|
||||||
"cm": ("authorid", "file"),
|
|
||||||
"sheet": ("sheetid", "file"),
|
|
||||||
"definedname": ("id", "file"),
|
|
||||||
"cxnsp": ("id", "file"),
|
|
||||||
"sp": ("id", "file"),
|
|
||||||
"pic": ("id", "file"),
|
|
||||||
"grpsp": ("id", "file"),
|
|
||||||
}
|
|
||||||
|
|
||||||
EXCLUDED_ID_CONTAINERS = {
|
|
||||||
"sectionlst",
|
|
||||||
}
|
|
||||||
|
|
||||||
ELEMENT_RELATIONSHIP_TYPES = {}
|
|
||||||
|
|
||||||
SCHEMA_MAPPINGS = {
|
|
||||||
"word": "ISO-IEC29500-4_2016/wml.xsd",
|
|
||||||
"ppt": "ISO-IEC29500-4_2016/pml.xsd",
|
|
||||||
"xl": "ISO-IEC29500-4_2016/sml.xsd",
|
|
||||||
"[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",
|
|
||||||
"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": "ISO-IEC29500-4_2016/dml-chart.xsd",
|
|
||||||
"theme": "ISO-IEC29500-4_2016/dml-main.xsd",
|
|
||||||
"drawing": "ISO-IEC29500-4_2016/dml-main.xsd",
|
|
||||||
}
|
|
||||||
|
|
||||||
MC_NAMESPACE = "http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
|
|
||||||
|
|
||||||
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"
|
|
||||||
)
|
|
||||||
|
|
||||||
MAIN_CONTENT_FOLDERS = {"word", "ppt", "xl"}
|
|
||||||
|
|
||||||
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=None, verbose=False):
|
|
||||||
self.unpacked_dir = Path(unpacked_dir).resolve()
|
|
||||||
self.original_file = Path(original_file) if original_file else None
|
|
||||||
self.verbose = verbose
|
|
||||||
|
|
||||||
self.schemas_dir = Path(__file__).parent.parent / "schemas"
|
|
||||||
|
|
||||||
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):
|
|
||||||
raise NotImplementedError("Subclasses must implement the validate method")
|
|
||||||
|
|
||||||
def repair(self) -> int:
|
|
||||||
return self.repair_whitespace_preservation()
|
|
||||||
|
|
||||||
def repair_whitespace_preservation(self) -> int:
|
|
||||||
repairs = 0
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
try:
|
|
||||||
content = xml_file.read_text(encoding="utf-8")
|
|
||||||
dom = defusedxml.minidom.parseString(content)
|
|
||||||
modified = False
|
|
||||||
|
|
||||||
for elem in dom.getElementsByTagName("*"):
|
|
||||||
if elem.tagName.endswith(":t") and elem.firstChild:
|
|
||||||
text = elem.firstChild.nodeValue
|
|
||||||
if text and (text.startswith((' ', '\t')) or text.endswith((' ', '\t'))):
|
|
||||||
if elem.getAttribute("xml:space") != "preserve":
|
|
||||||
elem.setAttribute("xml:space", "preserve")
|
|
||||||
text_preview = repr(text[:30]) + "..." if len(text) > 30 else repr(text)
|
|
||||||
print(f" Repaired: {xml_file.name}: Added xml:space='preserve' to {elem.tagName}: {text_preview}")
|
|
||||||
repairs += 1
|
|
||||||
modified = True
|
|
||||||
|
|
||||||
if modified:
|
|
||||||
xml_file.write_bytes(dom.toxml(encoding="UTF-8"))
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return repairs
|
|
||||||
|
|
||||||
def validate_xml(self):
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
try:
|
|
||||||
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):
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
try:
|
|
||||||
root = lxml.etree.parse(str(xml_file)).getroot()
|
|
||||||
declared = set(root.nsmap.keys()) - {None}
|
|
||||||
|
|
||||||
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):
|
|
||||||
errors = []
|
|
||||||
global_ids = {}
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
try:
|
|
||||||
root = lxml.etree.parse(str(xml_file)).getroot()
|
|
||||||
file_ids = {}
|
|
||||||
|
|
||||||
mc_elements = root.xpath(
|
|
||||||
".//mc:AlternateContent", namespaces={"mc": self.MC_NAMESPACE}
|
|
||||||
)
|
|
||||||
for elem in mc_elements:
|
|
||||||
elem.getparent().remove(elem)
|
|
||||||
|
|
||||||
for elem in root.iter():
|
|
||||||
tag = (
|
|
||||||
elem.tag.split("}")[-1].lower()
|
|
||||||
if "}" in elem.tag
|
|
||||||
else elem.tag.lower()
|
|
||||||
)
|
|
||||||
|
|
||||||
if tag in self.UNIQUE_ID_REQUIREMENTS:
|
|
||||||
in_excluded_container = any(
|
|
||||||
ancestor.tag.split("}")[-1].lower() in self.EXCLUDED_ID_CONTAINERS
|
|
||||||
for ancestor in elem.iterancestors()
|
|
||||||
)
|
|
||||||
if in_excluded_container:
|
|
||||||
continue
|
|
||||||
|
|
||||||
attr_name, scope = self.UNIQUE_ID_REQUIREMENTS[tag]
|
|
||||||
|
|
||||||
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":
|
|
||||||
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":
|
|
||||||
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):
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
rels_files = list(self.unpacked_dir.rglob("*.rels"))
|
|
||||||
|
|
||||||
if not rels_files:
|
|
||||||
if self.verbose:
|
|
||||||
print("PASSED - No .rels files found")
|
|
||||||
return True
|
|
||||||
|
|
||||||
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")
|
|
||||||
):
|
|
||||||
all_files.append(file_path.resolve())
|
|
||||||
|
|
||||||
all_referenced_files = set()
|
|
||||||
|
|
||||||
if self.verbose:
|
|
||||||
print(
|
|
||||||
f"Found {len(rels_files)} .rels files and {len(all_files)} target files"
|
|
||||||
)
|
|
||||||
|
|
||||||
for rels_file in rels_files:
|
|
||||||
try:
|
|
||||||
rels_root = lxml.etree.parse(str(rels_file)).getroot()
|
|
||||||
|
|
||||||
rels_dir = rels_file.parent
|
|
||||||
|
|
||||||
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:")
|
|
||||||
):
|
|
||||||
if target.startswith("/"):
|
|
||||||
target_path = self.unpacked_dir / target.lstrip("/")
|
|
||||||
elif rels_file.name == ".rels":
|
|
||||||
target_path = self.unpacked_dir / target
|
|
||||||
else:
|
|
||||||
base_dir = rels_dir.parent
|
|
||||||
target_path = base_dir / target
|
|
||||||
|
|
||||||
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))
|
|
||||||
|
|
||||||
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}")
|
|
||||||
|
|
||||||
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):
|
|
||||||
import lxml.etree
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
if xml_file.suffix == ".rels":
|
|
||||||
continue
|
|
||||||
|
|
||||||
rels_dir = xml_file.parent / "_rels"
|
|
||||||
rels_file = rels_dir / f"{xml_file.name}.rels"
|
|
||||||
|
|
||||||
if not rels_file.exists():
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
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:
|
|
||||||
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)"
|
|
||||||
)
|
|
||||||
type_name = (
|
|
||||||
rel_type.split("/")[-1] if "/" in rel_type else rel_type
|
|
||||||
)
|
|
||||||
rid_to_type[rid] = type_name
|
|
||||||
|
|
||||||
xml_root = lxml.etree.parse(str(xml_file)).getroot()
|
|
||||||
|
|
||||||
r_ns = self.OFFICE_RELATIONSHIPS_NAMESPACE
|
|
||||||
rid_attrs_to_check = ["id", "embed", "link"]
|
|
||||||
for elem in xml_root.iter():
|
|
||||||
for attr_name in rid_attrs_to_check:
|
|
||||||
rid_attr = elem.get(f"{{{r_ns}}}{attr_name}")
|
|
||||||
if not rid_attr:
|
|
||||||
continue
|
|
||||||
xml_rel_path = xml_file.relative_to(self.unpacked_dir)
|
|
||||||
elem_name = (
|
|
||||||
elem.tag.split("}")[-1] if "}" in elem.tag else elem.tag
|
|
||||||
)
|
|
||||||
|
|
||||||
if rid_attr not in rid_to_type:
|
|
||||||
errors.append(
|
|
||||||
f" {xml_rel_path}: Line {elem.sourceline}: "
|
|
||||||
f"<{elem_name}> r:{attr_name} references non-existent relationship '{rid_attr}' "
|
|
||||||
f"(valid IDs: {', '.join(sorted(rid_to_type.keys())[:5])}{'...' if len(rid_to_type) > 5 else ''})"
|
|
||||||
)
|
|
||||||
elif attr_name == "id" and self.ELEMENT_RELATIONSHIP_TYPES:
|
|
||||||
expected_type = self._get_expected_relationship_type(
|
|
||||||
elem_name
|
|
||||||
)
|
|
||||||
if expected_type:
|
|
||||||
actual_type = rid_to_type[rid_attr]
|
|
||||||
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):
|
|
||||||
elem_lower = element_name.lower()
|
|
||||||
|
|
||||||
if elem_lower in self.ELEMENT_RELATIONSHIP_TYPES:
|
|
||||||
return self.ELEMENT_RELATIONSHIP_TYPES[elem_lower]
|
|
||||||
|
|
||||||
if elem_lower.endswith("id") and len(elem_lower) > 2:
|
|
||||||
prefix = elem_lower[:-2]
|
|
||||||
if prefix.endswith("master"):
|
|
||||||
return prefix.lower()
|
|
||||||
elif prefix.endswith("layout"):
|
|
||||||
return prefix.lower()
|
|
||||||
else:
|
|
||||||
if prefix == "sld":
|
|
||||||
return "slide"
|
|
||||||
return prefix.lower()
|
|
||||||
|
|
||||||
if elem_lower.endswith("reference") and len(elem_lower) > 9:
|
|
||||||
prefix = elem_lower[:-9]
|
|
||||||
return prefix.lower()
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
def validate_content_types(self):
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
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:
|
|
||||||
root = lxml.etree.parse(str(content_types_file)).getroot()
|
|
||||||
declared_parts = set()
|
|
||||||
declared_extensions = set()
|
|
||||||
|
|
||||||
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("/"))
|
|
||||||
|
|
||||||
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())
|
|
||||||
|
|
||||||
declarable_roots = {
|
|
||||||
"sld",
|
|
||||||
"sldLayout",
|
|
||||||
"sldMaster",
|
|
||||||
"presentation",
|
|
||||||
"document",
|
|
||||||
"workbook",
|
|
||||||
"worksheet",
|
|
||||||
"theme",
|
|
||||||
}
|
|
||||||
|
|
||||||
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",
|
|
||||||
}
|
|
||||||
|
|
||||||
all_files = list(self.unpacked_dir.rglob("*"))
|
|
||||||
all_files = [f for f in all_files if f.is_file()]
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
path_str = str(xml_file.relative_to(self.unpacked_dir)).replace(
|
|
||||||
"\\", "/"
|
|
||||||
)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
for file_path in all_files:
|
|
||||||
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:
|
|
||||||
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):
|
|
||||||
xml_file = Path(xml_file).resolve()
|
|
||||||
unpacked_dir = self.unpacked_dir.resolve()
|
|
||||||
|
|
||||||
is_valid, current_errors = self._validate_single_file_xsd(
|
|
||||||
xml_file, unpacked_dir
|
|
||||||
)
|
|
||||||
|
|
||||||
if is_valid is None:
|
|
||||||
return None, set()
|
|
||||||
elif is_valid:
|
|
||||||
return True, set()
|
|
||||||
|
|
||||||
original_errors = self._get_original_file_errors(xml_file)
|
|
||||||
|
|
||||||
assert current_errors is not None
|
|
||||||
new_errors = current_errors - original_errors
|
|
||||||
|
|
||||||
new_errors = {
|
|
||||||
e for e in new_errors
|
|
||||||
if not any(pattern in e for pattern in self.IGNORED_VALIDATION_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:
|
|
||||||
if verbose:
|
|
||||||
print(
|
|
||||||
f"PASSED - No new errors (original had {len(current_errors)} errors)"
|
|
||||||
)
|
|
||||||
return True, set()
|
|
||||||
|
|
||||||
def validate_against_xsd(self):
|
|
||||||
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:
|
|
||||||
original_error_count += 1
|
|
||||||
valid_count += 1
|
|
||||||
continue
|
|
||||||
|
|
||||||
new_errors.append(f" {relative_path}: {len(new_file_errors)} new error(s)")
|
|
||||||
for error in list(new_file_errors)[:3]:
|
|
||||||
new_errors.append(
|
|
||||||
f" - {error[:250]}..." if len(error) > 250 else f" - {error}"
|
|
||||||
)
|
|
||||||
|
|
||||||
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):
|
|
||||||
if xml_file.name in self.SCHEMA_MAPPINGS:
|
|
||||||
return self.schemas_dir / self.SCHEMA_MAPPINGS[xml_file.name]
|
|
||||||
|
|
||||||
if xml_file.suffix == ".rels":
|
|
||||||
return self.schemas_dir / self.SCHEMA_MAPPINGS[".rels"]
|
|
||||||
|
|
||||||
if "charts/" in str(xml_file) and xml_file.name.startswith("chart"):
|
|
||||||
return self.schemas_dir / self.SCHEMA_MAPPINGS["chart"]
|
|
||||||
|
|
||||||
if "theme/" in str(xml_file) and xml_file.name.startswith("theme"):
|
|
||||||
return self.schemas_dir / self.SCHEMA_MAPPINGS["theme"]
|
|
||||||
|
|
||||||
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):
|
|
||||||
xml_string = lxml.etree.tostring(xml_doc, encoding="unicode")
|
|
||||||
xml_copy = lxml.etree.fromstring(xml_string)
|
|
||||||
|
|
||||||
for elem in xml_copy.iter():
|
|
||||||
attrs_to_remove = []
|
|
||||||
|
|
||||||
for attr in elem.attrib:
|
|
||||||
if "{" in attr:
|
|
||||||
ns = attr.split("}")[0][1:]
|
|
||||||
if ns not in self.OOXML_NAMESPACES:
|
|
||||||
attrs_to_remove.append(attr)
|
|
||||||
|
|
||||||
for attr in attrs_to_remove:
|
|
||||||
del elem.attrib[attr]
|
|
||||||
|
|
||||||
self._remove_ignorable_elements(xml_copy)
|
|
||||||
|
|
||||||
return lxml.etree.ElementTree(xml_copy)
|
|
||||||
|
|
||||||
def _remove_ignorable_elements(self, root):
|
|
||||||
elements_to_remove = []
|
|
||||||
|
|
||||||
for elem in list(root):
|
|
||||||
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
|
|
||||||
|
|
||||||
self._remove_ignorable_elements(elem)
|
|
||||||
|
|
||||||
for elem in elements_to_remove:
|
|
||||||
root.remove(elem)
|
|
||||||
|
|
||||||
def _preprocess_for_mc_ignorable(self, xml_doc):
|
|
||||||
root = xml_doc.getroot()
|
|
||||||
|
|
||||||
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):
|
|
||||||
schema_path = self._get_schema_path(xml_file)
|
|
||||||
if not schema_path:
|
|
||||||
return None, None
|
|
||||||
|
|
||||||
try:
|
|
||||||
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)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
if schema.validate(xml_doc):
|
|
||||||
return True, set()
|
|
||||||
else:
|
|
||||||
errors = set()
|
|
||||||
for error in schema.error_log:
|
|
||||||
errors.add(error.message)
|
|
||||||
return False, errors
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return False, {str(e)}
|
|
||||||
|
|
||||||
def _get_original_file_errors(self, xml_file):
|
|
||||||
if self.original_file is None:
|
|
||||||
return set()
|
|
||||||
|
|
||||||
import tempfile
|
|
||||||
import zipfile
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
with zipfile.ZipFile(self.original_file, "r") as zip_ref:
|
|
||||||
zip_ref.extractall(temp_path)
|
|
||||||
|
|
||||||
original_xml_file = temp_path / relative_path
|
|
||||||
|
|
||||||
if not original_xml_file.exists():
|
|
||||||
return set()
|
|
||||||
|
|
||||||
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):
|
|
||||||
warnings = []
|
|
||||||
template_pattern = re.compile(r"\{\{[^}]*\}\}")
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
for elem in xml_copy.iter():
|
|
||||||
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.")
|
|
||||||
@@ -1,446 +0,0 @@
|
|||||||
"""
|
|
||||||
Validator for Word document XML files against XSD schemas.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import random
|
|
||||||
import re
|
|
||||||
import tempfile
|
|
||||||
import zipfile
|
|
||||||
|
|
||||||
import defusedxml.minidom
|
|
||||||
import lxml.etree
|
|
||||||
|
|
||||||
from .base import BaseSchemaValidator
|
|
||||||
|
|
||||||
|
|
||||||
class DOCXSchemaValidator(BaseSchemaValidator):
|
|
||||||
|
|
||||||
WORD_2006_NAMESPACE = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
||||||
W14_NAMESPACE = "http://schemas.microsoft.com/office/word/2010/wordml"
|
|
||||||
W16CID_NAMESPACE = "http://schemas.microsoft.com/office/word/2016/wordml/cid"
|
|
||||||
|
|
||||||
ELEMENT_RELATIONSHIP_TYPES = {}
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
if not self.validate_xml():
|
|
||||||
return False
|
|
||||||
|
|
||||||
all_valid = True
|
|
||||||
if not self.validate_namespaces():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_unique_ids():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_file_references():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_content_types():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_against_xsd():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_whitespace_preservation():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_deletions():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_insertions():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_all_relationship_ids():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_id_constraints():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_comment_markers():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
self.compare_paragraph_counts()
|
|
||||||
|
|
||||||
return all_valid
|
|
||||||
|
|
||||||
def validate_whitespace_preservation(self):
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
if xml_file.name != "document.xml":
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
root = lxml.etree.parse(str(xml_file)).getroot()
|
|
||||||
|
|
||||||
for elem in root.iter(f"{{{self.WORD_2006_NAMESPACE}}}t"):
|
|
||||||
if elem.text:
|
|
||||||
text = elem.text
|
|
||||||
if re.search(r"^[ \t\n\r]", text) or re.search(
|
|
||||||
r"[ \t\n\r]$", text
|
|
||||||
):
|
|
||||||
xml_space_attr = f"{{{self.XML_NAMESPACE}}}space"
|
|
||||||
if (
|
|
||||||
xml_space_attr not in elem.attrib
|
|
||||||
or elem.attrib[xml_space_attr] != "preserve"
|
|
||||||
):
|
|
||||||
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):
|
|
||||||
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}
|
|
||||||
|
|
||||||
for t_elem in root.xpath(".//w:del//w:t", namespaces=namespaces):
|
|
||||||
if t_elem.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}"
|
|
||||||
)
|
|
||||||
|
|
||||||
for instr_elem in root.xpath(
|
|
||||||
".//w:del//w:instrText", namespaces=namespaces
|
|
||||||
):
|
|
||||||
text_preview = (
|
|
||||||
repr(instr_elem.text or "")[:50] + "..."
|
|
||||||
if len(repr(instr_elem.text or "")) > 50
|
|
||||||
else repr(instr_elem.text or "")
|
|
||||||
)
|
|
||||||
errors.append(
|
|
||||||
f" {xml_file.relative_to(self.unpacked_dir)}: "
|
|
||||||
f"Line {instr_elem.sourceline}: <w:instrText> found within <w:del> (use <w:delInstrText>): {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 = 0
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
if xml_file.name != "document.xml":
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
root = lxml.etree.parse(str(xml_file)).getroot()
|
|
||||||
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):
|
|
||||||
original = self.original_file
|
|
||||||
if original is None:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
count = 0
|
|
||||||
|
|
||||||
try:
|
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
|
||||||
with zipfile.ZipFile(original, "r") as zip_ref:
|
|
||||||
zip_ref.extractall(temp_dir)
|
|
||||||
|
|
||||||
doc_xml_path = temp_dir + "/word/document.xml"
|
|
||||||
root = lxml.etree.parse(doc_xml_path).getroot()
|
|
||||||
|
|
||||||
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):
|
|
||||||
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}
|
|
||||||
|
|
||||||
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):
|
|
||||||
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})")
|
|
||||||
|
|
||||||
def _parse_id_value(self, val: str, base: int = 16) -> int:
|
|
||||||
return int(val, base)
|
|
||||||
|
|
||||||
def validate_id_constraints(self):
|
|
||||||
errors = []
|
|
||||||
para_id_attr = f"{{{self.W14_NAMESPACE}}}paraId"
|
|
||||||
durable_id_attr = f"{{{self.W16CID_NAMESPACE}}}durableId"
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
try:
|
|
||||||
for elem in lxml.etree.parse(str(xml_file)).iter():
|
|
||||||
if val := elem.get(para_id_attr):
|
|
||||||
if self._parse_id_value(val, base=16) >= 0x80000000:
|
|
||||||
errors.append(
|
|
||||||
f" {xml_file.name}:{elem.sourceline}: paraId={val} >= 0x80000000"
|
|
||||||
)
|
|
||||||
|
|
||||||
if val := elem.get(durable_id_attr):
|
|
||||||
if xml_file.name == "numbering.xml":
|
|
||||||
try:
|
|
||||||
if self._parse_id_value(val, base=10) >= 0x7FFFFFFF:
|
|
||||||
errors.append(
|
|
||||||
f" {xml_file.name}:{elem.sourceline}: "
|
|
||||||
f"durableId={val} >= 0x7FFFFFFF"
|
|
||||||
)
|
|
||||||
except ValueError:
|
|
||||||
errors.append(
|
|
||||||
f" {xml_file.name}:{elem.sourceline}: "
|
|
||||||
f"durableId={val} must be decimal in numbering.xml"
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
if self._parse_id_value(val, base=16) >= 0x7FFFFFFF:
|
|
||||||
errors.append(
|
|
||||||
f" {xml_file.name}:{elem.sourceline}: "
|
|
||||||
f"durableId={val} >= 0x7FFFFFFF"
|
|
||||||
)
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if errors:
|
|
||||||
print(f"FAILED - {len(errors)} ID constraint violations:")
|
|
||||||
for e in errors:
|
|
||||||
print(e)
|
|
||||||
elif self.verbose:
|
|
||||||
print("PASSED - All paraId/durableId values within constraints")
|
|
||||||
return not errors
|
|
||||||
|
|
||||||
def validate_comment_markers(self):
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
document_xml = None
|
|
||||||
comments_xml = None
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
if xml_file.name == "document.xml" and "word" in str(xml_file):
|
|
||||||
document_xml = xml_file
|
|
||||||
elif xml_file.name == "comments.xml":
|
|
||||||
comments_xml = xml_file
|
|
||||||
|
|
||||||
if not document_xml:
|
|
||||||
if self.verbose:
|
|
||||||
print("PASSED - No document.xml found (skipping comment validation)")
|
|
||||||
return True
|
|
||||||
|
|
||||||
try:
|
|
||||||
doc_root = lxml.etree.parse(str(document_xml)).getroot()
|
|
||||||
namespaces = {"w": self.WORD_2006_NAMESPACE}
|
|
||||||
|
|
||||||
range_starts = {
|
|
||||||
elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id")
|
|
||||||
for elem in doc_root.xpath(
|
|
||||||
".//w:commentRangeStart", namespaces=namespaces
|
|
||||||
)
|
|
||||||
}
|
|
||||||
range_ends = {
|
|
||||||
elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id")
|
|
||||||
for elem in doc_root.xpath(
|
|
||||||
".//w:commentRangeEnd", namespaces=namespaces
|
|
||||||
)
|
|
||||||
}
|
|
||||||
references = {
|
|
||||||
elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id")
|
|
||||||
for elem in doc_root.xpath(
|
|
||||||
".//w:commentReference", namespaces=namespaces
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
orphaned_ends = range_ends - range_starts
|
|
||||||
for comment_id in sorted(
|
|
||||||
orphaned_ends, key=lambda x: int(x) if x and x.isdigit() else 0
|
|
||||||
):
|
|
||||||
errors.append(
|
|
||||||
f' document.xml: commentRangeEnd id="{comment_id}" has no matching commentRangeStart'
|
|
||||||
)
|
|
||||||
|
|
||||||
orphaned_starts = range_starts - range_ends
|
|
||||||
for comment_id in sorted(
|
|
||||||
orphaned_starts, key=lambda x: int(x) if x and x.isdigit() else 0
|
|
||||||
):
|
|
||||||
errors.append(
|
|
||||||
f' document.xml: commentRangeStart id="{comment_id}" has no matching commentRangeEnd'
|
|
||||||
)
|
|
||||||
|
|
||||||
comment_ids = set()
|
|
||||||
if comments_xml and comments_xml.exists():
|
|
||||||
comments_root = lxml.etree.parse(str(comments_xml)).getroot()
|
|
||||||
comment_ids = {
|
|
||||||
elem.get(f"{{{self.WORD_2006_NAMESPACE}}}id")
|
|
||||||
for elem in comments_root.xpath(
|
|
||||||
".//w:comment", namespaces=namespaces
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
marker_ids = range_starts | range_ends | references
|
|
||||||
invalid_refs = marker_ids - comment_ids
|
|
||||||
for comment_id in sorted(
|
|
||||||
invalid_refs, key=lambda x: int(x) if x and x.isdigit() else 0
|
|
||||||
):
|
|
||||||
if comment_id:
|
|
||||||
errors.append(
|
|
||||||
f' document.xml: marker id="{comment_id}" references non-existent comment'
|
|
||||||
)
|
|
||||||
|
|
||||||
except (lxml.etree.XMLSyntaxError, Exception) as e:
|
|
||||||
errors.append(f" Error parsing XML: {e}")
|
|
||||||
|
|
||||||
if errors:
|
|
||||||
print(f"FAILED - {len(errors)} comment marker violations:")
|
|
||||||
for error in errors:
|
|
||||||
print(error)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
if self.verbose:
|
|
||||||
print("PASSED - All comment markers properly paired")
|
|
||||||
return True
|
|
||||||
|
|
||||||
def repair(self) -> int:
|
|
||||||
repairs = super().repair()
|
|
||||||
repairs += self.repair_durableId()
|
|
||||||
return repairs
|
|
||||||
|
|
||||||
def repair_durableId(self) -> int:
|
|
||||||
repairs = 0
|
|
||||||
|
|
||||||
for xml_file in self.xml_files:
|
|
||||||
try:
|
|
||||||
content = xml_file.read_text(encoding="utf-8")
|
|
||||||
dom = defusedxml.minidom.parseString(content)
|
|
||||||
modified = False
|
|
||||||
|
|
||||||
for elem in dom.getElementsByTagName("*"):
|
|
||||||
if not elem.hasAttribute("w16cid:durableId"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
durable_id = elem.getAttribute("w16cid:durableId")
|
|
||||||
needs_repair = False
|
|
||||||
|
|
||||||
if xml_file.name == "numbering.xml":
|
|
||||||
try:
|
|
||||||
needs_repair = (
|
|
||||||
self._parse_id_value(durable_id, base=10) >= 0x7FFFFFFF
|
|
||||||
)
|
|
||||||
except ValueError:
|
|
||||||
needs_repair = True
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
needs_repair = (
|
|
||||||
self._parse_id_value(durable_id, base=16) >= 0x7FFFFFFF
|
|
||||||
)
|
|
||||||
except ValueError:
|
|
||||||
needs_repair = True
|
|
||||||
|
|
||||||
if needs_repair:
|
|
||||||
value = random.randint(1, 0x7FFFFFFE)
|
|
||||||
if xml_file.name == "numbering.xml":
|
|
||||||
new_id = str(value)
|
|
||||||
else:
|
|
||||||
new_id = f"{value:08X}"
|
|
||||||
|
|
||||||
elem.setAttribute("w16cid:durableId", new_id)
|
|
||||||
print(
|
|
||||||
f" Repaired: {xml_file.name}: durableId {durable_id} → {new_id}"
|
|
||||||
)
|
|
||||||
repairs += 1
|
|
||||||
modified = True
|
|
||||||
|
|
||||||
if modified:
|
|
||||||
xml_file.write_bytes(dom.toxml(encoding="UTF-8"))
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return repairs
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
raise RuntimeError("This module should not be run directly.")
|
|
||||||
@@ -1,275 +0,0 @@
|
|||||||
"""
|
|
||||||
Validator for PowerPoint presentation XML files against XSD schemas.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
from .base import BaseSchemaValidator
|
|
||||||
|
|
||||||
|
|
||||||
class PPTXSchemaValidator(BaseSchemaValidator):
|
|
||||||
|
|
||||||
PRESENTATIONML_NAMESPACE = (
|
|
||||||
"http://schemas.openxmlformats.org/presentationml/2006/main"
|
|
||||||
)
|
|
||||||
|
|
||||||
ELEMENT_RELATIONSHIP_TYPES = {
|
|
||||||
"sldid": "slide",
|
|
||||||
"sldmasterid": "slidemaster",
|
|
||||||
"notesmasterid": "notesmaster",
|
|
||||||
"sldlayoutid": "slidelayout",
|
|
||||||
"themeid": "theme",
|
|
||||||
"tablestyleid": "tablestyles",
|
|
||||||
}
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
if not self.validate_xml():
|
|
||||||
return False
|
|
||||||
|
|
||||||
all_valid = True
|
|
||||||
if not self.validate_namespaces():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_unique_ids():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_uuid_ids():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_file_references():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_slide_layout_ids():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_content_types():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_against_xsd():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_notes_slide_references():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_all_relationship_ids():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
if not self.validate_no_duplicate_slide_layouts():
|
|
||||||
all_valid = False
|
|
||||||
|
|
||||||
return all_valid
|
|
||||||
|
|
||||||
def validate_uuid_ids(self):
|
|
||||||
import lxml.etree
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
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()
|
|
||||||
|
|
||||||
for elem in root.iter():
|
|
||||||
for attr, value in elem.attrib.items():
|
|
||||||
attr_name = attr.split("}")[-1].lower()
|
|
||||||
if attr_name == "id" or attr_name.endswith("id"):
|
|
||||||
if self._looks_like_uuid(value):
|
|
||||||
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):
|
|
||||||
clean_value = value.strip("{}()").replace("-", "")
|
|
||||||
return len(clean_value) == 32 and all(c.isalnum() for c in clean_value)
|
|
||||||
|
|
||||||
def validate_slide_layout_ids(self):
|
|
||||||
import lxml.etree
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
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:
|
|
||||||
root = lxml.etree.parse(str(slide_master)).getroot()
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
rels_root = lxml.etree.parse(str(rels_file)).getroot()
|
|
||||||
|
|
||||||
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"))
|
|
||||||
|
|
||||||
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):
|
|
||||||
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()
|
|
||||||
|
|
||||||
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):
|
|
||||||
import lxml.etree
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
notes_slide_references = {}
|
|
||||||
|
|
||||||
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:
|
|
||||||
root = lxml.etree.parse(str(rels_file)).getroot()
|
|
||||||
|
|
||||||
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:
|
|
||||||
normalized_target = target.replace("../", "")
|
|
||||||
|
|
||||||
slide_name = rels_file.stem.replace(
|
|
||||||
".xml", ""
|
|
||||||
)
|
|
||||||
|
|
||||||
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}"
|
|
||||||
)
|
|
||||||
|
|
||||||
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.")
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
"""
|
|
||||||
Validator for tracked changes in Word documents.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import tempfile
|
|
||||||
import zipfile
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
class RedliningValidator:
|
|
||||||
|
|
||||||
def __init__(self, unpacked_dir, original_docx, verbose=False, author="Claude"):
|
|
||||||
self.unpacked_dir = Path(unpacked_dir)
|
|
||||||
self.original_docx = Path(original_docx)
|
|
||||||
self.verbose = verbose
|
|
||||||
self.author = author
|
|
||||||
self.namespaces = {
|
|
||||||
"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
|
|
||||||
}
|
|
||||||
|
|
||||||
def repair(self) -> int:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
def validate(self):
|
|
||||||
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
|
|
||||||
|
|
||||||
try:
|
|
||||||
import xml.etree.ElementTree as ET
|
|
||||||
|
|
||||||
tree = ET.parse(modified_file)
|
|
||||||
root = tree.getroot()
|
|
||||||
|
|
||||||
del_elements = root.findall(".//w:del", self.namespaces)
|
|
||||||
ins_elements = root.findall(".//w:ins", self.namespaces)
|
|
||||||
|
|
||||||
author_del_elements = [
|
|
||||||
elem
|
|
||||||
for elem in del_elements
|
|
||||||
if elem.get(f"{{{self.namespaces['w']}}}author") == self.author
|
|
||||||
]
|
|
||||||
author_ins_elements = [
|
|
||||||
elem
|
|
||||||
for elem in ins_elements
|
|
||||||
if elem.get(f"{{{self.namespaces['w']}}}author") == self.author
|
|
||||||
]
|
|
||||||
|
|
||||||
if not author_del_elements and not author_ins_elements:
|
|
||||||
if self.verbose:
|
|
||||||
print(f"PASSED - No tracked changes by {self.author} found.")
|
|
||||||
return True
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
|
||||||
temp_path = Path(temp_dir)
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
self._remove_author_tracked_changes(original_root)
|
|
||||||
self._remove_author_tracked_changes(modified_root)
|
|
||||||
|
|
||||||
modified_text = self._extract_text_content(modified_root)
|
|
||||||
original_text = self._extract_text_content(original_root)
|
|
||||||
|
|
||||||
if modified_text != original_text:
|
|
||||||
error_message = self._generate_detailed_diff(
|
|
||||||
original_text, modified_text
|
|
||||||
)
|
|
||||||
print(error_message)
|
|
||||||
return False
|
|
||||||
|
|
||||||
if self.verbose:
|
|
||||||
print(f"PASSED - All changes by {self.author} are properly tracked")
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _generate_detailed_diff(self, original_text, modified_text):
|
|
||||||
error_parts = [
|
|
||||||
f"FAILED - Document text doesn't match after removing {self.author}'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>",
|
|
||||||
"",
|
|
||||||
]
|
|
||||||
|
|
||||||
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):
|
|
||||||
try:
|
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
|
||||||
temp_path = Path(temp_dir)
|
|
||||||
|
|
||||||
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")
|
|
||||||
|
|
||||||
result = subprocess.run(
|
|
||||||
[
|
|
||||||
"git",
|
|
||||||
"diff",
|
|
||||||
"--word-diff=plain",
|
|
||||||
"--word-diff-regex=.",
|
|
||||||
"-U0",
|
|
||||||
"--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)
|
|
||||||
|
|
||||||
if content_lines:
|
|
||||||
return "\n".join(content_lines)
|
|
||||||
|
|
||||||
result = subprocess.run(
|
|
||||||
[
|
|
||||||
"git",
|
|
||||||
"diff",
|
|
||||||
"--word-diff=plain",
|
|
||||||
"-U0",
|
|
||||||
"--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):
|
|
||||||
pass
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
def _remove_author_tracked_changes(self, root):
|
|
||||||
ins_tag = f"{{{self.namespaces['w']}}}ins"
|
|
||||||
del_tag = f"{{{self.namespaces['w']}}}del"
|
|
||||||
author_attr = f"{{{self.namespaces['w']}}}author"
|
|
||||||
|
|
||||||
for parent in root.iter():
|
|
||||||
to_remove = []
|
|
||||||
for child in parent:
|
|
||||||
if child.tag == ins_tag and child.get(author_attr) == self.author:
|
|
||||||
to_remove.append(child)
|
|
||||||
for elem in to_remove:
|
|
||||||
parent.remove(elem)
|
|
||||||
|
|
||||||
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) == self.author:
|
|
||||||
to_process.append((child, list(parent).index(child)))
|
|
||||||
|
|
||||||
for del_elem, del_index in reversed(to_process):
|
|
||||||
for elem in del_elem.iter():
|
|
||||||
if elem.tag == deltext_tag:
|
|
||||||
elem.tag = t_tag
|
|
||||||
|
|
||||||
for child in reversed(list(del_elem)):
|
|
||||||
parent.insert(del_index, child)
|
|
||||||
parent.remove(del_elem)
|
|
||||||
|
|
||||||
def _extract_text_content(self, root):
|
|
||||||
p_tag = f"{{{self.namespaces['w']}}}p"
|
|
||||||
t_tag = f"{{{self.namespaces['w']}}}t"
|
|
||||||
|
|
||||||
paragraphs = []
|
|
||||||
for p_elem in root.findall(f".//{p_tag}"):
|
|
||||||
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)
|
|
||||||
if paragraph_text:
|
|
||||||
paragraphs.append(paragraph_text)
|
|
||||||
|
|
||||||
return "\n".join(paragraphs)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
raise RuntimeError("This module should not be run directly.")
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
"""
|
|
||||||
Excel Formula Recalculation Script
|
|
||||||
Recalculates all formulas in an Excel file using LibreOffice
|
|
||||||
"""
|
|
||||||
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import platform
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from office.soffice import get_soffice_env
|
|
||||||
|
|
||||||
from openpyxl import load_workbook
|
|
||||||
|
|
||||||
MACRO_DIR_MACOS = "~/Library/Application Support/LibreOffice/4/user/basic/Standard"
|
|
||||||
MACRO_DIR_LINUX = "~/.config/libreoffice/4/user/basic/Standard"
|
|
||||||
MACRO_FILENAME = "Module1.xba"
|
|
||||||
|
|
||||||
RECALCULATE_MACRO = """<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
|
|
||||||
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module1" script:language="StarBasic">
|
|
||||||
Sub RecalculateAndSave()
|
|
||||||
ThisComponent.calculateAll()
|
|
||||||
ThisComponent.store()
|
|
||||||
ThisComponent.close(True)
|
|
||||||
End Sub
|
|
||||||
</script:module>"""
|
|
||||||
|
|
||||||
|
|
||||||
def has_gtimeout():
|
|
||||||
try:
|
|
||||||
subprocess.run(
|
|
||||||
["gtimeout", "--version"], capture_output=True, timeout=1, check=False
|
|
||||||
)
|
|
||||||
return True
|
|
||||||
except (FileNotFoundError, subprocess.TimeoutExpired):
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def setup_libreoffice_macro():
|
|
||||||
macro_dir = os.path.expanduser(
|
|
||||||
MACRO_DIR_MACOS if platform.system() == "Darwin" else MACRO_DIR_LINUX
|
|
||||||
)
|
|
||||||
macro_file = os.path.join(macro_dir, MACRO_FILENAME)
|
|
||||||
|
|
||||||
if (
|
|
||||||
os.path.exists(macro_file)
|
|
||||||
and "RecalculateAndSave" in Path(macro_file).read_text()
|
|
||||||
):
|
|
||||||
return True
|
|
||||||
|
|
||||||
if not os.path.exists(macro_dir):
|
|
||||||
subprocess.run(
|
|
||||||
["soffice", "--headless", "--terminate_after_init"],
|
|
||||||
capture_output=True,
|
|
||||||
timeout=10,
|
|
||||||
env=get_soffice_env(),
|
|
||||||
)
|
|
||||||
os.makedirs(macro_dir, exist_ok=True)
|
|
||||||
|
|
||||||
try:
|
|
||||||
Path(macro_file).write_text(RECALCULATE_MACRO)
|
|
||||||
return True
|
|
||||||
except Exception:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def recalc(filename, timeout=30):
|
|
||||||
if not Path(filename).exists():
|
|
||||||
return {"error": f"File {filename} does not exist"}
|
|
||||||
|
|
||||||
abs_path = str(Path(filename).absolute())
|
|
||||||
|
|
||||||
if not setup_libreoffice_macro():
|
|
||||||
return {"error": "Failed to setup LibreOffice macro"}
|
|
||||||
|
|
||||||
cmd = [
|
|
||||||
"soffice",
|
|
||||||
"--headless",
|
|
||||||
"--norestore",
|
|
||||||
"vnd.sun.star.script:Standard.Module1.RecalculateAndSave?language=Basic&location=application",
|
|
||||||
abs_path,
|
|
||||||
]
|
|
||||||
|
|
||||||
if platform.system() == "Linux":
|
|
||||||
cmd = ["timeout", str(timeout)] + cmd
|
|
||||||
elif platform.system() == "Darwin" and has_gtimeout():
|
|
||||||
cmd = ["gtimeout", str(timeout)] + cmd
|
|
||||||
|
|
||||||
result = subprocess.run(cmd, capture_output=True, text=True, env=get_soffice_env())
|
|
||||||
|
|
||||||
if result.returncode != 0 and result.returncode != 124:
|
|
||||||
error_msg = result.stderr or "Unknown error during recalculation"
|
|
||||||
if "Module1" in error_msg or "RecalculateAndSave" not in error_msg:
|
|
||||||
return {"error": "LibreOffice macro not configured properly"}
|
|
||||||
return {"error": error_msg}
|
|
||||||
|
|
||||||
try:
|
|
||||||
wb = load_workbook(filename, data_only=True)
|
|
||||||
|
|
||||||
excel_errors = [
|
|
||||||
"#VALUE!",
|
|
||||||
"#DIV/0!",
|
|
||||||
"#REF!",
|
|
||||||
"#NAME?",
|
|
||||||
"#NULL!",
|
|
||||||
"#NUM!",
|
|
||||||
"#N/A",
|
|
||||||
]
|
|
||||||
error_details = {err: [] for err in excel_errors}
|
|
||||||
total_errors = 0
|
|
||||||
|
|
||||||
for sheet_name in wb.sheetnames:
|
|
||||||
ws = wb[sheet_name]
|
|
||||||
for row in ws.iter_rows():
|
|
||||||
for cell in row:
|
|
||||||
if cell.value is not None and isinstance(cell.value, str):
|
|
||||||
for err in excel_errors:
|
|
||||||
if err in cell.value:
|
|
||||||
location = f"{sheet_name}!{cell.coordinate}"
|
|
||||||
error_details[err].append(location)
|
|
||||||
total_errors += 1
|
|
||||||
break
|
|
||||||
|
|
||||||
wb.close()
|
|
||||||
|
|
||||||
result = {
|
|
||||||
"status": "success" if total_errors == 0 else "errors_found",
|
|
||||||
"total_errors": total_errors,
|
|
||||||
"error_summary": {},
|
|
||||||
}
|
|
||||||
|
|
||||||
for err_type, locations in error_details.items():
|
|
||||||
if locations:
|
|
||||||
result["error_summary"][err_type] = {
|
|
||||||
"count": len(locations),
|
|
||||||
"locations": locations[:20],
|
|
||||||
}
|
|
||||||
|
|
||||||
wb_formulas = load_workbook(filename, data_only=False)
|
|
||||||
formula_count = 0
|
|
||||||
for sheet_name in wb_formulas.sheetnames:
|
|
||||||
ws = wb_formulas[sheet_name]
|
|
||||||
for row in ws.iter_rows():
|
|
||||||
for cell in row:
|
|
||||||
if (
|
|
||||||
cell.value
|
|
||||||
and isinstance(cell.value, str)
|
|
||||||
and cell.value.startswith("=")
|
|
||||||
):
|
|
||||||
formula_count += 1
|
|
||||||
wb_formulas.close()
|
|
||||||
|
|
||||||
result["total_formulas"] = formula_count
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
return {"error": str(e)}
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
if len(sys.argv) < 2:
|
|
||||||
print("Usage: python recalc.py <excel_file> [timeout_seconds]")
|
|
||||||
print("\nRecalculates all formulas in an Excel file using LibreOffice")
|
|
||||||
print("\nReturns JSON with error details:")
|
|
||||||
print(" - status: 'success' or 'errors_found'")
|
|
||||||
print(" - total_errors: Total number of Excel errors found")
|
|
||||||
print(" - total_formulas: Number of formulas in the file")
|
|
||||||
print(" - error_summary: Breakdown by error type with locations")
|
|
||||||
print(" - #VALUE!, #DIV/0!, #REF!, #NAME?, #NULL!, #NUM!, #N/A")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
filename = sys.argv[1]
|
|
||||||
timeout = int(sys.argv[2]) if len(sys.argv) > 2 else 30
|
|
||||||
|
|
||||||
result = recalc(filename, timeout)
|
|
||||||
print(json.dumps(result, indent=2))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
5
.config/zentao/.env
Normal file
5
.config/zentao/.env
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
ZENTAO_URL=https://zentao.gentronhealth.com/
|
||||||
|
ZENTAO_ACCOUNT=guanyu
|
||||||
|
ZENTAO_PASSWORD=Gentron@2025
|
||||||
|
ZENTAO_TOKEN=49c270495806afdcf095c46959483326
|
||||||
|
ZENTAO_REAL_ACCOUNT=guanyu
|
||||||
76
.github/copilot-instructions.md
vendored
76
.github/copilot-instructions.md
vendored
@@ -1,76 +0,0 @@
|
|||||||
# OpenHIS — AI 编码助手 指南
|
|
||||||
|
|
||||||
目的:帮助自动化/AI 编码代理快速上手本仓库,包含架构要点、关键文件、常用构建/运行命令以及项目约定。请只按照仓库内真实可见的内容提出修改建议或补充说明。
|
|
||||||
|
|
||||||
- **代码组织**: 本项目是一个 Java 后端(多模块 Maven)+ Vue3 前端(Vite)的大型应用。
|
|
||||||
- 后端主模块目录:`openhis-server-new/`(顶层为 `pom`,包含多个子模块)。关键子模块示例:`openhis-application`, `openhis-domain`, `openhis-common`, `core-*` 系列。
|
|
||||||
- 前端目录:`openhis-ui-vue3/`(Vite + Vue 3,使用 Pinia、Element Plus 等)。
|
|
||||||
|
|
||||||
- **大局观(Big Picture)**: 后端以 Spring Boot(Java 17)实现,使用多模块 Maven 管理公共库与业务模块;前端由单独仓库目录通过 Vite 构建并以环境变量(`VITE_APP_BASE_API`)与后端交互。后端扫描 `com.core` 与 `com.openhis` 包(见 `OpenHisApplication.java`),启动类位于:`openhis-server-new/openhis-application/src/main/java/com/openhis/OpenHisApplication.java`。
|
|
||||||
|
|
||||||
- **运行/构建(Windows PowerShell 示例)**:
|
|
||||||
- 构建后端(从仓库根执行):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
cd openhis-server-new
|
|
||||||
mvn clean package -DskipTests
|
|
||||||
```
|
|
||||||
|
|
||||||
- 仅运行后端模块(开发时常用):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
cd openhis-server-new/openhis-application
|
|
||||||
mvn spring-boot:run
|
|
||||||
# 或在 IDE 中运行 `com.openhis.OpenHisApplication` 的 main()
|
|
||||||
```
|
|
||||||
|
|
||||||
- 前端启动与构建(需要 Node.js v16.x,仓库 README 建议 v16.15):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
cd openhis-ui-vue3
|
|
||||||
npm install
|
|
||||||
npm run dev # 本地开发(热重载)
|
|
||||||
npm run build:prod # 生产构建
|
|
||||||
```
|
|
||||||
|
|
||||||
- **环境与配置**:
|
|
||||||
- 后端配置:`openhis-server-new/openhis-application/src/main/resources/application.yml`(数据库、端口、profile 等)。README 还提及 `application-druid.yml`(若存在请优先查看)。
|
|
||||||
- 前端配置:多个 `.env.*` 文件(例如 `.env.development`, `.env.staging`, `.env.production`),关键变量:`VITE_APP_BASE_API`(例如 `/dev-api`),前端通过 `import.meta.env.VITE_APP_BASE_API` 拼接后端 URL(见 `src/utils/request.js`、多个视图与组件)。
|
|
||||||
|
|
||||||
- **重要约定 / 模式**:
|
|
||||||
- 后端采用 Java 17、Spring Boot 2.5.x 家族,父 POM在 `openhis-server-new/pom.xml` 定义。常用依赖版本在该 POM 的 `<properties>` 中集中维护。
|
|
||||||
- 模块间以 Maven 模块依赖与 `com.core` / `com.openhis` 包名分层(见 `pom.xml` 的 `<modules>` 与 `dependencyManagement`)。
|
|
||||||
- 前端通过 Vite 插件配置(`openhis-ui-vue3/vite/plugins`)管理 svg、自动导入等。UI 框架为 Element Plus,状态管理为 Pinia。
|
|
||||||
|
|
||||||
- **集成点 & 外部依赖**:
|
|
||||||
- 数据库:PostgreSQL(README 建议 v16.2),仓库根含一个大型初始化 SQL:`数据库初始话脚本(请使用navicat16版本导入).sql`,用于初始化表与演示数据。
|
|
||||||
- 缓存/会话:Redis(需自行配置)。
|
|
||||||
- 其他:Flowable(工作流),Druid(连接池监控),第三方服务通过特定配置类(例如 `YbServiceConfig` 在 `OpenHisApplication` 中启用)。
|
|
||||||
|
|
||||||
- **调试与常见位置**:
|
|
||||||
- 启动类:`openhis-server-new/openhis-application/src/main/java/com/openhis/OpenHisApplication.java`。
|
|
||||||
- 全局配置:`openhis-server-new/openhis-application/src/main/resources/`(`application.yml`、profile 文件等)。
|
|
||||||
- 前端入口:`openhis-ui-vue3/src/main.js`、路由在 `openhis-ui-vue3/src/router/index.js`。
|
|
||||||
- API 文档与监控路径(通常由后端暴露并被前端访问):
|
|
||||||
- Swagger UI: `<VITE_APP_BASE_API>/swagger-ui/index.html`(前端视图在 `src/views/tool/swagger/index.vue`)。
|
|
||||||
- Druid: `<VITE_APP_BASE_API>/druid/login.html`(见前端相关视图引用)。
|
|
||||||
|
|
||||||
- **为 AI 代理的具体建议(如何安全、有效地修改代码)**:
|
|
||||||
- 修改后端时:优先在子模块(例如 `openhis-application`)本地运行 `mvn spring-boot:run` 验证启动与基础 API;大量改动前先执行 `mvn -T1C -DskipTests clean package` 在 CI 环境上验证构建(本地机器也可用)。
|
|
||||||
- 修改前端时:检查/调整对应 `.env.*` 文件中的 `VITE_APP_BASE_API`,使用 `npm run dev` 本地联调后端接口(可通过代理或将 `VITE_APP_BASE_API` 指向后端地址)。
|
|
||||||
- 修改数据库结构或 seed:请参考仓库根的 SQL 初始化脚本,任何 DDL/数据变更需同步该脚本并通知数据库管理员/运维。
|
|
||||||
|
|
||||||
- **举例(常见任务示例)**:
|
|
||||||
- 本地联调前端 + 后端(PowerShell):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# 启动后端
|
|
||||||
cd openhis-server-new/openhis-application
|
|
||||||
mvn spring-boot:run
|
|
||||||
|
|
||||||
# 启动前端(另开终端)
|
|
||||||
cd openhis-ui-vue3
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
如需我把这些内容合并为更短或更详细的版本,或把其中某部分(例如后端模块依赖关系图、关键 Java 包说明)展开,请告诉我要增强哪一节。
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -63,3 +63,6 @@ public.sql
|
|||||||
发版记录/2025-11-12/发版日志.docx
|
发版记录/2025-11-12/发版日志.docx
|
||||||
.gitignore
|
.gitignore
|
||||||
openhis-server-new/openhis-application/src/main/resources/application-dev.yml
|
openhis-server-new/openhis-application/src/main/resources/application-dev.yml
|
||||||
|
.env.test.local
|
||||||
|
playwright-report/
|
||||||
|
test-results/
|
||||||
|
|||||||
51
.husky/pre-commit
Executable file
51
.husky/pre-commit
Executable file
@@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# ============================================================
|
||||||
|
# Husky Pre-commit Hook - HIS项目
|
||||||
|
# 配置: 关羽 | 日期: 2026-04-24
|
||||||
|
# 功能: 提交前自动检查前端构建
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
echo "========================================"
|
||||||
|
echo "🔍 [Pre-commit] HIS项目提交检查"
|
||||||
|
echo "========================================"
|
||||||
|
|
||||||
|
# 检查前端目录是否存在
|
||||||
|
if [ ! -d "openhis-ui-vue3" ]; then
|
||||||
|
echo "⚠️ [Pre-commit] 未找到openhis-ui-vue3目录,跳过前端检查"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd openhis-ui-vue3
|
||||||
|
|
||||||
|
# 检查node_modules是否存在
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
echo "⚠️ [Pre-commit] node_modules未安装,请先执行 npm install"
|
||||||
|
echo " 提示: 首次使用或依赖变更后需要安装依赖"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行lint检查(ESLint配置由赵云下周完善后启用)
|
||||||
|
if grep -q '"lint"' package.json 2>/dev/null; then
|
||||||
|
echo "📋 [Pre-commit] 执行Lint检查..."
|
||||||
|
if npm run lint -- --max-warnings 0 2>&1; then
|
||||||
|
echo "✅ [Pre-commit] Lint检查通过"
|
||||||
|
else
|
||||||
|
echo "❌ [Pre-commit] Lint检查失败!请修复代码规范问题"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⏭️ [Pre-commit] 未配置lint脚本(待赵云配置ESLint后启用)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行快速构建检查(development模式,仅检查语法和类型)
|
||||||
|
echo "🔨 [Pre-commit] 执行构建检查 (build:dev)..."
|
||||||
|
if timeout 120 npm run build:dev 2>&1; then
|
||||||
|
echo "✅ [Pre-commit] 构建检查通过"
|
||||||
|
else
|
||||||
|
echo "❌ [Pre-commit] 构建检查失败!请修复编译错误后重新提交"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "========================================"
|
||||||
|
echo "✅ [Pre-commit] 所有检查通过,允许提交"
|
||||||
|
echo "========================================"
|
||||||
4
.openclaw/workspace-state.json
Normal file
4
.openclaw/workspace-state.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"setupCompletedAt": "2026-04-06T04:43:29.304Z"
|
||||||
|
}
|
||||||
@@ -1 +0,0 @@
|
|||||||
seeded
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
description: "Get started"
|
|
||||||
---
|
|
||||||
|
|
||||||
get started
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
description: "Safe, practical file workflows"
|
|
||||||
---
|
|
||||||
|
|
||||||
Show me how to interact with files in this workspace. Include safe examples for reading, summarizing, and editing.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
description: "What plugins are and how to install them"
|
|
||||||
---
|
|
||||||
|
|
||||||
Explain what plugins are and how to install them in this workspace.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
description: "How skills work and how to create your own"
|
|
||||||
---
|
|
||||||
|
|
||||||
Explain what skills are, how to use them, and how to create a new skill for this workspace.
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 1,
|
|
||||||
"workspace": {
|
|
||||||
"name": "his",
|
|
||||||
"createdAt": 1770354192916,
|
|
||||||
"preset": "starter"
|
|
||||||
},
|
|
||||||
"authorizedRoots": [
|
|
||||||
"D:\\his"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
# No environment variables are required for this skill.
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
name: agent-creator
|
|
||||||
description: Create new OpenCode agents with a gpt-5.2-codex default.
|
|
||||||
---
|
|
||||||
|
|
||||||
## Quick Usage (Already Configured)
|
|
||||||
|
|
||||||
### Create a project agent
|
|
||||||
```bash
|
|
||||||
opencode agent create
|
|
||||||
```
|
|
||||||
|
|
||||||
### Agent file locations
|
|
||||||
- Project agents: `.opencode/agents/<name>.md`
|
|
||||||
- Global agents: `~/.config/opencode/agents/<name>.md`
|
|
||||||
|
|
||||||
## Default model
|
|
||||||
|
|
||||||
Use `gpt-5.2-codex` as the default model for new agents unless a workflow needs a different model.
|
|
||||||
|
|
||||||
## Minimal agent template
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
---
|
|
||||||
description: One-line description of what the agent does
|
|
||||||
mode: subagent
|
|
||||||
model: gpt-5.2-codex
|
|
||||||
tools:
|
|
||||||
write: false
|
|
||||||
edit: false
|
|
||||||
bash: false
|
|
||||||
---
|
|
||||||
You are a specialized agent. Describe your task, boundaries, and expected output.
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes from OpenCode docs
|
|
||||||
|
|
||||||
- Agent files are markdown with YAML frontmatter.
|
|
||||||
- The markdown filename becomes the agent name.
|
|
||||||
- Set `mode` to `primary`, `subagent`, or `all`.
|
|
||||||
- If no model is specified, subagents inherit the caller model.
|
|
||||||
- `tools` controls per-agent tool access.
|
|
||||||
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
Follow the official OpenCode agent docs: https://opencode.ai/docs/agents/
|
|
||||||
|
|
||||||
## First-Time Setup (If Not Configured)
|
|
||||||
|
|
||||||
1. Run `opencode agent create` and choose project scope.
|
|
||||||
2. Paste in the default template above and adjust tools as needed.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
export type AgentCreatorClient = Record<string, never>;
|
|
||||||
|
|
||||||
export const client: AgentCreatorClient = {};
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import { config } from "./load-env";
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
void config;
|
|
||||||
console.log("agent-creator: no credentials required.");
|
|
||||||
}
|
|
||||||
|
|
||||||
main().catch((error) => {
|
|
||||||
console.error(error);
|
|
||||||
});
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
export type AgentCreatorConfig = Record<string, never>;
|
|
||||||
|
|
||||||
export const config: AgentCreatorConfig = {};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
# No environment variables are required for this skill.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# Required credentials (if any)
|
|
||||||
# - List the credential name
|
|
||||||
# - Where to obtain it
|
|
||||||
# - How to store it locally
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# - GITHUB_TOKEN: https://github.com/settings/tokens
|
|
||||||
# - Store in .env (gitignored)
|
|
||||||
@@ -1,352 +0,0 @@
|
|||||||
---
|
|
||||||
name: command-creator
|
|
||||||
description: Create OpenCode custom commands for repeatable tasks.
|
|
||||||
---
|
|
||||||
|
|
||||||
## Quick Usage (Already Configured)
|
|
||||||
|
|
||||||
### Create a new command file
|
|
||||||
```bash
|
|
||||||
mkdir -p .opencode/commands
|
|
||||||
```
|
|
||||||
|
|
||||||
Create `.opencode/commands/<name>.md` with frontmatter and a prompt template.
|
|
||||||
|
|
||||||
### Command file example
|
|
||||||
```
|
|
||||||
---
|
|
||||||
description: Run tests with coverage
|
|
||||||
agent: build
|
|
||||||
model: gpt-5.2-codex
|
|
||||||
---
|
|
||||||
|
|
||||||
Run the full test suite with coverage report and show any failures.
|
|
||||||
Focus on the failing tests and suggest fixes.
|
|
||||||
```
|
|
||||||
|
|
||||||
## Prompt config essentials
|
|
||||||
|
|
||||||
- Use `$ARGUMENTS` for all arguments, or `$1`, `$2`, `$3` for positional args.
|
|
||||||
- Use `!\`command\`` to inject shell output into the prompt.
|
|
||||||
- Use `@path/to/file` to include file contents in the prompt.
|
|
||||||
|
|
||||||
## Notes from OpenCode docs
|
|
||||||
|
|
||||||
- Command files live in `.opencode/commands/` (project) or `~/.config/opencode/commands/` (global).
|
|
||||||
- The markdown filename becomes the command name (e.g., `test.md` → `/test`).
|
|
||||||
- JSON config also supports commands in `opencode.json` under `command`.
|
|
||||||
- Custom commands can override built-ins like `/init`, `/undo`, `/redo`, `/share`, `/help`.
|
|
||||||
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
Follow the official OpenCode command docs: https://opencode.ai/docs/commands/
|
|
||||||
Use the docs as the escape hatch when unsure.
|
|
||||||
|
|
||||||
## Docs snapshot
|
|
||||||
|
|
||||||
Skip to content
|
|
||||||
OpenCode
|
|
||||||
|
|
||||||
Search
|
|
||||||
⌘
|
|
||||||
K
|
|
||||||
Intro
|
|
||||||
Config
|
|
||||||
Providers
|
|
||||||
Network
|
|
||||||
Enterprise
|
|
||||||
Troubleshooting
|
|
||||||
Migrating to 1.0
|
|
||||||
TUI
|
|
||||||
CLI
|
|
||||||
Web
|
|
||||||
IDE
|
|
||||||
Zen
|
|
||||||
Share
|
|
||||||
GitHub
|
|
||||||
GitLab
|
|
||||||
Tools
|
|
||||||
Rules
|
|
||||||
Agents
|
|
||||||
Models
|
|
||||||
Themes
|
|
||||||
Keybinds
|
|
||||||
Commands
|
|
||||||
Formatters
|
|
||||||
Permissions
|
|
||||||
LSP Servers
|
|
||||||
MCP servers
|
|
||||||
ACP Support
|
|
||||||
Agent Skills
|
|
||||||
Custom Tools
|
|
||||||
SDK
|
|
||||||
Server
|
|
||||||
Plugins
|
|
||||||
Ecosystem
|
|
||||||
On this page
|
|
||||||
Overview
|
|
||||||
Create command files
|
|
||||||
Configure
|
|
||||||
JSON
|
|
||||||
Markdown
|
|
||||||
Prompt config
|
|
||||||
Arguments
|
|
||||||
Shell output
|
|
||||||
File references
|
|
||||||
Options
|
|
||||||
Template
|
|
||||||
Description
|
|
||||||
Agent
|
|
||||||
Subtask
|
|
||||||
Model
|
|
||||||
Built-in
|
|
||||||
Commands
|
|
||||||
Create custom commands for repetitive tasks.
|
|
||||||
|
|
||||||
Custom commands let you specify a prompt you want to run when that command is executed in the TUI.
|
|
||||||
|
|
||||||
/my-command
|
|
||||||
|
|
||||||
Custom commands are in addition to the built-in commands like /init, /undo, /redo, /share, /help. Learn more.
|
|
||||||
|
|
||||||
Create command files
|
|
||||||
Create markdown files in the commands/ directory to define custom commands.
|
|
||||||
|
|
||||||
Create .opencode/commands/test.md:
|
|
||||||
|
|
||||||
.opencode/commands/test.md
|
|
||||||
---
|
|
||||||
description: Run tests with coverage
|
|
||||||
agent: build
|
|
||||||
model: anthropic/claude-3-sonnet-20241022
|
|
||||||
---
|
|
||||||
|
|
||||||
Run the full test suite with coverage report and show any failures.
|
|
||||||
Focus on the failing tests and suggest fixes.
|
|
||||||
|
|
||||||
The frontmatter defines command properties. The content becomes the template.
|
|
||||||
|
|
||||||
Use the command by typing / followed by the command name.
|
|
||||||
|
|
||||||
"/test"
|
|
||||||
|
|
||||||
Configure
|
|
||||||
You can add custom commands through the OpenCode config or by creating markdown files in the commands/ directory.
|
|
||||||
|
|
||||||
JSON
|
|
||||||
Use the command option in your OpenCode config:
|
|
||||||
|
|
||||||
opencode.jsonc
|
|
||||||
{
|
|
||||||
"$schema": "https://opencode.ai/config.json",
|
|
||||||
"command": {
|
|
||||||
// This becomes the name of the command
|
|
||||||
"test": {
|
|
||||||
// This is the prompt that will be sent to the LLM
|
|
||||||
"template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.",
|
|
||||||
// This is shown as the description in the TUI
|
|
||||||
"description": "Run tests with coverage",
|
|
||||||
"agent": "build",
|
|
||||||
"model": "anthropic/claude-3-5-sonnet-20241022"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Now you can run this command in the TUI:
|
|
||||||
|
|
||||||
/test
|
|
||||||
|
|
||||||
Markdown
|
|
||||||
You can also define commands using markdown files. Place them in:
|
|
||||||
|
|
||||||
Global: ~/.config/opencode/commands/
|
|
||||||
Per-project: .opencode/commands/
|
|
||||||
~/.config/opencode/commands/test.md
|
|
||||||
---
|
|
||||||
description: Run tests with coverage
|
|
||||||
agent: build
|
|
||||||
model: anthropic/claude-3-5-sonnet-20241022
|
|
||||||
---
|
|
||||||
|
|
||||||
Run the full test suite with coverage report and show any failures.
|
|
||||||
Focus on the failing tests and suggest fixes.
|
|
||||||
|
|
||||||
The markdown file name becomes the command name. For example, test.md lets you run:
|
|
||||||
|
|
||||||
/test
|
|
||||||
|
|
||||||
Prompt config
|
|
||||||
The prompts for the custom commands support several special placeholders and syntax.
|
|
||||||
|
|
||||||
Arguments
|
|
||||||
Pass arguments to commands using the $ARGUMENTS placeholder.
|
|
||||||
|
|
||||||
.opencode/commands/component.md
|
|
||||||
---
|
|
||||||
description: Create a new component
|
|
||||||
---
|
|
||||||
|
|
||||||
Create a new React component named $ARGUMENTS with TypeScript support.
|
|
||||||
Include proper typing and basic structure.
|
|
||||||
|
|
||||||
Run the command with arguments:
|
|
||||||
|
|
||||||
/component Button
|
|
||||||
|
|
||||||
And $ARGUMENTS will be replaced with Button.
|
|
||||||
|
|
||||||
You can also access individual arguments using positional parameters:
|
|
||||||
|
|
||||||
$1 - First argument
|
|
||||||
$2 - Second argument
|
|
||||||
$3 - Third argument
|
|
||||||
And so on…
|
|
||||||
For example:
|
|
||||||
|
|
||||||
.opencode/commands/create-file.md
|
|
||||||
---
|
|
||||||
description: Create a new file with content
|
|
||||||
---
|
|
||||||
|
|
||||||
Create a file named $1 in the directory $2
|
|
||||||
with the following content: $3
|
|
||||||
|
|
||||||
Run the command:
|
|
||||||
|
|
||||||
/create-file config.json src "{ \"key\": \"value\" }"
|
|
||||||
|
|
||||||
This replaces:
|
|
||||||
|
|
||||||
$1 with config.json
|
|
||||||
$2 with src
|
|
||||||
$3 with { "key": "value" }
|
|
||||||
Shell output
|
|
||||||
Use !command to inject bash command output into your prompt.
|
|
||||||
|
|
||||||
For example, to create a custom command that analyzes test coverage:
|
|
||||||
|
|
||||||
.opencode/commands/analyze-coverage.md
|
|
||||||
---
|
|
||||||
description: Analyze test coverage
|
|
||||||
---
|
|
||||||
|
|
||||||
Here are the current test results:
|
|
||||||
!`npm test`
|
|
||||||
|
|
||||||
Based on these results, suggest improvements to increase coverage.
|
|
||||||
|
|
||||||
Or to review recent changes:
|
|
||||||
|
|
||||||
.opencode/commands/review-changes.md
|
|
||||||
---
|
|
||||||
description: Review recent changes
|
|
||||||
---
|
|
||||||
|
|
||||||
Recent git commits:
|
|
||||||
!`git log --oneline -10`
|
|
||||||
|
|
||||||
Review these changes and suggest any improvements.
|
|
||||||
|
|
||||||
Commands run in your project’s root directory and theutput becomes part of the prompt.
|
|
||||||
|
|
||||||
File references
|
|
||||||
Include files in your command using @ followed by the filename.
|
|
||||||
|
|
||||||
.opencode/commands/review-component.md
|
|
||||||
---
|
|
||||||
description: Review component
|
|
||||||
---
|
|
||||||
|
|
||||||
Review the component in @src/components/Button.tsx.
|
|
||||||
Check for performance issues and suggest improvements.
|
|
||||||
|
|
||||||
The file content gets included in the prompt automatically.
|
|
||||||
|
|
||||||
Options
|
|
||||||
Let’s look at the configuration options in detail.
|
|
||||||
|
|
||||||
Template
|
|
||||||
The template option defines the prompt that will be sent to the LLM when the command is executed.
|
|
||||||
|
|
||||||
opencode.json
|
|
||||||
{
|
|
||||||
"command": {
|
|
||||||
"test": {
|
|
||||||
"template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
This is a required config option.
|
|
||||||
|
|
||||||
Description
|
|
||||||
Use the description option to provide a brief description of what the command does.
|
|
||||||
|
|
||||||
opencode.json
|
|
||||||
{
|
|
||||||
"command": {
|
|
||||||
"test": {
|
|
||||||
"description": "Run tests with coverage"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
This is shown as the description in the TUI when you type ithe command.
|
|
||||||
|
|
||||||
Agent
|
|
||||||
Use the agent config to optionally specify which agent should execute this command. If this is a subagent the command will trigger a subagent invocation by default. To disable this behavior, set subtask to false.
|
|
||||||
|
|
||||||
opencode.json
|
|
||||||
{
|
|
||||||
"command": {
|
|
||||||
"review": {
|
|
||||||
"agent": "plan"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
This is an optional config option. If not specified, defaults to your current agent.
|
|
||||||
|
|
||||||
Subtask
|
|
||||||
Use the subtask boolean to force the command to trigger a subagent invocation. This is useful if you want the command to not pollute your primary context and will force the agent to act as a subagent, even if mode is set to primary on the agent configuration.
|
|
||||||
|
|
||||||
opencode.json
|
|
||||||
{
|
|
||||||
"command": {
|
|
||||||
"analyze": {
|
|
||||||
"subtask": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
This is an optional config option.
|
|
||||||
|
|
||||||
Model
|
|
||||||
Use the model config to override the default model for this command.
|
|
||||||
|
|
||||||
opencode.json
|
|
||||||
{
|
|
||||||
"command": {
|
|
||||||
"analyze": {
|
|
||||||
"model": "anthropic/claude-3-5-sonnet-20241022"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
This is an optional config option.
|
|
||||||
|
|
||||||
Built-in
|
|
||||||
opencode includes several built-in commands like /init, /undo, /redo, /share, /help; learn more.
|
|
||||||
|
|
||||||
Note
|
|
||||||
|
|
||||||
Custom commands can override built-in commands.
|
|
||||||
|
|
||||||
If you define a custom command with the same name, it will override the built-in command.
|
|
||||||
|
|
||||||
Edit this page
|
|
||||||
Find a bug? Open an issue
|
|
||||||
Join our Discord community
|
|
||||||
© Anomaly
|
|
||||||
|
|
||||||
Jan 24, 2026
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
name: get-started
|
|
||||||
description: Guide users through the get started setup and Chrome DevTools demo.
|
|
||||||
---
|
|
||||||
|
|
||||||
## When to use
|
|
||||||
- Always load this skill when the user says \"get started\".
|
|
||||||
|
|
||||||
## What to do
|
|
||||||
- Reply with these four lines, exactly and in order:
|
|
||||||
1) hey there welcome this is openwork
|
|
||||||
2) we've pre-configured you with a couple tools
|
|
||||||
3) Get Started
|
|
||||||
4) write \"hey go on google.com\"
|
|
||||||
|
|
||||||
## Then
|
|
||||||
- If the user writes \"go on google.com\" (or \"hey go on google.com\"), use the chrome-devtools MCP to open the site.
|
|
||||||
- After the navigation completes, reply: \"I'm on <site>\" where <site> is the final URL or page title they asked for.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
# No environment variables are required for this skill.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# Required credentials (if any)
|
|
||||||
# - List the credential name
|
|
||||||
# - Where to obtain it
|
|
||||||
# - How to store it locally
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# - GITHUB_TOKEN: https://github.com/settings/tokens
|
|
||||||
# - Store in .env (gitignored)
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
---
|
|
||||||
name: plugin-creator
|
|
||||||
description: Create OpenCode plugins and know where to load them.
|
|
||||||
---
|
|
||||||
|
|
||||||
## Quick Usage (Already Configured)
|
|
||||||
|
|
||||||
### Where plugins live
|
|
||||||
- Project plugins: `.opencode/plugins/*.js` or `.opencode/plugins/*.ts`
|
|
||||||
- Global plugins: `~/.config/opencode/plugins/*.js` or `.ts`
|
|
||||||
|
|
||||||
### Load from npm
|
|
||||||
Add npm plugin packages in `opencode.json`:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"$schema": "https://opencode.ai/config.json",
|
|
||||||
"plugin": ["opencode-helicone-session", "opencode-wakatime"]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Minimal plugin template
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export const MyPlugin = async ({ project, client, $, directory, worktree }) => {
|
|
||||||
return {
|
|
||||||
// Hook implementations go here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes from OpenCode docs
|
|
||||||
|
|
||||||
- Plugins are JS/TS modules exporting one or more plugin functions.
|
|
||||||
- Local plugins are loaded directly from the plugin directory.
|
|
||||||
- NPM plugins are installed via Bun at startup and cached in `~/.cache/opencode/node_modules/`.
|
|
||||||
- Load order: global config → project config → global plugins → project plugins.
|
|
||||||
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
Follow the official OpenCode plugin docs: https://opencode.ai/docs/plugins/
|
|
||||||
Use the docs as the escape hatch when unsure.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
# No environment variables are required for this skill.
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# Required credentials (if any)
|
|
||||||
# - List the credential name
|
|
||||||
# - Where to obtain it
|
|
||||||
# - How to store it locally
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# - GITHUB_TOKEN: https://github.com/settings/tokens
|
|
||||||
# - Store in .env (gitignored)
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
---
|
|
||||||
name: skill-creator
|
|
||||||
description: Create new OpenCode skills with the standard scaffold.
|
|
||||||
---
|
|
||||||
|
|
||||||
Skill creator helps create other skills that are self-buildable.
|
|
||||||
|
|
||||||
The best way to use it is after a user already executed a flow and says: create a skill for this. Alternatively, if the user asks for a skill to be created, suggest they do the task first and ask for skill creation at the end.
|
|
||||||
|
|
||||||
This should trigger this scaffold:
|
|
||||||
- If the user needed to configure things, create a `.env.example` without credentials and include all required variables.
|
|
||||||
- Ask the user if they want to store credentials. If yes, write them to a `.env` file in the skill, and suggest rotating keys later.
|
|
||||||
- Always add a `.gitignore` in the skill that ignores `.env`, and verify `.env` is not tracked.
|
|
||||||
- If the user needed to interact with an API and you created scripts, add reusable scripts under `scripts/`.
|
|
||||||
- New skills should explain how to use the `scripts/` and that `.env.example` defines the minimum config.
|
|
||||||
- Skills should state that they infer what they can do from the available config.
|
|
||||||
|
|
||||||
## Trigger phrases (critical)
|
|
||||||
|
|
||||||
The description field is how Claude decides when to use your skill.
|
|
||||||
Include 2-3 specific phrases that should trigger it.
|
|
||||||
|
|
||||||
Bad example:
|
|
||||||
"Use when working with content"
|
|
||||||
|
|
||||||
Good examples:
|
|
||||||
"Use when user mentions 'content pipeline', 'add to content database', or 'schedule a post'"
|
|
||||||
"Triggers on: 'rotate PDF', 'flip PDF pages', 'change PDF orientation'"
|
|
||||||
|
|
||||||
Quick validation:
|
|
||||||
- Contains at least one quoted phrase
|
|
||||||
- Uses "when" or "triggers"
|
|
||||||
- Longer than ~50 characters
|
|
||||||
|
|
||||||
## Frontmatter template
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
name: my-skill
|
|
||||||
description: |
|
|
||||||
[What it does in one sentence]
|
|
||||||
|
|
||||||
Triggers when user mentions:
|
|
||||||
- "[specific phrase 1]"
|
|
||||||
- "[specific phrase 2]"
|
|
||||||
- "[specific phrase 3]"
|
|
||||||
---
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quick Usage (Already Configured)
|
|
||||||
|
|
||||||
### Create a new skill folder
|
|
||||||
```bash
|
|
||||||
mkdir -p .opencode/skills/<skill-name>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Minimum scaffold files
|
|
||||||
- `SKILL.md`
|
|
||||||
- `scripts/`
|
|
||||||
- `.env`
|
|
||||||
- `.env.example` (use this to guide the minimum config)
|
|
||||||
- `.gitignore` (ignore `.env`)
|
|
||||||
|
|
||||||
## .env (credentials + config)
|
|
||||||
|
|
||||||
- Use `.env.example` to document required credentials or external setup.
|
|
||||||
- Do not include any real credentials in `.env.example`.
|
|
||||||
|
|
||||||
## Minimal skill template
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
---
|
|
||||||
name: skill-name
|
|
||||||
description: One-line description
|
|
||||||
---
|
|
||||||
|
|
||||||
## Quick Usage (Already Configured)
|
|
||||||
|
|
||||||
### Action 1
|
|
||||||
```bash
|
|
||||||
command here
|
|
||||||
```
|
|
||||||
|
|
||||||
## Common Gotchas
|
|
||||||
|
|
||||||
- Thing that doesn't work as expected
|
|
||||||
|
|
||||||
## First-Time Setup (If Not Configured)
|
|
||||||
|
|
||||||
1. ...
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes from OpenCode docs
|
|
||||||
|
|
||||||
- Skill folders live in `.opencode/skills/<name>/SKILL.md`.
|
|
||||||
- `name` must be lowercase and match the folder.
|
|
||||||
- Frontmatter requires `name` and `description`.
|
|
||||||
|
|
||||||
## Reference
|
|
||||||
|
|
||||||
Follow the official OpenCode skills docs: https://opencode.ai/docs/skills/
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
---
|
|
||||||
name: workspace-guide
|
|
||||||
description: Workspace guide to introduce OpenWork and onboard new users.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Welcome to OpenWork
|
|
||||||
|
|
||||||
Hi, I'm Ben and this is OpenWork. It's an open-source alternative to Claude's cowork. It helps you work on your files with AI and automate the mundane tasks so you don't have to.
|
|
||||||
|
|
||||||
Before we start, use the question tool to ask:
|
|
||||||
"Are you more technical or non-technical? I'll tailor the explanation."
|
|
||||||
|
|
||||||
## If the person is non-technical
|
|
||||||
OpenWork feels like a chat app, but it can safely work with the files you allow. Put files in this workspace and I can summarize them, create new ones, or help organize them.
|
|
||||||
|
|
||||||
Try:
|
|
||||||
- "Summarize the files in this workspace."
|
|
||||||
- "Create a checklist for my week."
|
|
||||||
- "Draft a short summary from this document."
|
|
||||||
|
|
||||||
## Skills and plugins (simple)
|
|
||||||
Skills add new capabilities. Plugins add advanced features like scheduling or browser automation. We can add them later when you're ready.
|
|
||||||
|
|
||||||
## If the person is technical
|
|
||||||
OpenWork is a GUI for OpenCode. Everything that works in OpenCode works here.
|
|
||||||
|
|
||||||
Most reliable setup today:
|
|
||||||
1) Install OpenCode from opencode.ai
|
|
||||||
2) Configure providers there (models and API keys)
|
|
||||||
3) Come back to OpenWork and start a session
|
|
||||||
|
|
||||||
Skills:
|
|
||||||
- Install from the Skills tab, or add them to this workspace.
|
|
||||||
- Docs: https://opencode.ai/docs/skills
|
|
||||||
|
|
||||||
Plugins:
|
|
||||||
- Configure in opencode.json or use the Plugins tab.
|
|
||||||
- Docs: https://opencode.ai/docs/plugins/
|
|
||||||
|
|
||||||
MCP servers:
|
|
||||||
- Add external tools via opencode.json.
|
|
||||||
- Docs: https://opencode.ai/docs/mcp-servers/
|
|
||||||
|
|
||||||
Config reference:
|
|
||||||
- Docs: https://opencode.ai/docs/config/
|
|
||||||
|
|
||||||
End with two friendly next actions to try in OpenWork.
|
|
||||||
@@ -2,5 +2,5 @@
|
|||||||
"tools": {
|
"tools": {
|
||||||
"approvalMode": "yolo"
|
"approvalMode": "yolo"
|
||||||
},
|
},
|
||||||
"$version": 2
|
"$version": 3
|
||||||
}
|
}
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# 修复门诊预约界面专家号查询结果显示问题
|
|
||||||
|
|
||||||
## 问题分析
|
|
||||||
1. 前端传递的参数正确:`type=expert`,后端正确转换为`ticketType=专家`
|
|
||||||
2. 实际查询返回了5条记录,但COUNT查询只返回了1条记录
|
|
||||||
3. 这导致前端只显示了1条记录,而不是全部5条
|
|
||||||
4. 原因:MyBatis-Plus自动生成的COUNT查询和实际查询使用了不同的条件,特别是逻辑删除条件
|
|
||||||
|
|
||||||
## 解决方案
|
|
||||||
1. 修改TicketMapper.xml中的自定义COUNT查询,显式添加`delete_flag = '0'`条件
|
|
||||||
2. 在selectTicketPage和selectTicketPage_mpCount查询中都添加逻辑删除条件
|
|
||||||
3. 确保两个查询使用完全相同的WHERE条件
|
|
||||||
|
|
||||||
## 修复步骤
|
|
||||||
1. 修改`selectTicketPage`查询,添加逻辑删除条件`and delete_flag = '0'`
|
|
||||||
2. 修改`selectTicketPage_mpCount`查询,添加逻辑删除条件`and delete_flag = '0'`
|
|
||||||
3. 确保两个查询的WHERE条件完全一致
|
|
||||||
4. 测试修复后的功能,确保专家号能正确显示全部5条记录
|
|
||||||
|
|
||||||
## 代码修改点
|
|
||||||
- 文件:`d:/work/openhis-server-new/openhis-domain/src/main/resources/mapper/clinical/TicketMapper.xml`
|
|
||||||
- 查询:`selectTicketPage` 和 `selectTicketPage_mpCount`
|
|
||||||
- 修改内容:添加逻辑删除条件`and delete_flag = '0'`
|
|
||||||
|
|
||||||
## 预期效果
|
|
||||||
修复后,COUNT查询和实际查询将使用完全相同的条件,包括逻辑删除条件,从而确保COUNT查询返回正确的总记录数,前端能显示所有5条专家号记录。
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# 修复门诊预约界面专家号查询COUNT结果不正确问题
|
|
||||||
|
|
||||||
## 问题分析
|
|
||||||
1. 前端传递的参数正确:`type=expert`,后端正确转换为`ticketType=专家`
|
|
||||||
2. COUNT查询和实际查询的WHERE条件完全相同:`WHERE delete_flag = '0' AND ticket_type = '专家'`
|
|
||||||
3. 但COUNT查询只返回1条记录,而实际查询返回5条记录
|
|
||||||
4. 原因:MyBatis-Plus的分页插件在处理自定义COUNT查询时,存在bug,导致COUNT查询结果不正确
|
|
||||||
|
|
||||||
## 解决方案
|
|
||||||
修改`TicketAppServiceImpl.java`中的`listTicket`方法,不使用MyBatis-Plus的自动分页功能,而是手动实现分页查询:
|
|
||||||
1. 直接调用`ticketService.countTickets`方法获取总记录数
|
|
||||||
2. 手动构建查询条件
|
|
||||||
3. 确保COUNT查询和实际查询使用完全相同的条件
|
|
||||||
|
|
||||||
## 修复步骤
|
|
||||||
1. 修改`TicketAppServiceImpl.java`中的`listTicket`方法
|
|
||||||
2. 手动实现分页查询,包括:
|
|
||||||
- 构建查询条件
|
|
||||||
- 调用`countTickets`获取总记录数
|
|
||||||
- 调用`selectTicketList`获取分页数据
|
|
||||||
- 手动组装分页结果
|
|
||||||
3. 测试修复后的功能,确保专家号能正确显示全部5条记录
|
|
||||||
|
|
||||||
## 代码修改点
|
|
||||||
- 文件:`d:/work/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointmentmanage/appservice/impl/TicketAppServiceImpl.java`
|
|
||||||
- 方法:`listTicket`
|
|
||||||
- 修改内容:替换MyBatis-Plus的自动分页,改为手动分页实现
|
|
||||||
|
|
||||||
## 预期效果
|
|
||||||
修复后,COUNT查询和实际查询将使用完全相同的条件,COUNT查询将返回正确的总记录数(5条),前端能显示所有5条专家号记录。
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
## 问题分析
|
|
||||||
根据日志和代码分析,发现号源列表显示"没有更多数据了"的问题原因:
|
|
||||||
|
|
||||||
1. **后端查询正常**:成功查询到5条符合条件的专家号源记录
|
|
||||||
2. **数据转换失败**:在`convertToDto`方法中,`fee`字段类型转换错误
|
|
||||||
3. **响应返回空列表**:由于转换异常,最终返回给前端的号源列表为空
|
|
||||||
|
|
||||||
## 问题根源
|
|
||||||
- `Ticket`实体类的`fee`字段为**BigDecimal类型**(数据库存储)
|
|
||||||
- `TicketDto`类的`fee`字段为**String类型**(前端展示)
|
|
||||||
- 在`convertToDto`方法中,直接将BigDecimal类型的`fee`赋值给String类型的`fee`,导致**ClassCastException**
|
|
||||||
|
|
||||||
## 修复方案
|
|
||||||
修改`TicketAppServiceImpl.java`文件中的`convertToDto`方法,将BigDecimal类型的`fee`转换为String类型:
|
|
||||||
|
|
||||||
```java
|
|
||||||
// 原代码
|
|
||||||
dto.setFee(ticket.getFee());
|
|
||||||
|
|
||||||
// 修复后代码
|
|
||||||
dto.setFee(ticket.getFee().toString());
|
|
||||||
```
|
|
||||||
|
|
||||||
## 预期效果
|
|
||||||
1. 修复后,后端能成功将`Ticket`实体转换为`TicketDto`
|
|
||||||
2. 前端能接收到包含5条专家号源的完整列表
|
|
||||||
3. 页面显示正常,不再出现"没有更多数据了"的提示
|
|
||||||
|
|
||||||
## 验证方法
|
|
||||||
1. 重新启动项目,访问号源管理页面
|
|
||||||
2. 选择"专家号"类型,查看是否能正确显示5条号源记录
|
|
||||||
3. 检查日志,确认没有类型转换异常
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# 修复门诊预约界面专家号查询问题
|
|
||||||
|
|
||||||
## 问题分析
|
|
||||||
从日志中发现关键问题:
|
|
||||||
- 前端传递的ticket_type值是英文:`general` (普通号) 和 `expert` (专家号)
|
|
||||||
- 数据库中存储的ticket_type值是中文:`普通` 和 `专家`
|
|
||||||
- 导致查询条件不匹配,无法查询到数据
|
|
||||||
|
|
||||||
## 解决方案
|
|
||||||
需要在后端添加类型映射转换,将前端传递的英文类型转换为数据库中存储的中文类型。
|
|
||||||
|
|
||||||
## 修复步骤
|
|
||||||
1. 修改 `TicketAppServiceImpl.java` 文件,在处理type参数时添加映射转换逻辑
|
|
||||||
2. 添加从英文类型到中文类型的映射关系
|
|
||||||
3. 测试修复后的功能,确保普通号和专家号都能正确查询
|
|
||||||
|
|
||||||
## 代码修改点
|
|
||||||
- 文件:`d:/work/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointmentmanage/appservice/impl/TicketAppServiceImpl.java`
|
|
||||||
- 方法:`listTicket` 中的type参数处理部分
|
|
||||||
- 修改内容:添加类型映射转换,将 "general" 转换为 "普通","expert" 转换为 "专家"
|
|
||||||
|
|
||||||
## 预期效果
|
|
||||||
修复后,前端选择"普通号"或"专家号"时,系统能正确查询到对应的号源数据,不再出现"没有更多数据了"的提示。
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
**问题分析**:
|
|
||||||
后端返回的响应格式是`{code: 200, msg: "操作成功", data: {total: 5, limit: 20, page: 1, list: [5条记录]}}`,而前端可能期望直接访问`list`属性,导致只能显示1条数据。
|
|
||||||
|
|
||||||
**修复方案**:
|
|
||||||
|
|
||||||
1. 修改`TicketAppServiceImpl.java`的`listTicket`方法,确保返回的分页数据格式正确
|
|
||||||
2. 调整响应结构,使其更符合前端期望
|
|
||||||
3. 保持与现有代码的兼容性
|
|
||||||
|
|
||||||
**修改点**:
|
|
||||||
|
|
||||||
* `TicketAppServiceImpl.java`:优化`listTicket`方法的响应格式
|
|
||||||
|
|
||||||
* 确保分页信息和列表数据都能正确返回给前端
|
|
||||||
|
|
||||||
**预期效果**:
|
|
||||||
|
|
||||||
* 后端返回正确格式的响应数据
|
|
||||||
|
|
||||||
* 前端能够正确显示所有5条专家号数据
|
|
||||||
|
|
||||||
* 保持与现有代码的兼容性
|
|
||||||
|
|
||||||
91
BUGFIX_ANALYSIS.md
Normal file
91
BUGFIX_ANALYSIS.md
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# Bug 根因分析与修复方案
|
||||||
|
|
||||||
|
## Bug 335 - 门诊医生站开立药品医嘱保存报错
|
||||||
|
|
||||||
|
### 问题分析
|
||||||
|
根据代码分析,`DoctorStationAdviceAppServiceImpl.saveAdvice()` 方法处理药品医嘱保存时可能报错的原因:
|
||||||
|
|
||||||
|
1. **patientId/encounterId 为 null** - 删除操作时前端可能未传
|
||||||
|
2. **accountId 为 null** - 患者账户信息未正确获取
|
||||||
|
3. **definitionId/definitionDetailId 为 null** - 定价信息缺失
|
||||||
|
4. **库存校验失败** - 药品库存不足
|
||||||
|
|
||||||
|
### 修复方案
|
||||||
|
✅ 已部分修复(见代码中的 BugFix 注释)
|
||||||
|
- 已添加 patientId/encounterId 自动补全逻辑
|
||||||
|
- 已添加 accountId 自动创建逻辑
|
||||||
|
- 需要进一步验证 definitionId 的处理
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug 336 - 门诊医生站开立诊疗项目保存报错
|
||||||
|
|
||||||
|
### 问题分析
|
||||||
|
诊疗项目保存与药品类似,但有以下特殊点:
|
||||||
|
|
||||||
|
1. **必须选择执行科室** - 代码中有校验 `throw new ServiceException("诊疗项目必须选择执行科室")`
|
||||||
|
2. **活动绑定设备处理** - 需要处理 `handService()` 中的设备绑定逻辑
|
||||||
|
3. **库存校验** - 诊疗项目可能关联耗材
|
||||||
|
|
||||||
|
### 修复方案
|
||||||
|
- 确保前端传递 executeDeptId(执行科室)
|
||||||
|
- 检查 handService() 方法中的异常处理
|
||||||
|
- 添加更详细的错误日志
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug 338 - 门诊划价新增时未校验就诊记录及诊断记录
|
||||||
|
|
||||||
|
### 问题分析
|
||||||
|
**这是患者安全问题!** 未接诊患者也可新增划价项目可能导致:
|
||||||
|
- 收费错误
|
||||||
|
- 医疗纠纷
|
||||||
|
- 数据不一致
|
||||||
|
|
||||||
|
当前代码问题:
|
||||||
|
- `OutpatientPricingAppServiceImpl.getAdviceBaseInfo()` 仅查询医嘱,未校验就诊状态
|
||||||
|
- 前端划价保存接口未找到(可能在其他地方)
|
||||||
|
|
||||||
|
### 修复方案
|
||||||
|
1. 在划价查询时增加就诊状态校验
|
||||||
|
2. 在划价保存时增加诊断记录校验
|
||||||
|
3. 未接诊患者禁止划价
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug 339 - 药房筛选条件失效
|
||||||
|
|
||||||
|
### 问题分析
|
||||||
|
查询结果中包含非选中药房的数据,可能原因:
|
||||||
|
- SQL WHERE 条件未正确应用 locationId
|
||||||
|
- 多表关联时过滤条件丢失
|
||||||
|
|
||||||
|
### 修复方案
|
||||||
|
- 检查 `DoctorStationAdviceAppMapper.getAdviceBaseInfo()` 的 SQL
|
||||||
|
- 确保 locationId 条件正确应用
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 修复优先级
|
||||||
|
|
||||||
|
1. **Bug 338** - 患者安全问题,最高优先级
|
||||||
|
2. **Bug 335/336** - 核心功能阻断,高优先级
|
||||||
|
3. **Bug 339** - 数据准确性问题,中优先级
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 测试用例
|
||||||
|
|
||||||
|
### Bug 338 测试
|
||||||
|
1. 选择未接诊患者,尝试划价 → 应禁止
|
||||||
|
2. 选择已接诊但无诊断的患者,尝试划价 → 应提示补充诊断
|
||||||
|
3. 选择正常接诊患者,划价 → 应成功
|
||||||
|
|
||||||
|
### Bug 335/336 测试
|
||||||
|
1. 门诊医生站开立药品医嘱 → 应成功保存
|
||||||
|
2. 门诊医生站开立诊疗项目 → 应成功保存
|
||||||
|
3. 签发医嘱 → 应成功
|
||||||
|
|
||||||
|
### Bug 339 测试
|
||||||
|
1. 选择"西药房"筛选 → 结果应仅包含西药房数据
|
||||||
|
2. 选择"中药房"筛选 → 结果应仅包含中药房数据
|
||||||
84
BUGFIX_PLAN.md
Normal file
84
BUGFIX_PLAN.md
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
# HIS 系统 Bug 修复计划
|
||||||
|
|
||||||
|
## 修复负责人
|
||||||
|
华佗 (AI 团队)
|
||||||
|
|
||||||
|
## 修复时间
|
||||||
|
2026-04-05 开始
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug 清单与修复优先级
|
||||||
|
|
||||||
|
### 🔴 高优先级(核心业务阻断)
|
||||||
|
|
||||||
|
#### Bug 335 - 门诊医生站开立药品医嘱保存报错
|
||||||
|
- **模块**: 医生工作站
|
||||||
|
- **文件**: `DoctorStationAdviceAppServiceImpl.java`
|
||||||
|
- **根因分析**: 待分析
|
||||||
|
- **修复状态**: 🔄 分析中
|
||||||
|
|
||||||
|
#### Bug 336 - 门诊医生站开立诊疗项目保存报错
|
||||||
|
- **模块**: 医生工作站
|
||||||
|
- **文件**: `DoctorStationAdviceAppServiceImpl.java`
|
||||||
|
- **根因分析**: 待分析
|
||||||
|
- **修复状态**: ⏳ 等待 335 修复后验证
|
||||||
|
|
||||||
|
#### Bug 338 - 门诊划价新增时未校验就诊记录及诊断记录
|
||||||
|
- **模块**: 门诊收费
|
||||||
|
- **问题**: 未接诊患者也可新增划价项目(患者安全问题)
|
||||||
|
- **修复方案**: 在划价保存前增加就诊状态和诊断记录校验
|
||||||
|
- **修复状态**: ⏳ 待修复
|
||||||
|
|
||||||
|
### 🟡 中优先级(数据准确性/用户体验)
|
||||||
|
|
||||||
|
#### Bug 339 - 药房筛选条件失效
|
||||||
|
- **模块**: 药房药库报表管理
|
||||||
|
- **问题**: 查询结果中包含非选中药房的数据
|
||||||
|
- **修复状态**: ⏳ 待分析
|
||||||
|
|
||||||
|
#### Bug 333 - 耗材医嘱类型错误
|
||||||
|
- **模块**: 医生工作站
|
||||||
|
- **问题**: 类型误转为"中成药"且保存报错
|
||||||
|
- **修复状态**: ⏳ 待分析
|
||||||
|
|
||||||
|
#### Bug 337 - 挂号时间显示异常
|
||||||
|
- **模块**: 建档挂号管理
|
||||||
|
- **问题**: 未显示当前实际挂号时间
|
||||||
|
- **修复状态**: ⏳ 待分析
|
||||||
|
|
||||||
|
#### Bug 334 - 检验申请界面布局优化
|
||||||
|
- **模块**: 门诊医生工作站
|
||||||
|
- **问题**: 按钮布局需要调整
|
||||||
|
- **修复状态**: ⏳ 待修复(前端)
|
||||||
|
|
||||||
|
### 🟢 低优先级(历史遗留问题)
|
||||||
|
|
||||||
|
#### Bug 249/253/280/300 - 3 月份遗留 bug
|
||||||
|
- **修复状态**: ⏳ 后续处理
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 修复流程
|
||||||
|
|
||||||
|
1. **分析根因** - 查看代码和日志,定位问题
|
||||||
|
2. **编写修复** - 修改代码并添加必要校验
|
||||||
|
3. **本地测试** - 确保修复有效且不引入新问题
|
||||||
|
4. **提交代码** - commit 并推送到 gitea
|
||||||
|
5. **验证关闭** - 在禅道更新 Bug 状态
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 测试要求
|
||||||
|
|
||||||
|
- 修复后必须测试
|
||||||
|
- 测试不通过继续修
|
||||||
|
- 确保不影响其他功能
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 备注
|
||||||
|
|
||||||
|
- 所有修复基于 develop 分支
|
||||||
|
- 修复完成后统一提交
|
||||||
|
- 重要修复添加详细注释
|
||||||
163
BUG_355_ANALYSIS.md
Normal file
163
BUG_355_ANALYSIS.md
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
# Bug #355 - 性别字段回显不一致分析与修复
|
||||||
|
|
||||||
|
## 问题描述
|
||||||
|
门诊挂号页面的预约签到弹窗中,患者"随自核"的性别显示为"未知",但挂号界面载入后显示为"男性",数据不一致。
|
||||||
|
|
||||||
|
## 根本原因
|
||||||
|
|
||||||
|
### 数据流程分析
|
||||||
|
|
||||||
|
1. **预约签到弹窗数据来源** (`TicketAppServiceImpl.listTicket()`)
|
||||||
|
- SQL 查询 (ScheduleSlotMapper.xml 第97行):
|
||||||
|
```sql
|
||||||
|
COALESCE(CAST(o.gender AS VARCHAR), CAST(pinfo.gender_enum AS VARCHAR)) AS patientGender
|
||||||
|
```
|
||||||
|
- 后端逻辑 (TicketAppServiceImpl.java 第140-145行):
|
||||||
|
```java
|
||||||
|
if (raw.getPatientGender() != null) {
|
||||||
|
String pg = raw.getPatientGender().trim();
|
||||||
|
dto.setGender("1".equals(pg) ? "男" : ("2".equals(pg) ? "女" : "未知"));
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **挂号界面数据来源** (OutpatientRegistrationAppServiceImpl)
|
||||||
|
- 直接从 `adm_patient` 表查询患者最新信息
|
||||||
|
- 性别字段: `pinfo.gender_enum`
|
||||||
|
- 翻译为文本: `EnumUtils.getInfoByValue(AdministrativeGender.class, genderEnum)`
|
||||||
|
|
||||||
|
### 问题定位
|
||||||
|
|
||||||
|
**关键 SQL 逻辑问题:**
|
||||||
|
- `order_main.gender` 字段存储的是订单创建时的性别值(varchar 类型)
|
||||||
|
- `adm_patient.gender_enum` 字段存储的是患者最新性别(integer 类型)
|
||||||
|
- 当 `order_main.gender` 为 `NULL` 时,SQL 会回退到 `pinfo.gender_enum`
|
||||||
|
|
||||||
|
**可能的场景:**
|
||||||
|
1. 订单创建时未保存性别字段 (`order_main.gender` = NULL)
|
||||||
|
2. 患者档案中的性别被修改过(但订单表未同步更新)
|
||||||
|
3. `pinfo.gender_enum` 值为 NULL 或者不合法
|
||||||
|
|
||||||
|
## 修复方案
|
||||||
|
|
||||||
|
### 方案1:修正 SQL 查询逻辑 (推荐)
|
||||||
|
|
||||||
|
**问题:** 当 `order_main.gender` 为 NULL 时,SQL 正确回退到 `pinfo.gender_enum`,但 Java 代码中对 `patientGender` 的处理逻辑有问题。
|
||||||
|
|
||||||
|
**修复步骤:**
|
||||||
|
|
||||||
|
1. 修改 SQL,直接从患者表获取性别,不依赖订单表的 gender 字段:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- ScheduleSlotMapper.xml
|
||||||
|
LEFT JOIN adm_patient pinfo ON o.patient_id = pinfo.id
|
||||||
|
-- 性别字段直接从患者表获取,避免订单表 gender 字段为空的情况
|
||||||
|
pinfo.gender_enum AS genderEnum,
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 修改 Java 代码,直接使用 `genderEnum` 字段:
|
||||||
|
|
||||||
|
```java
|
||||||
|
// TicketAppServiceImpl.java
|
||||||
|
// 性别处理:直接使用患者表中的 gender_enum
|
||||||
|
Integer genderEnum = raw.getGenderEnum();
|
||||||
|
if (genderEnum != null) {
|
||||||
|
if (Integer.valueOf(1).equals(genderEnum)) {
|
||||||
|
dto.setGender("男");
|
||||||
|
} else if (Integer.valueOf(2).equals(genderEnum)) {
|
||||||
|
dto.setGender("女");
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方案2:确保订单表 gender 字段不为空
|
||||||
|
|
||||||
|
在订单创建时,确保将患者的性别同步到订单表的 `gender` 字段。
|
||||||
|
|
||||||
|
## 临时验证方案
|
||||||
|
|
||||||
|
在数据库中执行以下 SQL 检查患者"随自核"的数据:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- 检查患者档案中的性别
|
||||||
|
SELECT id, name, gender_enum,
|
||||||
|
CASE gender_enum
|
||||||
|
WHEN 1 THEN '男'
|
||||||
|
WHEN 2 THEN '女'
|
||||||
|
ELSE '未知'
|
||||||
|
END as gender_text
|
||||||
|
FROM adm_patient
|
||||||
|
WHERE name = '随自核';
|
||||||
|
|
||||||
|
-- 检查订单表中的性别
|
||||||
|
SELECT o.id, o.patient_id, o.patient_name, o.gender, p.gender_enum
|
||||||
|
FROM order_main o
|
||||||
|
LEFT JOIN adm_patient p ON o.patient_id = p.id
|
||||||
|
WHERE o.patient_name = '随自核';
|
||||||
|
|
||||||
|
-- 检查号源数据
|
||||||
|
SELECT s.id, s.pool_id, s.status as slot_status
|
||||||
|
FROM adm_schedule_slot s
|
||||||
|
WHERE EXISTS (
|
||||||
|
SELECT 1 FROM order_main o WHERE o.slot_id = s.id
|
||||||
|
AND o.patient_name = '随自核'
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 修复代码
|
||||||
|
|
||||||
|
### 修改 ScheduleSlotMapper.xml
|
||||||
|
|
||||||
|
在 `selectTicketSlotsPage` SQL 中,将患者性别字段改为直接从患者表获取:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<!-- 原来的 SQL (第97行) -->
|
||||||
|
COALESCE(CAST(o.gender AS VARCHAR), CAST(pinfo.gender_enum AS VARCHAR)) AS patientGender,
|
||||||
|
|
||||||
|
<!-- 修改后的 SQL -->
|
||||||
|
pinfo.gender_enum AS genderEnum,
|
||||||
|
```
|
||||||
|
|
||||||
|
### 修改 TicketAppServiceImpl.java
|
||||||
|
|
||||||
|
在 `listTicket` 方法中修改性别处理逻辑:
|
||||||
|
|
||||||
|
```java
|
||||||
|
// 原来的代码 (第140-145行)
|
||||||
|
// 性别处理:直接读取优先级最高的订单性别字段 (SQL 已处理优先级)
|
||||||
|
if (raw.getPatientGender() != null) {
|
||||||
|
String pg = raw.getPatientGender().trim();
|
||||||
|
dto.setGender("1".equals(pg) ? "男" : ("2".equals(pg) ? "女" : "未知"));
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改后的代码
|
||||||
|
// 性别处理:直接使用患者表中的 gender_enum
|
||||||
|
Integer genderEnum = raw.getGenderEnum();
|
||||||
|
if (genderEnum != null) {
|
||||||
|
if (Integer.valueOf(1).equals(genderEnum)) {
|
||||||
|
dto.setGender("男");
|
||||||
|
} else if (Integer.valueOf(2).equals(genderEnum)) {
|
||||||
|
dto.setGender("女");
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 验证步骤
|
||||||
|
|
||||||
|
1. 修复代码后,重新编译部署
|
||||||
|
2. 打开预约签到弹窗,查找患者"随自核"
|
||||||
|
3. 确认性别字段显示为"男性"
|
||||||
|
4. 进行挂号操作
|
||||||
|
5. 确认挂号界面显示的性别也是"男性"
|
||||||
|
6. 两者应该保持一致
|
||||||
117
BUG_355_FIX.md
Normal file
117
BUG_355_FIX.md
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# Bug #355 修复代码
|
||||||
|
|
||||||
|
## 修改文件清单
|
||||||
|
|
||||||
|
| 序号 | 文件路径 | 修改类型 | 说明 |
|
||||||
|
|------|---------|---------|------|
|
||||||
|
| 1 | `his-source/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/ScheduleSlotMapper.xml` | SQL 查询修改 | 性别字段直接从患者表获取 |
|
||||||
|
| 2 | `his-source/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointmentmanage/appservice/impl/TicketAppServiceImpl.java` | Java 代码修改 | 性别处理逻辑修改 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 修复步骤
|
||||||
|
|
||||||
|
### 修改 1: ScheduleSlotMapper.xml
|
||||||
|
|
||||||
|
**文件:** `his-source/openhis-server-new/openhis-domain/src/main/resources/mapper/administration/ScheduleSlotMapper.xml`
|
||||||
|
|
||||||
|
**修改位置:** 第97行
|
||||||
|
|
||||||
|
**修改前:**
|
||||||
|
```xml
|
||||||
|
COALESCE(CAST(o.gender AS VARCHAR), CAST(pinfo.gender_enum AS VARCHAR)) AS patientGender,
|
||||||
|
```
|
||||||
|
|
||||||
|
**修改后:**
|
||||||
|
```xml
|
||||||
|
pinfo.gender_enum AS genderEnum,
|
||||||
|
```
|
||||||
|
|
||||||
|
**说明:** 直接从患者表获取 `gender_enum` 字段,避免订单表 `gender` 字段为 NULL 导致的数据不一致。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 修改 2: TicketAppServiceImpl.java
|
||||||
|
|
||||||
|
**文件:** `his-source/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointmentmanage/appservice/impl/TicketAppServiceImpl.java`
|
||||||
|
|
||||||
|
**修改位置:** 第140-145行
|
||||||
|
|
||||||
|
**修改前:**
|
||||||
|
```java
|
||||||
|
// 性别处理:直接读取优先级最高的订单性别字段 (SQL 已处理优先级)
|
||||||
|
if (raw.getPatientGender() != null) {
|
||||||
|
String pg = raw.getPatientGender().trim();
|
||||||
|
dto.setGender("1".equals(pg) ? "男" : ("2".equals(pg) ? "女" : "未知"));
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**修改后:**
|
||||||
|
```java
|
||||||
|
// 性别处理:直接使用患者表中的 gender_enum
|
||||||
|
Integer genderEnum = raw.getGenderEnum();
|
||||||
|
if (genderEnum != null) {
|
||||||
|
if (Integer.valueOf(1).equals(genderEnum)) {
|
||||||
|
dto.setGender("男");
|
||||||
|
} else if (Integer.valueOf(2).equals(genderEnum)) {
|
||||||
|
dto.setGender("女");
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**说明:** 由于 SQL 查询已直接获取 `gender_enum` 字段,这里修改为直接使用该字段进行性别转换。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 额外修改 (可选)
|
||||||
|
|
||||||
|
如果需要同时修改 `selectTicketSlotsPage` 的其他字段,确保这些字段也被正确映射到 DTO:
|
||||||
|
|
||||||
|
### 修改 TicketSlotDTO.java
|
||||||
|
|
||||||
|
**文件:** `his-source/openhis-server-new/openhis-domain/src/main/java/com/openhis/appointmentmanage/domain/TicketSlotDTO.java`
|
||||||
|
|
||||||
|
**修改:** 添加 `genderEnum` 字段
|
||||||
|
|
||||||
|
```java
|
||||||
|
private Integer genderEnum;
|
||||||
|
|
||||||
|
public Integer getGenderEnum() {
|
||||||
|
return genderEnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGenderEnum(Integer genderEnum) {
|
||||||
|
this.genderEnum = genderEnum;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 编译部署
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd his-source/openhis-server-new
|
||||||
|
mvn clean package -DskipTests
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 回归测试
|
||||||
|
|
||||||
|
| 测试项 | 预期结果 | 状态 |
|
||||||
|
|--------|---------|------|
|
||||||
|
| 预约签到弹窗性别显示 | 显示患者真实性别(男/女/未知) | 待测试 |
|
||||||
|
| 挂号界面性别显示 | 显示患者真实性别(男/女/未知) | 待测试 |
|
||||||
|
| 两者性别数据一致性 | 完全一致 | 待测试 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**修复人:** 关羽
|
||||||
|
**修复日期:** 2026-04-08
|
||||||
|
**BUG ID:** #355
|
||||||
65
BUG_355_FIX_NOTES.md
Normal file
65
BUG_355_FIX_NOTES.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# BUG #355 - 修复备注
|
||||||
|
|
||||||
|
## 修复日期
|
||||||
|
2026-04-08
|
||||||
|
|
||||||
|
## 修复人
|
||||||
|
关羽 (guanyu)
|
||||||
|
|
||||||
|
## 修复内容
|
||||||
|
|
||||||
|
### 问题描述
|
||||||
|
门诊挂号页面的预约签到弹窗中,患者"随自核"的性别显示为"未知",但挂号界面载入后显示为"男性",数据不一致。
|
||||||
|
|
||||||
|
### 根本原因
|
||||||
|
- 预约签到弹窗数据来自 `TicketAppServiceImpl.listTicket()` 方法
|
||||||
|
- SQL 查询中使用了订单表的 `gender` 字段(可能为 NULL)
|
||||||
|
- 当订单表 `gender` 为 NULL 时,虽然 SQL 回退到患者表 `gender_enum`,但 Java 代码处理逻辑仍有问题
|
||||||
|
- 导致性别显示不一致
|
||||||
|
|
||||||
|
### 修复方案
|
||||||
|
修改 `TicketAppServiceImpl.java` 中的性别处理逻辑:
|
||||||
|
- 将 `raw.getPatientGender()` 改为 `raw.getGenderEnum()`
|
||||||
|
- 直接使用患者表中的 `gender_enum` 字段进行性别转换
|
||||||
|
- 确保与挂号界面查询的数据来源一致
|
||||||
|
|
||||||
|
### 修改文件
|
||||||
|
- `his-source/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointmentmanage/appservice/impl/TicketAppServiceImpl.java`
|
||||||
|
|
||||||
|
### 代码变更
|
||||||
|
```java
|
||||||
|
// 修改前
|
||||||
|
if (raw.getPatientGender() != null) {
|
||||||
|
String pg = raw.getPatientGender().trim();
|
||||||
|
dto.setGender("1".equals(pg) ? "男" : ("2".equals(pg) ? "女" : "未知"));
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改后
|
||||||
|
Integer genderEnum = raw.getGenderEnum();
|
||||||
|
if (genderEnum != null) {
|
||||||
|
if (Integer.valueOf(1).equals(genderEnum)) {
|
||||||
|
dto.setGender("男");
|
||||||
|
} else if (Integer.valueOf(2).equals(genderEnum)) {
|
||||||
|
dto.setGender("女");
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dto.setGender("未知");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Git 提交
|
||||||
|
- Commit: `7827e58a`
|
||||||
|
- 分支: `develop`
|
||||||
|
|
||||||
|
### 测试建议
|
||||||
|
1. 更新 Git 代码
|
||||||
|
2. 编译部署后进行测试
|
||||||
|
3. 验证预约签到弹窗和挂号界面的性别字段是否一致
|
||||||
|
|
||||||
|
### 状态
|
||||||
|
✅ 代码修复完成,已提交到远程仓库
|
||||||
|
⏳ 等待测试验证
|
||||||
32
BUG_362_ANALYSIS.md
Normal file
32
BUG_362_ANALYSIS.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Bug 362 - 入科时间显示错误分析
|
||||||
|
|
||||||
|
## 问题描述
|
||||||
|
双击查看详情时显示当前系统时间,而不是正确的入科时间。
|
||||||
|
|
||||||
|
## 当前分析状态
|
||||||
|
|
||||||
|
### 已确认
|
||||||
|
1. **前端显示逻辑正确**: 患者详情对话框直接显示后端返回的 `admissionDate` 字段
|
||||||
|
2. **后端数据来源正确**: 从 `adm_encounter.start_time` 获取入院时间
|
||||||
|
3. **字段绑定正确**: 前端表格和详情都使用 `admissionDate` 字段
|
||||||
|
|
||||||
|
### 可能原因
|
||||||
|
1. **数据库数据问题**: `adm_encounter.start_time` 字段本身存储的是当前系统时间
|
||||||
|
2. **概念混淆**: 用户期望看到"入科时间",但系统显示的是"入院时间"
|
||||||
|
3. **前端缓存问题**: 某些情况下前端缓存了错误的时间值
|
||||||
|
|
||||||
|
### 调试措施
|
||||||
|
1. **已添加调试日志**: 在患者详情对话框中添加 `console.log` 输出 `admissionDate` 值
|
||||||
|
2. **需要验证**: 实际测试时查看浏览器控制台输出,确认具体值
|
||||||
|
|
||||||
|
### 下一步计划
|
||||||
|
1. **等待测试结果**: 通过调试日志确认实际显示的值
|
||||||
|
2. **根据结果修复**:
|
||||||
|
- 如果是数据问题:修复后端数据录入逻辑
|
||||||
|
- 如果是概念问题:添加入科时间字段并修改显示
|
||||||
|
- 如果是缓存问题:清理前端缓存逻辑
|
||||||
|
|
||||||
|
## 临时解决方案
|
||||||
|
如果确认是数据问题,可以先在前端添加时间有效性检查,避免显示明显错误的时间。
|
||||||
|
|
||||||
|
正在自主分析中!
|
||||||
35
BUG_362_FIX_COMPLETE.md
Normal file
35
BUG_362_FIX_COMPLETE.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Bug 362 - 入科时间显示错误修复完成
|
||||||
|
|
||||||
|
## 问题根因
|
||||||
|
用户期望看到 **入科时间**,但系统显示的是 **入院时间**。
|
||||||
|
|
||||||
|
- **入院时间**: `adm_encounter.start_time` (办理住院手续的时间)
|
||||||
|
- **入科时间**: `adm_encounter_location.start_time` (进入具体科室的时间)
|
||||||
|
|
||||||
|
## 修复方案
|
||||||
|
|
||||||
|
### 后端修改
|
||||||
|
1. **DTO类添加字段**:
|
||||||
|
- `NursingPageDto.wardAdmissionDate`
|
||||||
|
- `PatientHomeDto.wardAdmissionDate`
|
||||||
|
2. **SQL查询添加字段**:
|
||||||
|
- `NursingRecordAppMapper.xml`: 添加入科时间查询
|
||||||
|
- `PatientHomeAppMapper.xml`: 添加入科时间子查询
|
||||||
|
|
||||||
|
### 前端修改
|
||||||
|
1. **患者列表**: 将"入院日期"改为"入科日期",绑定到 `wardAdmissionDate`
|
||||||
|
2. **患者详情对话框**: 将"入院日期"改为"入科日期",绑定到 `wardAdmissionDate`
|
||||||
|
3. **患者卡片**: 将"入院"改为"入科",显示 `wardAdmissionDate`
|
||||||
|
4. **体温单界面**: 使用 `wardAdmissionDate` 作为入科时间
|
||||||
|
|
||||||
|
## 验证步骤
|
||||||
|
1. 双击患者查看详情,确认显示的是入科时间而非入院时间
|
||||||
|
2. 患者列表中"入科日期"列显示正确时间
|
||||||
|
3. 患者卡片显示正确的入科时间
|
||||||
|
4. 体温单界面使用正确的入科时间
|
||||||
|
|
||||||
|
## 修复状态
|
||||||
|
✅ 已修复并提交到远程仓库
|
||||||
|
|
||||||
|
---
|
||||||
|
赵云:Bug 362已修复!
|
||||||
29
BUG_364_362_ANALYSIS.md
Normal file
29
BUG_364_362_ANALYSIS.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Bug 364/362 - 住院护士站任务分析
|
||||||
|
|
||||||
|
## Bug分配确认
|
||||||
|
|
||||||
|
### Bug #364 - 住院护士站三测单病历号检索失败
|
||||||
|
**状态**: ⏳ 待分析
|
||||||
|
**分析人**: 赵云
|
||||||
|
**预计完成**: 今日内
|
||||||
|
|
||||||
|
### Bug #362 - 住院护士站入科时间显示错误
|
||||||
|
**状态**: ⏳ 待分析
|
||||||
|
**分析人**: 赵云
|
||||||
|
**预计完成**: 今日内
|
||||||
|
|
||||||
|
### Bug #363 - 住院管理入院时间校验
|
||||||
|
**状态**: ✅ 已分配给关羽
|
||||||
|
**理由**: 此为后端业务逻辑问题,应由后端开发处理
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 当前进度(2026-04-08 23:17)
|
||||||
|
|
||||||
|
赵云正在分析这两个前端Bug,已定位相关代码位置:
|
||||||
|
- 住院护士站主界面: `inpatientNurse/home/index.vue`
|
||||||
|
- 三测单相关: `action/nurseStation/temperatureSheet/`
|
||||||
|
|
||||||
|
正在查找病历号检索和入科时间显示的具体实现。
|
||||||
|
|
||||||
|
子龙领命!
|
||||||
51
BUG_364_362_FIX.md
Normal file
51
BUG_364_362_FIX.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# Bug 364/362 - 问题分析与修复方案
|
||||||
|
|
||||||
|
## Bug #364 - 住院护士站三测单病历号检索失败 ✅ 已修复
|
||||||
|
|
||||||
|
### 问题根因
|
||||||
|
前端表格列定义错误,将"病历号"列绑定到了 `encounterId` (就诊ID) 而不是 `patientBusNo` (病历号)。
|
||||||
|
|
||||||
|
**前端问题** (`tprChart/index.vue`):
|
||||||
|
```vue
|
||||||
|
<el-table-column label="病历号" align="center" prop="encounterId" />
|
||||||
|
```
|
||||||
|
应该改为:
|
||||||
|
```vue
|
||||||
|
<el-table-column label="病历号" align="center" prop="patientBusNo" />
|
||||||
|
```
|
||||||
|
|
||||||
|
### 解决方案
|
||||||
|
修改前端表格列定义,将病历号列绑定到正确的字段。
|
||||||
|
|
||||||
|
**修复状态**: ✅ 已修复并提交
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug #362 - 住院护士站入科时间显示错误 ⏳ 分析中
|
||||||
|
|
||||||
|
### 问题根因
|
||||||
|
在 `PatientHomeAppMapper.xml` 中,入院时间从 `adm_encounter.start_time` 获取:
|
||||||
|
```xml
|
||||||
|
T2.start_time AS admissionDate, -- 入院日期
|
||||||
|
```
|
||||||
|
|
||||||
|
这个字段是正确的入院时间。Bug描述"双击查看详情时显示当前系统时间"可能是因为:
|
||||||
|
1. 某些情况下前端缓存了错误的日期
|
||||||
|
2. 或者用户看到的是"住院天数"的计算基时间
|
||||||
|
|
||||||
|
### 解决方案
|
||||||
|
确认前端显示的确实是 `admissionDate` 字段,而不是其他时间字段。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 修复计划
|
||||||
|
|
||||||
|
### Bug 364
|
||||||
|
1. ✅ 修改 `tprChart/index.vue` 中的病历号列绑定
|
||||||
|
2. ⏳ 测试验证检索功能
|
||||||
|
|
||||||
|
### Bug 362
|
||||||
|
1. ⏳ 检查前端显示逻辑
|
||||||
|
2. ⏳ 确认数据来源正确
|
||||||
|
|
||||||
|
赵云:Bug 364已修复。Bug 362正在分析中。
|
||||||
61
BUG_FIX_PROGRESS.md
Normal file
61
BUG_FIX_PROGRESS.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# HIS项目 Bug修复与需求开发进度表
|
||||||
|
|
||||||
|
## 项目信息
|
||||||
|
- **项目名称**: 开源HIS改造落地
|
||||||
|
- **当前分支**: develop
|
||||||
|
- **代码路径**:
|
||||||
|
- 前端: openhis-ui-vue3
|
||||||
|
- 后端: openhis-server-new
|
||||||
|
- ** Git仓库**: https://gitea.gentronhealth.com/wangyizhe/his
|
||||||
|
- **禅道地址**: https://zentao.gentronhealth.com
|
||||||
|
|
||||||
|
## 当前状态
|
||||||
|
- ✅ 代码已克隆完成
|
||||||
|
- ✅ Bug 已重新分配(管理员操作)
|
||||||
|
- ⏳ 等待修复人员开始工作
|
||||||
|
- 📋 张飞负责测试验证
|
||||||
|
|
||||||
|
## Bug修复任务列表(重新分配后)
|
||||||
|
|
||||||
|
| Bug ID | 严重程度 | 状态 | 模块 | 标题 | 原指派给 | **新指派给** | 进度 |
|
||||||
|
|--------|----------|------|------|------|----------|--------------|------|
|
||||||
|
| 339 | 3 | 激活 | 药房药库报表管理 | 药房筛选条件失效 | 王怡哲 | **关羽** | 待处理 |
|
||||||
|
| 338 | 3 | 激活 | 门诊收费管理 | 未校验就诊记录 | 王怡哲 | **关羽** | 待处理 |
|
||||||
|
| 337 | 3 | 激活 | 建档挂号管理 | 挂号时间显示异常 | 王怡哲 | **关羽** | 待处理 |
|
||||||
|
| 336 | 3 | 激活 | 门诊医生工作站 | 开立诊疗项目保存报错 | 王怡哲 | **关羽** | 待处理 |
|
||||||
|
| 335 | 3 | 激活 | 门诊医生工作站 | 开立药品医嘱保存报错 | 王怡哲 | **关羽** | 待处理 |
|
||||||
|
| 334 | 3 | 激活 | 门诊医生工作站 | 检验申请界面布局优化 | 王建 | **子龙** | 待处理 |
|
||||||
|
| 333 | 3 | 激活 | 门诊医生工作站 | 耗材医嘱类型误转 | 陈显精 | **关羽** | 待处理 |
|
||||||
|
|
||||||
|
## P0 级别 Bug(紧急,优先修复)
|
||||||
|
|
||||||
|
| Bug ID | 标题 | 严重程度 | 负责人 |
|
||||||
|
|--------|------|----------|--------|
|
||||||
|
| 335 | 开立药品医嘱保存报错 | 严重 | 关羽 |
|
||||||
|
| 336 | 开立诊疗项目保存报错 | 严重 | 关羽 |
|
||||||
|
| 338 | 未校验就诊记录 | 严重 | 关羽 |
|
||||||
|
|
||||||
|
## 需求开发任务列表(10个,全部未关闭)
|
||||||
|
|
||||||
|
待进一步确认分配情况...
|
||||||
|
|
||||||
|
## 工作流程
|
||||||
|
1. **认领任务** - 在禅道将 Bug 分配给自己
|
||||||
|
2. **修改代码** - 从 develop 分支创建新分支:`bug/bug-id`
|
||||||
|
3. **本地测试** - 确保本地 JDK 17 环境编译通过
|
||||||
|
4. **提交PR** - 提交 Pull Request 到 develop 分支
|
||||||
|
5. **测试验证** - 张飞进行测试
|
||||||
|
6. **合并分支** - 测试通过后合并到 develop
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
- 所有代码修改必须先创建新分支
|
||||||
|
- 分支命名:`bug/bug-id` 或 `feature/feedback-id`
|
||||||
|
- 提交信息必须包含禅道Bug/需求ID
|
||||||
|
- 修改前请先阅读 `AGENTS.md` 了解项目规范
|
||||||
|
- **JDK 17 配置** - 确保本地开发环境使用 JDK 17
|
||||||
|
|
||||||
|
## 今日会议纪要
|
||||||
|
- 2026-04-05 15:09: 管理员重新分配 Bug 给群内武将
|
||||||
|
- 2026-04-05 14:58: 确认将王怡哲的 Bug 分配给关羽、张飞、陈琳
|
||||||
|
- 2026-04-05 13:47: 统一调度分配人员任务
|
||||||
|
- 2026-04-05 12:45: 初始任务分配完成
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user