forked from freuter/libopc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidate.py
131 lines (122 loc) · 5.58 KB
/
validate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/python
import sys
import os
import getopt
import subprocess
import json
from xml.dom.minidom import parse
global target_mode
# XSD validator from http://www.ltg.ed.ac.uk/~ht/xsv-status.html.
xsv_path="c:\\Program Files\\XSV\\xsv.exe"
if not(os.path.exists(xsv_path)):
print("Can not find \""+xsv_path+"\"");
print("Please download the XSV validator from ")
print("http://www.ltg.ed.ac.uk/~ht/xsv-status.html")
print("and install it in "+os.path.split(xsv_path)[0])
sys.exit(2)
schema_root="http://subversion.assembla.com/svn/IS29500/trunk/"
#schema_root="file:///C:/Projects/schema/trunk/"
validation_matrix={
"image/png": None,
"image/gif": None,
"image/x-wmf": None,
"image/x-emf": None,
"image/jpeg": None,
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/wml.xsd"},
"application/vnd.openxmlformats-officedocument.extended-properties+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/shared-documentPropertiesExtended.xsd"},
"application/vnd.openxmlformats-package.core-properties+xml": {"xsd": schema_root+"Part2/OpenPackagingConventions-XMLSchema/opc-coreProperties.xsd"},
"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/dml-diagram.xsd"},
"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/dml-diagram.xsd"},
"application/vnd.ms-office.drawingml.diagramDrawing+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/dml-diagram.xsd"},
"application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/wml.xsd"},
"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/dml-diagram.xsd"},
"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": {"xsd": schema_root+"Part4/OfficeOpenXML-XMLSchema-Transitional/dml-diagram.xsd"}
}
def validate(path):
print("=== validate: "+path)
tmp_dir=os.path.abspath(os.path.join("win32", target_mode))
mce_extract_path=os.path.abspath(os.path.join("win32", target_mode, "mce_extract.exe"))
if os.path.exists(mce_extract_path):
_args = [ mce_extract_path ]
_args.append(path)
sys.stderr.write("invoking "+os.path.split(_args[0])[1]+" for "+path+"..."); sys.stderr.flush()
p=subprocess.Popen(_args, stdout=subprocess.PIPE)
parts=eval(p.communicate()[0])
for part in parts:
if part["type"] in validation_matrix:
validation_hint=None
validation_hint=validation_matrix[part["type"]]
if not(validation_hint is None):
print "validating "+part["name"]+" of type "+part["type"]
validation_error=True
validation_msg="Internal error invoking validator"
_args = [ mce_extract_path ]
_args.append(path)
_args.append(part["name"])
# _args.append("--understands"); _args.append("http://schemas.microsoft.com/office/word/2010/wordml")
tmp_file=os.path.join(tmp_dir, "temp.xml")
out_file=os.path.join(tmp_dir, "out.xml")
if os.path.exists(tmp_file):
os.remove(tmp_file)
_args.append("--out"); _args.append(tmp_file)
if True or not(os.path.exists(tmp_file)):
sys.stderr.write("invoking "+os.path.split(_args[0])[1]+" for "+part["name"]+"..."); sys.stderr.flush()
ret=subprocess.call(_args)
if os.path.exists(tmp_file):
if os.path.exists(out_file):
os.remove(out_file)
if not(os.path.exists(out_file)):
_args = [ xsv_path ]
_args.append("-o"); _args.append(os.path.relpath(out_file));
_args.append(os.path.relpath(tmp_file).replace('\\', '/'))
_args.append(validation_hint["xsd"])
sys.stderr.write("invoking "+os.path.split(_args[0])[1]+" for "+part["name"]+"..."); sys.stderr.flush()
returncode=subprocess.call(_args)
sys.stderr.write("done\n"); sys.stderr.flush()
if 0==returncode:
result=parse(out_file)
validation_error=not(result.documentElement.tagName == "xsv"
and "true"==result.documentElement.getAttribute("instanceAssessed")
and "0"==result.documentElement.getAttribute("instanceErrors")
and "0"==result.documentElement.getAttribute("schemaErrors"))
else:
validation_msg="error executing "+os.path.split(_args[0])[1]
if validation_error:
validation_msg=result.toxml()
if validation_error:
print "**ERROR validating "+part["name"]
print validation_msg
else:
print "ignoring "+part["name"]+" of type "+part["type"]
else:
print "skipping "+part["name"]+" of type "+part["type"]
sys.stdout.flush()
else:
print "can not find mce_extract tool!"
def usage():
print("usage:")
print(" validate [--target=mode \"debug|release\"] sample.docx")
if __name__ == "__main__":
sys.path.append(os.path.abspath("third_party"))
target_mode=None
input=[]
try:
opts, args = getopt.getopt(sys.argv[1:], "h", ["help", "target=", "generate=", "skip", "type="])
except getopt.GetoptError, err:
# print help information and exit:
print str(err) # will print something like "option -a not recognized"
usage()
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit(0)
elif o in ("--target"):
target_mode=a
elif o in ("--type"):
target_mode=os.path.join(target_mode, a)
if None==target_mode:
print "please specify target mode, e.g. --target=debug"
sys.exit(2)
for f in args:
validate(f)