arelle-release 2.37.47__py3-none-any.whl → 2.37.49__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arelle-release might be problematic. Click here for more details.
- arelle/CntlrCmdLine.py +5 -1
- arelle/ModelObjectFactory.py +18 -2
- arelle/_version.py +2 -2
- arelle/plugin/validate/EDINET/Constants.py +6 -0
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +134 -7
- arelle/plugin/validate/EDINET/Statement.py +139 -0
- arelle/plugin/validate/EDINET/rules/contexts.py +5 -10
- arelle/plugin/validate/EDINET/rules/edinet.py +89 -51
- arelle/plugin/validate/EDINET/rules/gfm.py +41 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.49.dist-info}/METADATA +3 -1
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.49.dist-info}/RECORD +15 -99
- arelle/archive/CustomLogger.py +0 -43
- arelle/archive/LoadEFMvalidate.py +0 -32
- arelle/archive/LoadSavePreLbCsv.py +0 -26
- arelle/archive/LoadValidate.cs +0 -31
- arelle/archive/LoadValidate.py +0 -36
- arelle/archive/LoadValidateCmdLine.java +0 -69
- arelle/archive/LoadValidatePostedZip.java +0 -57
- arelle/archive/LoadValidateWebService.java +0 -34
- arelle/archive/SaveTableToExelle.py +0 -140
- arelle/archive/TR3toTR4.py +0 -88
- arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
- arelle/archive/plugin/bigInstance.py +0 -394
- arelle/archive/plugin/cmdWebServerExtension.py +0 -43
- arelle/archive/plugin/crashTest.py +0 -38
- arelle/archive/plugin/functionsXmlCreation.py +0 -106
- arelle/archive/plugin/hello_i18n.pot +0 -26
- arelle/archive/plugin/hello_i18n.py +0 -32
- arelle/archive/plugin/importTestChild1.py +0 -21
- arelle/archive/plugin/importTestChild2.py +0 -22
- arelle/archive/plugin/importTestGrandchild1.py +0 -21
- arelle/archive/plugin/importTestGrandchild2.py +0 -21
- arelle/archive/plugin/importTestImported1.py +0 -23
- arelle/archive/plugin/importTestImported11.py +0 -22
- arelle/archive/plugin/importTestParent.py +0 -48
- arelle/archive/plugin/instanceInfo.py +0 -306
- arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
- arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
- arelle/archive/plugin/objectmaker.py +0 -285
- arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
- arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
- arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
- arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
- arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
- arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
- arelle/archive/plugin/sakaCalendar.py +0 -215
- arelle/archive/plugin/saveInstanceInfoset.py +0 -121
- arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
- arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
- arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
- arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
- arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
- arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
- arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
- arelle/archive/plugin/sphinx/__init__.py +0 -285
- arelle/archive/plugin/streamingExtensions.py +0 -335
- arelle/archive/plugin/updateTableLB.py +0 -242
- arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
- arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
- arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
- arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
- arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
- arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
- arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
- arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
- arelle/archive/plugin/validate/USBestPractices.py +0 -570
- arelle/archive/plugin/validate/USCorpAction.py +0 -557
- arelle/archive/plugin/validate/USSecTagging.py +0 -337
- arelle/archive/plugin/validate/XDC/__init__.py +0 -77
- arelle/archive/plugin/validate/XDC/config.xml +0 -20
- arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
- arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
- arelle/archive/plugin/validate/calc2.py +0 -536
- arelle/archive/plugin/validateSchemaLxml.py +0 -156
- arelle/archive/plugin/validateTableInfoset.py +0 -52
- arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
- arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
- arelle/examples/plugin/formulaSuiteConverter.py +0 -212
- arelle/examples/plugin/functionsCustom.py +0 -59
- arelle/examples/plugin/hello_dolly.py +0 -64
- arelle/examples/plugin/multi.py +0 -58
- arelle/examples/plugin/rssSaveOim.py +0 -96
- arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
- arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
- arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -50
- arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
- arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
- arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
- arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
- arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
- arelle/scripts-macOS/startWebServer.command +0 -3
- arelle/scripts-unix/startWebServer.sh +0 -1
- arelle/scripts-windows/startWebServer.bat +0 -5
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.49.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.49.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.49.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.49.dist-info}/top_level.txt +0 -0
|
@@ -1,823 +0,0 @@
|
|
|
1
|
-
'''
|
|
2
|
-
formulaGenerator generates XBRL formula linkbases for a subset of the Sphinx language.
|
|
3
|
-
|
|
4
|
-
See COPYRIGHT.md for copyright information.
|
|
5
|
-
|
|
6
|
-
Sphinx is a Rules Language for XBRL described by a Sphinx 2 Primer
|
|
7
|
-
(c) Copyright 2012 CoreFiling, Oxford UK.
|
|
8
|
-
Sphinx copyright applies to the Sphinx language, not to this software.
|
|
9
|
-
Workiva, Inc. conveys neither rights nor license for the Sphinx language.
|
|
10
|
-
'''
|
|
11
|
-
|
|
12
|
-
import time, sys, io, os.path
|
|
13
|
-
import regex as re
|
|
14
|
-
from lxml import etree
|
|
15
|
-
from arelle.ModelValue import QName
|
|
16
|
-
from .SphinxParser import (parse, astNode, astNamespaceDeclaration,
|
|
17
|
-
astFormulaRule, astReportRule, astValidationRule,
|
|
18
|
-
astQnameLiteral)
|
|
19
|
-
from .SphinxMethods import aggreateFunctionImplementation
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def generateFormulaLB(cntlr, sphinxFiles, generatedSphinxFormulasDirectory):
|
|
23
|
-
from .SphinxContext import SphinxContext
|
|
24
|
-
from .SphinxValidator import validate
|
|
25
|
-
|
|
26
|
-
msgFile = None
|
|
27
|
-
sourceString = None
|
|
28
|
-
|
|
29
|
-
# logMessage operates without an instance document or ModelXbrl, so it simulates log function
|
|
30
|
-
|
|
31
|
-
def logMessage(severity, code, text, **kwargs):
|
|
32
|
-
if "sourceFileLines" in kwargs: # use pairs of file and line number
|
|
33
|
-
fileLines = ", ".join((file + (" " + str(line)) if line else "")
|
|
34
|
-
for file, line in kwargs["sourceFileLines"])
|
|
35
|
-
elif "sourceFileLine" in kwargs:
|
|
36
|
-
file, line in kwargs["sourceFileLine"]
|
|
37
|
-
fileLines = file + (" " + str(line)) if line else ""
|
|
38
|
-
else:
|
|
39
|
-
fileLines = ""
|
|
40
|
-
if not fileLines:
|
|
41
|
-
fileLines = ", " + fileLines
|
|
42
|
-
try:
|
|
43
|
-
cntlr.addToLog("[{0}] {1}{2}".format(
|
|
44
|
-
code,
|
|
45
|
-
text % kwargs,
|
|
46
|
-
fileLines))
|
|
47
|
-
except KeyError as err:
|
|
48
|
-
cntlr.addToLog("[{0}] {1}: Missing message parameter: {2}; {3}".format(
|
|
49
|
-
code,
|
|
50
|
-
text,
|
|
51
|
-
err,
|
|
52
|
-
fileLines))
|
|
53
|
-
|
|
54
|
-
from arelle import XmlUtil
|
|
55
|
-
|
|
56
|
-
sc = SphinxContext( parse(cntlr, logMessage, sphinxFiles) )
|
|
57
|
-
sc.logMessage = logMessage
|
|
58
|
-
validate(logMessage, sc)
|
|
59
|
-
assertionIDs = set()
|
|
60
|
-
|
|
61
|
-
for prog in sc.sphinxProgs:
|
|
62
|
-
sphinxFile = prog[0].fileName
|
|
63
|
-
sphinxXmlns = { "xlink": 'http://www.w3.org/1999/xlink',
|
|
64
|
-
"link": 'http://www.xbrl.org/2003/linkbase',
|
|
65
|
-
"xbrli": 'http://www.xbrl.org/2003/instance',
|
|
66
|
-
"generic": 'http://xbrl.org/2008/generic',
|
|
67
|
-
"formula": 'http://xbrl.org/2008/formula',
|
|
68
|
-
"validation": 'http://xbrl.org/2008/validation',
|
|
69
|
-
"variable": 'http://xbrl.org/2008/variable',
|
|
70
|
-
"label": 'http://xbrl.org/2008/label',
|
|
71
|
-
"ca": 'http://xbrl.org/2008/assertion/consistency',
|
|
72
|
-
"ea": 'http://xbrl.org/2008/assertion/existence',
|
|
73
|
-
"va": 'http://xbrl.org/2008/assertion/value',
|
|
74
|
-
"msg": 'http://xbrl.org/2010/message',
|
|
75
|
-
"bf": 'http://xbrl.org/2008/filter/boolean',
|
|
76
|
-
"cf": 'http://xbrl.org/2008/filter/concept',
|
|
77
|
-
"df": 'http://xbrl.org/2008/filter/dimension',
|
|
78
|
-
"gf": 'http://xbrl.org/2008/filter/general',
|
|
79
|
-
"pf": 'http://xbrl.org/2008/filter/period',
|
|
80
|
-
"uf": 'http://xbrl.org/2008/filter/unit',
|
|
81
|
-
"xfi": 'http://www.xbrl.org/2008/function/instance',
|
|
82
|
-
"xsi": 'http://www.w3.org/2001/XMLSchema-instance',
|
|
83
|
-
"xs": 'http://www.w3.org/2001/XMLSchema',
|
|
84
|
-
}
|
|
85
|
-
for node in prog:
|
|
86
|
-
if isinstance(node, astNamespaceDeclaration):
|
|
87
|
-
sphinxXmlns[node.prefix] = node.namespace
|
|
88
|
-
|
|
89
|
-
formulaFile = sphinxFile.rpartition(".")[0] + "-formula.xml"
|
|
90
|
-
|
|
91
|
-
# save in generatedSphinxFormulasDirectory if specified and valid (exists)
|
|
92
|
-
if generatedSphinxFormulasDirectory and os.path.isdir(generatedSphinxFormulasDirectory):
|
|
93
|
-
formulaFile = os.path.join(generatedSphinxFormulasDirectory,
|
|
94
|
-
os.path.basename(formulaFile))
|
|
95
|
-
|
|
96
|
-
xbrlLBfile = io.StringIO('''
|
|
97
|
-
<nsmap>
|
|
98
|
-
<link:linkbase
|
|
99
|
-
|
|
100
|
-
{0}
|
|
101
|
-
xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd"
|
|
102
|
-
>
|
|
103
|
-
<link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/element-label'
|
|
104
|
-
xlink:href='http://www.xbrl.org/2008/generic-label.xsd#element-label'
|
|
105
|
-
xlink:type='simple'/>
|
|
106
|
-
<link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/variable-set'
|
|
107
|
-
xlink:href='http://www.xbrl.org/2008/variable.xsd#variable-set'
|
|
108
|
-
xlink:type='simple'/>
|
|
109
|
-
<link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/variable-filter'
|
|
110
|
-
xlink:href='http://www.xbrl.org/2008/variable.xsd#variable-filter'
|
|
111
|
-
xlink:type='simple'/>
|
|
112
|
-
<link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/variable-set-precondition'
|
|
113
|
-
xlink:href='http://www.xbrl.org/2008/variable.xsd#variable-set-precondition'
|
|
114
|
-
xlink:type='simple'/>
|
|
115
|
-
<link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/consistency-assertion-formula'
|
|
116
|
-
xlink:href='http://www.xbrl.org/2008/consistency-assertion.xsd#consistency-assertion-formula'
|
|
117
|
-
xlink:type='simple'/>
|
|
118
|
-
<link:roleRef roleURI='http://www.xbrl.org/2008/role/link'
|
|
119
|
-
xlink:href='http://www.xbrl.org/2008/generic-link.xsd#standard-link-role'
|
|
120
|
-
xlink:type='simple'/>
|
|
121
|
-
<link:roleRef roleURI='http://www.xbrl.org/2008/role/label'
|
|
122
|
-
xlink:href='http://www.xbrl.org/2008/generic-label.xsd#standard-label'
|
|
123
|
-
xlink:type='simple'/>
|
|
124
|
-
<link:roleRef roleURI="http://www.xbrl.org/2010/role/message"
|
|
125
|
-
xlink:type="simple"
|
|
126
|
-
xlink:href="http://www.xbrl.org/2010/generic-message.xsd#standard-message"/>
|
|
127
|
-
<link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2010/assertion-unsatisfied-message"
|
|
128
|
-
xlink:type="simple"
|
|
129
|
-
xlink:href="http://www.xbrl.org/2010/validation-message.xsd#assertion-unsatisfied-message"/>
|
|
130
|
-
<link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2010/assertion-satisfied-message"
|
|
131
|
-
xlink:type="simple"
|
|
132
|
-
xlink:href="http://www.xbrl.org/2010/validation-message.xsd#assertion-satisfied-message"/>
|
|
133
|
-
<link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/boolean-filter'
|
|
134
|
-
xlink:href='http://www.xbrl.org/2008/boolean-filter.xsd#boolean-filter'
|
|
135
|
-
xlink:type='simple'/>
|
|
136
|
-
|
|
137
|
-
<generic:link xlink:type="extended" xlink:role="http://www.xbrl.org/2003/role/link"/>
|
|
138
|
-
</link:linkbase>
|
|
139
|
-
</nsmap>
|
|
140
|
-
<!-- Generated by Arelle(r) http://arelle.org -->
|
|
141
|
-
'''.format('\n'.join("xmlns{0}='{1}'".format((":" + prefix) if prefix else "",
|
|
142
|
-
namespace)
|
|
143
|
-
for prefix, namespace in sphinxXmlns.items())
|
|
144
|
-
)
|
|
145
|
-
)
|
|
146
|
-
msgFile = os.path.basename(formulaFile)
|
|
147
|
-
xmlDocument = etree.parse(xbrlLBfile,base_url=formulaFile)
|
|
148
|
-
xbrlLBfile.close()
|
|
149
|
-
nsmapElt = xmlDocument.getroot()
|
|
150
|
-
#xmlDocument.getroot().init(self) ## is this needed ??
|
|
151
|
-
for lbElement in xmlDocument.iter(tag="{http://www.xbrl.org/2003/linkbase}linkbase"):
|
|
152
|
-
break
|
|
153
|
-
for e in xmlDocument.iter(tag="{http://xbrl.org/2008/generic}link"):
|
|
154
|
-
sc.genLinkElement = e
|
|
155
|
-
break
|
|
156
|
-
|
|
157
|
-
class DocObj: # fake ModelDocument for namespaces
|
|
158
|
-
def __init__(self):
|
|
159
|
-
self.xmlRootElement = lbElement
|
|
160
|
-
self.xmlDocument = xmlDocument
|
|
161
|
-
docObj = DocObj()
|
|
162
|
-
|
|
163
|
-
numRules = 0
|
|
164
|
-
sc.generatedVarNbr = 1
|
|
165
|
-
sc.xpathCode = None
|
|
166
|
-
sc.bindAsSequence = False
|
|
167
|
-
sc.nodeXpathVarBindings = {}
|
|
168
|
-
|
|
169
|
-
for node in prog:
|
|
170
|
-
if isinstance(node, (astFormulaRule, astReportRule, astValidationRule)):
|
|
171
|
-
# form unique ID
|
|
172
|
-
sc.assertionID = node.name
|
|
173
|
-
if sc.assertionID in assertionIDs:
|
|
174
|
-
for suffixNumber in range(1,10000):
|
|
175
|
-
if sc.assertionID + str(suffixNumber) not in assertionIDs:
|
|
176
|
-
sc.assertionID += str(suffixNumber)
|
|
177
|
-
break
|
|
178
|
-
assertionIDs.add(sc.assertionID)
|
|
179
|
-
sc.assertionElt = etree.SubElement(sc.genLinkElement,
|
|
180
|
-
"{http://xbrl.org/2008/assertion/value}valueAssertion",
|
|
181
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
182
|
-
"{http://www.w3.org/1999/xlink}label": sc.assertionID,
|
|
183
|
-
"id": sc.assertionID,
|
|
184
|
-
"aspectModel": "dimensional",
|
|
185
|
-
"implicitFiltering": "true"})
|
|
186
|
-
sc.assertionVarNames = {"factVar_"}
|
|
187
|
-
sc.generalVarNames = {}
|
|
188
|
-
if isinstance(node, astFormulaRule):
|
|
189
|
-
sc.assertionElt.set("test", xpathCode(node.expr, sc))
|
|
190
|
-
msgType = "assertion-unsatisfied-message"
|
|
191
|
-
elif isinstance(node, astReportRule):
|
|
192
|
-
sc.tags["value"] = node.expr # no test expression needed
|
|
193
|
-
msgType = "assertion-unsatisfied-message"
|
|
194
|
-
elif isinstance(node, astValidationRule):
|
|
195
|
-
sc.assertionElt.set("test", "not( " + xpathCode(node.expr, sc) + " )")
|
|
196
|
-
msgType = "assertion-satisfied-message"
|
|
197
|
-
genMessage(node.message, sc, msgType)
|
|
198
|
-
|
|
199
|
-
sc.nodeXpathVarBindings.clear()
|
|
200
|
-
|
|
201
|
-
with open(formulaFile, "w", encoding="utf-8") as fh:
|
|
202
|
-
XmlUtil.writexml(fh, xmlDocument, encoding="utf-8")
|
|
203
|
-
|
|
204
|
-
logMessage("INFO", "info:compileSphinx",
|
|
205
|
-
_("Compiled Sphinx of %(sphinxFile)s has %(numberRules)s tables in file %(formulaFile)s."),
|
|
206
|
-
sphinxFile=sphinxFiles,
|
|
207
|
-
numberRules=numRules,
|
|
208
|
-
formulaFile=formulaFile)
|
|
209
|
-
|
|
210
|
-
logMessage = None
|
|
211
|
-
sc.close()
|
|
212
|
-
|
|
213
|
-
cntlr.showStatus("Finshed sphinx files {0}".format(", ".join(os.path.basename(f)
|
|
214
|
-
for f in sphinxFiles)),
|
|
215
|
-
5000)
|
|
216
|
-
|
|
217
|
-
def evaluate(node, sc):
|
|
218
|
-
if isinstance(node, astNode):
|
|
219
|
-
className = node.__class__.__name__
|
|
220
|
-
if className in evaluationHandler:
|
|
221
|
-
return evaluationHandler[className](node, sc)
|
|
222
|
-
else: # don't evaluate node
|
|
223
|
-
return node
|
|
224
|
-
elif isinstance(node, (tuple,list)):
|
|
225
|
-
return [evaluate(item, sc) for item in node]
|
|
226
|
-
elif isinstance(node, set):
|
|
227
|
-
return set(evaluate(item, sc) for item in node)
|
|
228
|
-
elif callable(node):
|
|
229
|
-
return node()
|
|
230
|
-
else:
|
|
231
|
-
return node
|
|
232
|
-
|
|
233
|
-
def evaluateFunctionReference(node, sc):
|
|
234
|
-
name = node.name
|
|
235
|
-
if name in {"list", "set"}:
|
|
236
|
-
# evaluate args
|
|
237
|
-
args = [evaluate(arg, sc) for arg in node.args]
|
|
238
|
-
# process args
|
|
239
|
-
if name == "list":
|
|
240
|
-
return list(args)
|
|
241
|
-
elif name == "set":
|
|
242
|
-
return set(args)
|
|
243
|
-
return node
|
|
244
|
-
|
|
245
|
-
def evaluateQnameLiteral(node, sc):
|
|
246
|
-
return node.value
|
|
247
|
-
|
|
248
|
-
def evaluateStringLiteral(node, sc):
|
|
249
|
-
return node.text
|
|
250
|
-
|
|
251
|
-
def evaluateVariableAssignment(node, sc):
|
|
252
|
-
result = evaluate(node.expr, sc)
|
|
253
|
-
sc.localVariables[node.variableName] = result
|
|
254
|
-
if node.tagName:
|
|
255
|
-
sc.tags[node.tagName] = node.expr
|
|
256
|
-
return result
|
|
257
|
-
|
|
258
|
-
def evaluateVariableReference(node, sc):
|
|
259
|
-
# expand macro variables
|
|
260
|
-
if node.variableName in sc.localVariables:
|
|
261
|
-
return evaluate(sc.localVariables[node.variableName], sc)
|
|
262
|
-
return '$' + node.variableName
|
|
263
|
-
|
|
264
|
-
def xpathCode(node, sc):
|
|
265
|
-
parentXpathCode = sc.xpathCode
|
|
266
|
-
sc.xpathCode = []
|
|
267
|
-
genNode(node, sc)
|
|
268
|
-
xpathCodeStr = " ".join(sc.xpathCode)
|
|
269
|
-
sc.xpathCode = parentXpathCode
|
|
270
|
-
return xpathCodeStr
|
|
271
|
-
|
|
272
|
-
def genNode(node, sc):
|
|
273
|
-
if isinstance(node, astNode):
|
|
274
|
-
genNodeHandler[node.__class__.__name__](node, sc)
|
|
275
|
-
elif isinstance(node, (tuple,list)):
|
|
276
|
-
sc.xpathCode.append('[')
|
|
277
|
-
for item in node:
|
|
278
|
-
genNode(item, sc)
|
|
279
|
-
sc.xpathCode.append(']')
|
|
280
|
-
elif isinstance(node, set):
|
|
281
|
-
sc.xpathCode.append("set(")
|
|
282
|
-
for item in node:
|
|
283
|
-
genNode(item, sc)
|
|
284
|
-
sc.xpathCode.append(")")
|
|
285
|
-
elif callable(node):
|
|
286
|
-
node()
|
|
287
|
-
else:
|
|
288
|
-
sc.xpathCode.append(str(node))
|
|
289
|
-
|
|
290
|
-
def genBinaryOperation(node, sc):
|
|
291
|
-
# for now formula := generates a "eq" operation so it fails when conditoin is not met
|
|
292
|
-
sc.xpathCode.append("(")
|
|
293
|
-
genNode(node.leftExpr, sc)
|
|
294
|
-
sc.xpathCode.append({"+": "+", "-": "-", "*": "", "/": "div",
|
|
295
|
-
"<": "lt", "<=": "le", ">": "gt", ">=": "ge",
|
|
296
|
-
"==": "eq", "!=": "ne",
|
|
297
|
-
":=": "eq",
|
|
298
|
-
}.get(node.op,"$$$opNotImplemented$$$"))
|
|
299
|
-
genNode(node.rightExpr, sc)
|
|
300
|
-
sc.xpathCode.append(")")
|
|
301
|
-
|
|
302
|
-
def genFor(node, sc):
|
|
303
|
-
# add a general variable for this node's expression, substitute gen var expression
|
|
304
|
-
generalVarLabel = "generalVariable_" + node.name
|
|
305
|
-
sc.xpathCode.append("$" + node.name)
|
|
306
|
-
|
|
307
|
-
def genForSelectCode():
|
|
308
|
-
sc.xpathCode.append("for $_{0} in {1} return ( {2} )".format(
|
|
309
|
-
node.name,
|
|
310
|
-
genNode(node.collectionExpr, sc),
|
|
311
|
-
genNode(node.expr, sc)
|
|
312
|
-
))
|
|
313
|
-
|
|
314
|
-
etree.SubElement(sc.genLinkElement,
|
|
315
|
-
"{http://xbrl.org/2008/variable}generalVariable",
|
|
316
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
317
|
-
"{http://www.w3.org/1999/xlink}label": generalVarLabel,
|
|
318
|
-
"select": xpathCode(genForSelectCode, sc)})
|
|
319
|
-
etree.SubElement(sc.genLinkElement,
|
|
320
|
-
"{http://xbrl.org/2008/variable}variableArc",
|
|
321
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
322
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
|
|
323
|
-
"{http://www.w3.org/1999/xlink}from": sc.assertionID,
|
|
324
|
-
"{http://www.w3.org/1999/xlink}to": generalVarLabel,
|
|
325
|
-
"name": node.name})
|
|
326
|
-
|
|
327
|
-
def genFunctionDeclaration(node, sc, args):
|
|
328
|
-
# attempt to expand macros
|
|
329
|
-
if node.functionType == "macro":
|
|
330
|
-
# expand locally
|
|
331
|
-
overriddenVariables = {}
|
|
332
|
-
|
|
333
|
-
if isinstance(args, dict):
|
|
334
|
-
# args may not all be used in the function declaration, just want used ones
|
|
335
|
-
argDict = dict((name, value)
|
|
336
|
-
for name, value in args.items()
|
|
337
|
-
if name in node.params)
|
|
338
|
-
else: # purely positional args
|
|
339
|
-
# positional parameters named according to function prototype
|
|
340
|
-
if len(args) != len(node.params):
|
|
341
|
-
sc.modelXbrl.log("ERROR", "sphinx.functionArgumentsMismatch",
|
|
342
|
-
_("Function %(name)s requires %(required)s parameters but %(provided)s are provided"),
|
|
343
|
-
sourceFileLine=node.sourceFileLine,
|
|
344
|
-
name=node.name, required=len(node.params), provided=len(args))
|
|
345
|
-
return None
|
|
346
|
-
argDict = dict((paramName, args[i])
|
|
347
|
-
for i, paramName in enumerate(node.params))
|
|
348
|
-
for name, value in argDict.items():
|
|
349
|
-
value = evaluate(value, sc) # resolves variable refs to same variable ref
|
|
350
|
-
if name in sc.localVariables:
|
|
351
|
-
overriddenVariables[name] = sc.localVariables[name]
|
|
352
|
-
sc.localVariables[name] = value
|
|
353
|
-
result = genNode(node.expr, sc)
|
|
354
|
-
for name in argDict.keys():
|
|
355
|
-
del sc.localVariables[name]
|
|
356
|
-
sc.localVariables.update(overriddenVariables)
|
|
357
|
-
overriddenVariables.clear()
|
|
358
|
-
elif node.functionType == "function":
|
|
359
|
-
# generate custom function implementation
|
|
360
|
-
pass
|
|
361
|
-
|
|
362
|
-
def genFunctionReference(node, sc):
|
|
363
|
-
name = node.name
|
|
364
|
-
if name in sc.functions: # user defined function
|
|
365
|
-
result = genFunctionDeclaration(sc.functions[name], sc, node.args)
|
|
366
|
-
|
|
367
|
-
isAggregateFunction = name in aggreateFunctionImplementation
|
|
368
|
-
if isAggregateFunction:
|
|
369
|
-
priorBindAsSequence = sc.bindAsSequence
|
|
370
|
-
sc.bindAsSequence = True
|
|
371
|
-
formulaFunctionSyntax = formulaFunctionSyntaxPatterns.get(name,
|
|
372
|
-
("$notImplemented_{0}(".format(name),")"))
|
|
373
|
-
if isinstance(formulaFunctionSyntax, tuple) and len(formulaFunctionSyntax) == 2:
|
|
374
|
-
sc.xpathCode.append(formulaFunctionSyntax[0]) # before arguments
|
|
375
|
-
for i, arg in enumerate(node.args):
|
|
376
|
-
if i:
|
|
377
|
-
sc.xpathCode.append(",")
|
|
378
|
-
genNode(arg, sc)
|
|
379
|
-
sc.xpathCode.append(formulaFunctionSyntax[1]) # after arguments
|
|
380
|
-
else:
|
|
381
|
-
sc.logMessage("ERROR", "sphinxFormulaGenerator:functionSyntaxPatternError",
|
|
382
|
-
_("Syntax generator error for function %(name)s."),
|
|
383
|
-
sourceFileLine=node.sourceFileLine, name=name)
|
|
384
|
-
if isAggregateFunction:
|
|
385
|
-
sc.bindAsSequence = priorBindAsSequence
|
|
386
|
-
|
|
387
|
-
def genHyperspaceExpression(node, sc):
|
|
388
|
-
# generate fact variable and substitute it's reference in text code
|
|
389
|
-
# find pri item for fact var name
|
|
390
|
-
priItemName = "factVar_"
|
|
391
|
-
for axis in node.axes:
|
|
392
|
-
if axis.name == "primary":
|
|
393
|
-
restriction = evaluate(axis.restriction, sc)
|
|
394
|
-
if len(restriction) == 1:
|
|
395
|
-
priItemName += cleanedName(str(restriction[0]))
|
|
396
|
-
break
|
|
397
|
-
|
|
398
|
-
if priItemName in sc.assertionVarNames:
|
|
399
|
-
for suffixNumber in range(1,10000):
|
|
400
|
-
if priItemName + str(suffixNumber) not in sc.assertionVarNames:
|
|
401
|
-
priItemName += str(suffixNumber)
|
|
402
|
-
break
|
|
403
|
-
sc.assertionVarNames.add(priItemName)
|
|
404
|
-
factVarLabel = sc.assertionID + "_" + priItemName
|
|
405
|
-
xpathVar = "$" + factVarLabel
|
|
406
|
-
sc.xpathCode.append(xpathVar)
|
|
407
|
-
sc.nodeXpathVarBindings[node] = xpathVar
|
|
408
|
-
etree.SubElement(sc.genLinkElement,
|
|
409
|
-
"{http://xbrl.org/2008/variable}factVariable",
|
|
410
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
411
|
-
"{http://www.w3.org/1999/xlink}label": factVarLabel,
|
|
412
|
-
"bindAsSequence": ("false","true")[sc.bindAsSequence]})
|
|
413
|
-
etree.SubElement(sc.genLinkElement,
|
|
414
|
-
"{http://xbrl.org/2008/variable}variableArc",
|
|
415
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
416
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
|
|
417
|
-
"{http://www.w3.org/1999/xlink}from": sc.assertionID,
|
|
418
|
-
"{http://www.w3.org/1999/xlink}to": factVarLabel,
|
|
419
|
-
"name": factVarLabel})
|
|
420
|
-
# generate filters
|
|
421
|
-
filterNames = {"filter_"}
|
|
422
|
-
for axis in node.axes:
|
|
423
|
-
filterName = "filter_"
|
|
424
|
-
axisName = evaluate(axis.name, sc)
|
|
425
|
-
if axisName == "primary":
|
|
426
|
-
axisRestriction = evaluate(axis.restriction, sc)[0]
|
|
427
|
-
filterName = "concept"
|
|
428
|
-
elif isinstance(axisName, QName):
|
|
429
|
-
axisRestriction = evaluate(axis.restriction, sc)[0]
|
|
430
|
-
filterName = "dim_" + axisRestriction.localName
|
|
431
|
-
if filterName in filterNames:
|
|
432
|
-
for suffixNumber in range(1,10000):
|
|
433
|
-
if filterName + str(suffixNumber) not in filterNames:
|
|
434
|
-
filterName += str(suffixNumber)
|
|
435
|
-
break
|
|
436
|
-
filterNames.add(filterName)
|
|
437
|
-
filterLabel = factVarLabel + "_" + filterName
|
|
438
|
-
if axis.name == "primary":
|
|
439
|
-
elt = etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/filter/concept}conceptName",
|
|
440
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
441
|
-
"{http://www.w3.org/1999/xlink}label": filterLabel})
|
|
442
|
-
etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/variable}variableFilterArc",
|
|
443
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
444
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-filter",
|
|
445
|
-
"{http://www.w3.org/1999/xlink}from": factVarLabel,
|
|
446
|
-
"{http://www.w3.org/1999/xlink}to": filterLabel,
|
|
447
|
-
"complement": "false",
|
|
448
|
-
"cover": "true"})
|
|
449
|
-
elt = etree.SubElement(elt, "{http://xbrl.org/2008/filter/concept}concept")
|
|
450
|
-
etree.SubElement(elt, "{http://xbrl.org/2008/filter/concept}qname").text = str(axisRestriction)
|
|
451
|
-
elif isinstance(axis.name, QName): # dimension
|
|
452
|
-
elt = etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/filter/dimension}explicitDimension",
|
|
453
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
454
|
-
"{http://www.w3.org/1999/xlink}label": filterLabel})
|
|
455
|
-
etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/variable}variableFilterArc",
|
|
456
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
457
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-filter",
|
|
458
|
-
"{http://www.w3.org/1999/xlink}from": factVarLabel,
|
|
459
|
-
"{http://www.w3.org/1999/xlink}to": filterLabel,
|
|
460
|
-
"complement": "false",
|
|
461
|
-
"cover": "true"})
|
|
462
|
-
elt = etree.SubElement(elt, "{http://xbrl.org/2008/filter/dimension}dimension")
|
|
463
|
-
etree.SubElement(elt, "{http://xbrl.org/2008/variable}dimension}qname").text = str(axisName)
|
|
464
|
-
elt = etree.SubElement(elt, "{http://xbrl.org/2008/filter/dimension}member")
|
|
465
|
-
etree.SubElement(elt, "{http://xbrl.org/2008/variable}dimension}qname").text = str(axisRestriction)
|
|
466
|
-
|
|
467
|
-
def genIf(node, sc):
|
|
468
|
-
sc.xpathCode.append("if (")
|
|
469
|
-
genNode(node.condition, sc)
|
|
470
|
-
sc.xpathCode.append(") then (")
|
|
471
|
-
genNode(node.thenExpr, sc)
|
|
472
|
-
sc.xpathCode.append(") else (")
|
|
473
|
-
genNode(node.elseExpr, sc)
|
|
474
|
-
sc.xpathCode.append(")")
|
|
475
|
-
|
|
476
|
-
def genMessage(node, sc, msgType):
|
|
477
|
-
def taggedVarGenVar(node):
|
|
478
|
-
tagGenVarLabel = "tagGeneralVariable_" + str(sc.generatedVarNbr)
|
|
479
|
-
sc.generatedVarNbr += 1
|
|
480
|
-
tagGenVarName = "$" + tagGenVarLabel
|
|
481
|
-
sc.nodeXpathVarBindings[node] = tagGenVarName
|
|
482
|
-
etree.SubElement(sc.genLinkElement,
|
|
483
|
-
"{http://xbrl.org/2008/variable}generalVariable",
|
|
484
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
485
|
-
"{http://www.w3.org/1999/xlink}label": tagGenVarLabel,
|
|
486
|
-
"select": xpathCode(node, sc)})
|
|
487
|
-
etree.SubElement(sc.genLinkElement,
|
|
488
|
-
"{http://xbrl.org/2008/variable}variableArc",
|
|
489
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
490
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
|
|
491
|
-
"{http://www.w3.org/1999/xlink}from": sc.assertionID,
|
|
492
|
-
"{http://www.w3.org/1999/xlink}to": tagGenVarLabel,
|
|
493
|
-
"name": tagGenVarName})
|
|
494
|
-
|
|
495
|
-
msgLabel = sc.assertionID + "_" + msgType
|
|
496
|
-
# generate mesage text
|
|
497
|
-
if node and node.message:
|
|
498
|
-
msgstr = evaluate(node.message, sc)
|
|
499
|
-
else:
|
|
500
|
-
msgstr = "Result ${value}"
|
|
501
|
-
text = []
|
|
502
|
-
i = 0
|
|
503
|
-
while True:
|
|
504
|
-
j = msgstr.find("${", i)
|
|
505
|
-
if j >= 0:
|
|
506
|
-
text.append(msgstr[i:j]) # previous part of string
|
|
507
|
-
k = msgstr.find("}", j+2)
|
|
508
|
-
if k > j:
|
|
509
|
-
tagstr = msgstr[j+2:k].strip()
|
|
510
|
-
tag, sep, modifier = tagstr.partition(".")
|
|
511
|
-
if tag == "context":
|
|
512
|
-
text.append("{{${0}@contextRef}}".format(tag))
|
|
513
|
-
elif tag in sc.tags:
|
|
514
|
-
taggedNode = sc.tags[tag]
|
|
515
|
-
if taggedNode not in sc.nodeXpathVarBindings:
|
|
516
|
-
taggedVarGenVar(taggedNode) # add a gen var for this tagged expression
|
|
517
|
-
text.append("{{{0}}}".format(sc.nodeXpathVarBindings[taggedNode]))
|
|
518
|
-
else:
|
|
519
|
-
text.append('"{0}" is not supported for formula message generation'.format(tagstr))
|
|
520
|
-
i = k + 1
|
|
521
|
-
else:
|
|
522
|
-
text.append(msgstr[i:])
|
|
523
|
-
break
|
|
524
|
-
messageStr = ''.join(text)
|
|
525
|
-
etree.SubElement(sc.genLinkElement,
|
|
526
|
-
"{http://xbrl.org/2010/message}message",
|
|
527
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
528
|
-
"{http://www.w3.org/1999/xlink}label": msgLabel,
|
|
529
|
-
"{http://www.w3.org/1999/xlink}role": "http://www.xbrl.org/2010/role/message",
|
|
530
|
-
"{http://www.w3.org/XML/1998/namespace}lang": "en"
|
|
531
|
-
}).text = messageStr
|
|
532
|
-
etree.SubElement(sc.genLinkElement,
|
|
533
|
-
"{http://xbrl.org/2008/generic}arc",
|
|
534
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
535
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2010/" + msgType,
|
|
536
|
-
"{http://www.w3.org/1999/xlink}from": sc.assertionID,
|
|
537
|
-
"{http://www.w3.org/1999/xlink}to": msgLabel})
|
|
538
|
-
|
|
539
|
-
def genMethodReference(node, sc):
|
|
540
|
-
formulaMethodSyntax = formulaMethodSyntaxPatterns.get(node.name,
|
|
541
|
-
("$notImplemented_{0}(".format(node.name),")"))
|
|
542
|
-
if isinstance(formulaMethodSyntax, tuple) and len(formulaMethodSyntax) == 2:
|
|
543
|
-
sc.xpathCode.append(formulaMethodSyntax[0]) # before arguments
|
|
544
|
-
for i, arg in enumerate(node.args):
|
|
545
|
-
if i:
|
|
546
|
-
sc.xpathCode.append(",")
|
|
547
|
-
genNode(arg, sc)
|
|
548
|
-
sc.xpathCode.append(formulaMethodSyntax[1]) # after arguments
|
|
549
|
-
else:
|
|
550
|
-
sc.logMessage("ERROR", "sphinxFormulaGenerator:methodSyntaxPatternError",
|
|
551
|
-
_("Syntax generator error for method %(name)s."),
|
|
552
|
-
sourceFileLine=node.sourceFileLine, name=node.name)
|
|
553
|
-
|
|
554
|
-
def genNoOp(node, sc):
|
|
555
|
-
pass
|
|
556
|
-
|
|
557
|
-
def genNumericLiteral(node, sc):
|
|
558
|
-
sc.xpathCode.append(str(node.value))
|
|
559
|
-
|
|
560
|
-
def genQnameLiteral(node, sc):
|
|
561
|
-
sc.xpathCode.append(str(node.value))
|
|
562
|
-
|
|
563
|
-
def genStringLiteral(node, sc):
|
|
564
|
-
sc.xpathCode.append('"' + node.text.replace('"', '""') + '"')
|
|
565
|
-
|
|
566
|
-
def genTagAssignment(node, sc):
|
|
567
|
-
genNode(node.expr, sc) # expand syntax in place
|
|
568
|
-
sc.tags[node.tagName] = node.expr
|
|
569
|
-
|
|
570
|
-
def genUnaryOperation(node, sc):
|
|
571
|
-
sc.xpathCode.append("(")
|
|
572
|
-
sc.xpathCode.append({"+": "+",
|
|
573
|
-
"-": "-",
|
|
574
|
-
"brackets": "",
|
|
575
|
-
}.get(node.op,"$$$opNotImplemented$$$"))
|
|
576
|
-
genNode(node.expr, sc)
|
|
577
|
-
sc.xpathCode.append(")")
|
|
578
|
-
|
|
579
|
-
def genValuesIteration(node, sc):
|
|
580
|
-
pass
|
|
581
|
-
|
|
582
|
-
def genVariableAssignment(node, sc):
|
|
583
|
-
# add a general variable for this node's expression, substitute gen var expression
|
|
584
|
-
generalVarLabel = "generalVariable_" + node.variableName
|
|
585
|
-
sc.xpathCode.append("$" + node.variableName)
|
|
586
|
-
if node.tagName:
|
|
587
|
-
sc.tags[node.tagName] = node.expr
|
|
588
|
-
|
|
589
|
-
etree.SubElement(sc.genLinkElement,
|
|
590
|
-
"{http://xbrl.org/2008/variable}generalVariable",
|
|
591
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
592
|
-
"{http://www.w3.org/1999/xlink}label": generalVarLabel,
|
|
593
|
-
"select": xpathCode(node.expr, sc)})
|
|
594
|
-
etree.SubElement(sc.genLinkElement,
|
|
595
|
-
"{http://xbrl.org/2008/variable}variableArc",
|
|
596
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
597
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
|
|
598
|
-
"{http://www.w3.org/1999/xlink}from": sc.assertionID,
|
|
599
|
-
"{http://www.w3.org/1999/xlink}to": generalVarLabel,
|
|
600
|
-
"name": node.variableName})
|
|
601
|
-
|
|
602
|
-
def genVariableReference(node, sc):
|
|
603
|
-
# if a macro reference, substitute the actual node
|
|
604
|
-
if node.variableName in sc.localVariables:
|
|
605
|
-
genNode(sc.localVariables[node.variableName], sc)
|
|
606
|
-
else:
|
|
607
|
-
sc.xpathCode.append("$" + node.variableName)
|
|
608
|
-
|
|
609
|
-
def genWith(node, sc):
|
|
610
|
-
# with-dependent code goes into a fake general variable
|
|
611
|
-
withExprGeneralVarLabel = "withExpressionGeneralVariable_" + str(sc.generatedVarNbr)
|
|
612
|
-
sc.generatedVarNbr += 1
|
|
613
|
-
sc.xpathCode.append("$" + withExprGeneralVarLabel)
|
|
614
|
-
|
|
615
|
-
def genWithGenVarCode():
|
|
616
|
-
# partition facts according to restriction
|
|
617
|
-
sc.xpathCode.append(" if (false()) then (")
|
|
618
|
-
# forces dependency by fake hyperspace fact variable reference
|
|
619
|
-
genNode(node.restrictionExpr)
|
|
620
|
-
sc.xpathCode.append(") else (")
|
|
621
|
-
for varAssignNode in node.variableAssignments:
|
|
622
|
-
genNode(node.varAssignNode, sc)
|
|
623
|
-
genNode(node.bodyExpr)
|
|
624
|
-
sc.xpathCode.append(")")
|
|
625
|
-
|
|
626
|
-
etree.SubElement(sc.genLinkElement,
|
|
627
|
-
"{http://xbrl.org/2008/variable}generalVariable",
|
|
628
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "resource",
|
|
629
|
-
"{http://www.w3.org/1999/xlink}label": withExprGeneralVarLabel,
|
|
630
|
-
"select": xpathCode(genWithGenVarCode, sc)})
|
|
631
|
-
etree.SubElement(sc.genLinkElement,
|
|
632
|
-
"{http://xbrl.org/2008/variable}variableArc",
|
|
633
|
-
attrib={"{http://www.w3.org/1999/xlink}type": "arc",
|
|
634
|
-
"{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
|
|
635
|
-
"{http://www.w3.org/1999/xlink}from": sc.assertionID,
|
|
636
|
-
"{http://www.w3.org/1999/xlink}to": withExprGeneralVarLabel,
|
|
637
|
-
"name": node.variableName})
|
|
638
|
-
|
|
639
|
-
def cleanedName(name):
|
|
640
|
-
return re.sub(r"\W", "_", name)
|
|
641
|
-
|
|
642
|
-
genNodeHandler = {
|
|
643
|
-
"astAnnotationDeclaration": genNoOp,
|
|
644
|
-
"astBinaryOperation": genBinaryOperation,
|
|
645
|
-
"astComment": genNoOp,
|
|
646
|
-
"astFor": genFor,
|
|
647
|
-
"astFunctionReference": genFunctionReference,
|
|
648
|
-
"astHyperspaceExpression": genHyperspaceExpression,
|
|
649
|
-
"astIf": genIf,
|
|
650
|
-
"astMethodReference": genMethodReference,
|
|
651
|
-
"astNamespaceDeclaration": genNoOp,
|
|
652
|
-
"astNode": genNoOp,
|
|
653
|
-
"astNoOp": genNoOp,
|
|
654
|
-
"astNumericLiteral": genNumericLiteral,
|
|
655
|
-
"astQnameLiteral": genQnameLiteral,
|
|
656
|
-
"astSourceFile": genNoOp,
|
|
657
|
-
"astStringLiteral": genStringLiteral,
|
|
658
|
-
"astTagAssignment": genTagAssignment,
|
|
659
|
-
"astValuesIteration": genValuesIteration,
|
|
660
|
-
"astVariableAssignment": genVariableAssignment,
|
|
661
|
-
"astVariableReference": genVariableReference,
|
|
662
|
-
"astUnaryOperation": genUnaryOperation,
|
|
663
|
-
"astWith": genWith,
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
evaluationHandler = {
|
|
667
|
-
"astFunctionReference": evaluateFunctionReference,
|
|
668
|
-
"astQnameLiteral": evaluateQnameLiteral,
|
|
669
|
-
"astStringLiteral": evaluateStringLiteral,
|
|
670
|
-
"astVariableAssignment": evaluateVariableAssignment,
|
|
671
|
-
"astVariableReference": evaluateVariableReference,
|
|
672
|
-
}
|
|
673
|
-
formulaMethodSyntaxPatterns = {
|
|
674
|
-
#"abs": _abs,
|
|
675
|
-
#"add-time-period": _addTimePeriod,
|
|
676
|
-
#"balance": _balance,
|
|
677
|
-
#"concept": _concept,
|
|
678
|
-
#"concepts": _concepts,
|
|
679
|
-
#"contains": _contains,
|
|
680
|
-
#"credit": _credit,
|
|
681
|
-
#"days": _days,
|
|
682
|
-
#"debit": _debit,
|
|
683
|
-
#"decimals": _decimals,
|
|
684
|
-
#"dimension": _dimension,
|
|
685
|
-
#"dts-document-locations": _dtsDocumentLocations,
|
|
686
|
-
#"duration": _duration,
|
|
687
|
-
#"end-date": _endDate,
|
|
688
|
-
#"ends-with": _endsWith,
|
|
689
|
-
#"entity": _entityMethod,
|
|
690
|
-
#"exp": _exp,
|
|
691
|
-
#"has-decimals": _hasDecimals,
|
|
692
|
-
#"has-precision":_hasPrecision,
|
|
693
|
-
#"identifier": _identifier,
|
|
694
|
-
#"index-of": _indexOf,
|
|
695
|
-
#"instant": _instant,
|
|
696
|
-
#"is-forever": _isForever,
|
|
697
|
-
#"is-monetary": _isMonetary,
|
|
698
|
-
#"is-numeric": _isNumeric,
|
|
699
|
-
#"last-index-of":_lastIndexOf,
|
|
700
|
-
#"ln": _ln,
|
|
701
|
-
#"length": _length,
|
|
702
|
-
#"local-part": _localPart,
|
|
703
|
-
#"log": _log,
|
|
704
|
-
#"log10": _log10,
|
|
705
|
-
#"lower-case": _lowerCase,
|
|
706
|
-
#"name": _name,
|
|
707
|
-
#"period": _period,
|
|
708
|
-
#"period-type": _periodType,
|
|
709
|
-
#"power": _power,
|
|
710
|
-
#"precision": _precision,
|
|
711
|
-
#"primary": _primary,
|
|
712
|
-
#"replace": _replace,
|
|
713
|
-
#"round": _roundItem,
|
|
714
|
-
#"round-by-decimals": _roundDecimals,
|
|
715
|
-
#"round-by-precision": _roundPrecision,
|
|
716
|
-
#"scenario": _scenario,
|
|
717
|
-
#"schema-type": _schemaTypeMethod,
|
|
718
|
-
#"scheme": _scheme,
|
|
719
|
-
#"segment": _segment,
|
|
720
|
-
#"signum": _signum,
|
|
721
|
-
#"size": _size,
|
|
722
|
-
#"sqrt": _sqrt,
|
|
723
|
-
#"start-date": _startDate,
|
|
724
|
-
#"starts-with": _startsWith,
|
|
725
|
-
#"subtract-time-period": _subtractTimePeriod,
|
|
726
|
-
#"taxonomy": _taxonomy,
|
|
727
|
-
#"to-list": _toList,
|
|
728
|
-
#"to-set": _toSet,
|
|
729
|
-
#"tuple": _tuple,
|
|
730
|
-
#"unit": _unitMethod,
|
|
731
|
-
#"unknown": _notImplemented,
|
|
732
|
-
#"upper-case": _upperCase,
|
|
733
|
-
#"xbrl-type": _xbrlTypeMethod,
|
|
734
|
-
|
|
735
|
-
#networks
|
|
736
|
-
#"concept-hypercube-all": _conceptHypercubeAll,
|
|
737
|
-
#"concept-hypercube-all-networks": _conceptHypercubeAllNetworks,
|
|
738
|
-
#"concept-hypercube-not-all": _conceptHypercubeNotAll,
|
|
739
|
-
#"concept-hypercube-not-all-networks": _conceptHypercubeNotAllNetworks,
|
|
740
|
-
#"dimension-default": _dimensionDefault,
|
|
741
|
-
#"dimension-default-networks": _dimensionDefaultNetworks,
|
|
742
|
-
#"dimension-domain": _dimensionDomain,
|
|
743
|
-
#"dimension-domain-networks": _dimensionDomainNetworks,
|
|
744
|
-
#"domain-member": _domainMember,
|
|
745
|
-
#"domain-member-networks": _domainMemberNetworks,
|
|
746
|
-
#"essence-alias": _essenceAlias,
|
|
747
|
-
#"essence-alias-networks": _essenceAliasNetworks,
|
|
748
|
-
#"general-special": _generalSpecial,
|
|
749
|
-
#"general-special-networks": _generalSpecialNetworks,
|
|
750
|
-
#"generic-link": _genericLink,
|
|
751
|
-
#"generic-link-networks": _genericLinkNetworks,
|
|
752
|
-
#"hypercube-dimension": _hypercubeDimension,
|
|
753
|
-
#"hypercube-dimension-networks": _hypercubeDimensionNetworks,
|
|
754
|
-
#"network": _network,
|
|
755
|
-
#"networks": _networks,
|
|
756
|
-
#"parent-child": _parentChild,
|
|
757
|
-
#"parent-child-networks": _parentChildNetworks,
|
|
758
|
-
#"requires-element": _requiresElement,
|
|
759
|
-
#"requires-element-networks": _requiresElementNetworks,
|
|
760
|
-
#"similar-tuples": _similarTuples,
|
|
761
|
-
#"similar-tuples-networks": _similarTuplesNetworks,
|
|
762
|
-
#"summation-item": _summationItem,
|
|
763
|
-
#"summation-item-networks": _summationItemNetworks,
|
|
764
|
-
|
|
765
|
-
#network methods
|
|
766
|
-
#"ancestors": _ancestors,
|
|
767
|
-
#"ancestor-relationships": _ancestorRelationships,
|
|
768
|
-
#"arc-name": _arcName,
|
|
769
|
-
#"arcrole": _arcrole,
|
|
770
|
-
#"children": _children,
|
|
771
|
-
#"concepts": _concepts,
|
|
772
|
-
#"descendant-relationships": _descendantRelationships,
|
|
773
|
-
#"descendants": _descendants,
|
|
774
|
-
#"extended-link-name": _extendedLinkName,
|
|
775
|
-
#"incoming-relationships": _incomingRelationships,
|
|
776
|
-
#"outgoing-relationships": _outgoingRelationships,
|
|
777
|
-
#"parents": _parents,
|
|
778
|
-
#"relationships": _relationships,
|
|
779
|
-
#"role": _linkRole,
|
|
780
|
-
#"source-concepts": _sourceConcepts,
|
|
781
|
-
#"target-concepts": _targetConcepts,
|
|
782
|
-
|
|
783
|
-
#relationship methods
|
|
784
|
-
#"order": _order,
|
|
785
|
-
#"preferred-label": _preferredLabel,
|
|
786
|
-
#"source": _source,
|
|
787
|
-
#"target": _target,
|
|
788
|
-
#"weight": _weight,
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
formulaFunctionSyntaxPatterns = {
|
|
792
|
-
"boolean": ("xs:boolean(", ")"),
|
|
793
|
-
#"current-date-as-utc": _todayUTC,
|
|
794
|
-
# "duration": _durationFunction,
|
|
795
|
-
"entity": ("(", ")"),
|
|
796
|
-
#"forever": _foreverFunction,
|
|
797
|
-
"instant": ("xs:date(", ")"),
|
|
798
|
-
"number": ("number(", ")"),
|
|
799
|
-
#"schema-type": _schemaTypeFunction,
|
|
800
|
-
#"time-period": _timePeriodFunction,
|
|
801
|
-
#"unit": _unitFunction,
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
aggreativeFunctions = {
|
|
805
|
-
"all": ("every $test in (", ") satisfies $test)"),
|
|
806
|
-
"any": ("some $test in (", ") satisfies $test)"),
|
|
807
|
-
"avg": ("avg(", ")"),
|
|
808
|
-
"count": ("count(", ")"),
|
|
809
|
-
"exists": ("exists(", ")"),
|
|
810
|
-
"first": ("(", ")[1]"),
|
|
811
|
-
"list": ("(", ")"),
|
|
812
|
-
"max": ("max(", ")"),
|
|
813
|
-
#"median": _median,
|
|
814
|
-
"min": ("min(", ")"),
|
|
815
|
-
"missing": ("empty(", ")"),
|
|
816
|
-
#"mode": _mode,
|
|
817
|
-
#"modes": _modes,
|
|
818
|
-
#"set": _set,
|
|
819
|
-
#"stdevp": _stdevp,
|
|
820
|
-
"sum": ("sum(", ")"),
|
|
821
|
-
#"var": _var,
|
|
822
|
-
#"varp": _varp,
|
|
823
|
-
}
|