source: CMIP6dreqbuild/trunk/src/framework/ptxt.py @ 382

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ptxt.py@382
Revision 382, 7.3 KB checked in by mjuckes, 5 years ago (diff)

misc

Line 
1''' Generate vocabulary definition document and sample vocabulary document.
2USAGE
3.....
4ptxt.py [-f srcFile] [samp|defn]
5
6
7NB:
8Schema namespace implemented partially -- need to work through for update and vocabs.
9'''
10import string, re, collections, sys, uuid
11
12if len(sys.argv) == 1:
13  print __doc__
14  exit()
15
16args = sys.argv[1:]
17if args[0] == '-f':
18  srcFn = args[1]
19  args = args[2:]
20elif args[0] == '-v':
21  srcFn = 'vocab.txt'
22  args = args[1:]
23else:
24  srcFn = 'dreq.txt'
25 
26mode = args[0]
27
28assert mode in ["defn", "samp","upd","updsamp"]
29
30re_it = re.compile( '{(.*)}' )
31re_is = re.compile( '\[(.*)\]' )
32re_atdef = re.compile( '^(?P<n>\S+)\s*(((?P<b>\[.*?])|(?P<a>\{.*?\})|(?P<c>\<.*?\>))\s*){0,3}$' )
33re_atdef = re.compile( '^(?P<n>\S+)\s*((\[(?P<b>.*?)\]|\{(?P<a>.*?)\}|\<(?P<c>.*?)\>)\s*){0,3}$' )
34
35### tuble to define attributes of an item
36nt__itematt = collections.namedtuple( 'itematt', ['name','type','title','clss','techn'] )
37
38vocab_elTmpl = '''<table label="%(label)s" title="%(title)s" id="%(id)s" itemLabelMode="%(ilm)s" level="%(sectLevel)s" maxOccurs="%(mxo)s" labUnique="%(labu)s">
39%(itemAttrList)s
40</table>
41'''
42ial_elTmpl = '  <rowAttribute label="%(label)s"%(wrappedType)s%(wrappedTitle)s%(wrappedClass)s%(wrappedTechn)s/>'
43
44expl_Tmpl = '''<%(label)s class="vocab" title="%(title)s" id="%(id)s">
45<!-- <info srcType="dummy" srcRef="ptxt.py">Dummy entries</info> -->
46%(exampleItem)s
47</%(label)s>
48'''
49item_Tmpl = '<item id="%(id)s" label="%(label)s" title="%(title)s"%(extras)s/>'
50
51class vocab(object):
52
53  def __init__( self, line, kk=0 ):
54     bits = map( string.strip, string.split(line, ';' ) )
55     assert len (bits) == 7, '[1] Cannot parse %s' % line
56     assert bits[0][:5] == 'vocab', '[2] Cannot parse %s' % line
57     self.label = string.split(bits[0], ' ')[1]
58     self.title = bits[1]
59     self.id = 'cmip.drv.%3.3i' % kk
60     self.ilt = bits[3]
61     self.level = int(bits[4] )
62     self.kk = kk
63     self.labu = bits[6]
64     self.mxo = int(bits[5])
65     self.msg( '[%s] %s {%s:%s}' % (self.label, self.title, self.id, self.ilt) )
66     self.itematts = [  nt__itematt( 'label','xs:string',None,None,None ),
67                        nt__itematt( 'title','xs:string',None,None,None ) ]
68
69  def tmpl(self,oo=None,mode="defn"):
70     if mode in [ "defn","upd"]:
71       ss = []
72       for i in self.itematts:
73         if i.clss != None:
74           wrappedClass = ' class="%s"' % i.clss
75         else:
76           wrappedClass = ''
77
78         if i.techn != None:
79           wrappedTechn = ' techNote="%s"' % i.techn
80         else:
81           wrappedTechn = ''
82
83         if i.title != None:
84           wrappedTitle = ' title="%s"' % i.title
85         else:
86           wrappedTitle = ''
87
88         if i.type != "xs:string":
89           wrappedType = ' type="%s"' % i.type
90         else:
91           wrappedType = ''
92
93         label = i.name
94         ss.append(ial_elTmpl % locals())
95       sss = string.join( ss, '\n' )
96
97       if mode in [ 'upd','updsamp']:
98         label = '%sUpd' % self.label
99       else:
100         label = self.label
101       title = self.title
102       id = self.id
103       ilm =  self.ilt
104       sectLevel =  self.level
105       itemAttrList = sss
106       mxo = self.mxo
107       labu = self.labu
108       self.vocab = vocab_elTmpl % locals()
109     else:
110## construct sample item ##
111       if self.ilt == 'an':
112         label = 'example01'
113       elif self.ilt == 'def':
114         label = 'example-01'
115       elif self.ilt == 'int':
116         label = '1'
117       elif self.ilt == 'und':
118         label = 'example_03'
119       title = 'dummy title string'
120
121       extras = ''
122       for i in self.itematts:
123         if i.name not in ['label','title']:
124           value = "noType"
125           if i.type == "xs:string":
126             if i.name == 'uuid':
127               value = str( uuid.uuid1() )
128             else:
129               value = 'dummyAt'
130           elif i.type == "xs:integer":
131             value = '25'
132           elif i.type == "xs:duration":
133             value = 'P1Y'
134
135           extras += ' %s="%s"' % (i.name,value)
136       id = '001.%3.3i.%3.3i' % (self.kk,1)
137       exampleItem = item_Tmpl % locals()
138       label = self.label
139       title = self.title
140       id = self.id
141       ilm =  self.ilt
142       self.vocab = expl_Tmpl % locals()
143##
144## print and write if needed
145##
146     if oo != None:
147         oo.write( self.vocab )
148     self.msg( vocab )
149
150  def msg(self,txt):
151     swallow=True
152     if swallow:
153       return
154     print text
155
156  def attr(self,line):
157     bits = map( string.strip, string.split(line[3:], ';' ) )
158     for b in bits:
159       if string.strip(b) != '':
160         bn = string.split(b, ' ')[0]
161         x = self.pb(b)
162         self.itematts.append( nt__itematt( bn, x[0], x[1], x[2], x[3] ) )
163         self.msg( '%s, %s, %s, %s, %s' % (bn, x[0], x[1], x[2], x[3]) )
164
165  def pb(self, b):
166    x = re_it.findall(b)
167    m = re_atdef.match( b )
168    if m == None:
169         print 'COULD NOT SCAN: ',b
170         assert False
171    else:
172      ee = m.groupdict()
173      for k in ['a','b','c']:
174        if type( ee[k] ) == type( 'x' ):
175          assert string.find( ee[k], '"' ) == -1, 'unable to deal with quote in string: %s' % ee[k]
176      itemTitle = ee['a']
177      itemType = ee['b']
178      itemClass = ee['c']
179      itemTechNote = None
180      if itemType == None:
181         itemType = 'xs:string'
182      if type(itemClass) == type('x'):
183        if string.find(itemClass, '|' ) != -1:
184          bits = string.split( itemClass, '|' )
185          assert len(bits) == 2, 'ERROR.001.0001: failed to parse attribute definition: %s' % b
186          itemClass = bits[0]
187          itemTechNote = bits[1]
188       
189    #if len(x) > 0:
190      #itemTitle = x[0]
191    #else:
192      #itemTitle = None
193    #x = re_is.findall(b)
194    #if len(x) > 0:
195      #itemType = x[0]
196    #else:
197      #itemType = 'xs:string'
198    return [itemType, itemTitle,itemClass,itemTechNote] 
199
200class main(object):
201
202  def __init__(self,fn):
203    ii = []
204    for l in open('../../docs/%s' % fn).readlines():
205      if l[0] != '#':
206        ii.append(l)
207    kk= 0
208    this = None
209    fstem = string.split( fn, '.' )[0]
210    fns = {'defn':'%sDefn' % fstem, 'samp':'%sSample' % fstem, 'upd':'%sUpdDefn' % fstem, 'updsamp':'%sUpdSampl' % fstem }
211    fn = fns[mode]
212    oo = open( 'out/%s.xml' % fn, 'w' )
213    if mode in [ 'samp','updsamp']:
214      mainEl = "main"
215      mainElCont = '''
216xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
217xsi:noNamespaceSchemaLocation="out/dreqSchema.xsd"
218xmlns="uri:w3id.org:cmip6.dreq.dreq:a"'''
219    else:
220      mainEl = "defDoc"
221      mainElCont = '''
222xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
223xmlns="uri:w3id.org:cmip6.dreq.framework:a"
224xsi:schemaLocation="http://w3id.org/cmip6dr/ns vocabFrameworkSchema_v01beta.xsd"'''
225
226    oo.write( '''<?xml version="1.0" ?>
227<%s%s>\n''' % (mainEl,mainElCont) )
228    updExtra = ''' - srcid {Record to be copied/modified} <internalLink>
229 - updClass {Class of update: copy|change|delete|new}
230 - updComment {Comment on the proposed change}
231 - updDate {Date of update}
232 - updProv {Proposer of update}'''
233
234    for l in ii:
235      if l[:5] == 'vocab':
236        if this != None:
237          this.tmpl(oo=oo,mode=mode)
238        kk+=1
239        this = vocab(l,kk=kk)
240        if mode in ['upd','updsamp']:
241          for l1 in string.split( updExtra, '\n' ):
242            this.attr( l1 )
243      else:
244        this.attr( l )
245
246    this.tmpl(oo=oo,mode=mode)
247    oo.write( '</%s>\n' % mainEl )
248    oo.close()
249
250m = main(srcFn)
Note: See TracBrowser for help on using the repository browser.