arelle-release 2.17.1__py3-none-any.whl → 2.37.71__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.
Files changed (893) hide show
  1. arelle/Aspect.py +6 -3
  2. arelle/BetaFeatures.py +3 -0
  3. arelle/Cntlr.py +117 -413
  4. arelle/CntlrCmdLine.py +364 -227
  5. arelle/CntlrQuickBooks.py +4 -2
  6. arelle/CntlrWebMain.py +179 -119
  7. arelle/CntlrWinMain.py +342 -124
  8. arelle/DialogAbout.py +1 -1
  9. arelle/DialogArcroleGroup.py +1 -1
  10. arelle/DialogFind.py +1 -1
  11. arelle/DialogFormulaParameters.py +2 -2
  12. arelle/DialogLanguage.py +45 -36
  13. arelle/DialogNewFactItem.py +1 -1
  14. arelle/DialogOpenArchive.py +30 -34
  15. arelle/DialogPackageManager.py +11 -8
  16. arelle/DialogPluginManager.py +43 -89
  17. arelle/DialogRssWatch.py +2 -2
  18. arelle/DialogURL.py +1 -1
  19. arelle/DialogUserPassword.py +1 -1
  20. arelle/DisclosureSystem.py +69 -1
  21. arelle/ErrorManager.py +321 -0
  22. arelle/FileSource.py +201 -99
  23. arelle/FunctionFn.py +44 -5
  24. arelle/FunctionIxt.py +16 -13
  25. arelle/FunctionUtil.py +1 -1
  26. arelle/FunctionXfi.py +68 -24
  27. arelle/FunctionXs.py +1 -1
  28. arelle/HtmlUtil.py +5 -4
  29. arelle/LeiUtil.py +63 -43
  30. arelle/LinkbaseType.py +94 -0
  31. arelle/LocalViewer.py +8 -2
  32. arelle/Locale.py +239 -79
  33. arelle/ModelDocument.py +180 -48
  34. arelle/ModelDtsObject.py +32 -27
  35. arelle/ModelFormulaObject.py +14 -6
  36. arelle/ModelInstanceObject.py +43 -14
  37. arelle/ModelManager.py +6 -1
  38. arelle/ModelObject.py +12 -8
  39. arelle/ModelObjectFactory.py +18 -2
  40. arelle/ModelRelationshipSet.py +46 -3
  41. arelle/ModelRenderingObject.py +899 -951
  42. arelle/ModelRssItem.py +2 -4
  43. arelle/ModelTestcaseObject.py +41 -4
  44. arelle/ModelValue.py +42 -14
  45. arelle/ModelVersReport.py +1 -1
  46. arelle/ModelXbrl.py +133 -273
  47. arelle/PackageManager.py +202 -176
  48. arelle/PluginManager.py +551 -239
  49. arelle/PluginUtils.py +54 -0
  50. arelle/PrototypeInstanceObject.py +53 -12
  51. arelle/PythonUtil.py +166 -25
  52. arelle/RuntimeOptions.py +32 -18
  53. arelle/SocketUtils.py +3 -0
  54. arelle/SystemInfo.py +1 -1
  55. arelle/TkTableWrapper.py +33 -5
  56. arelle/UITkTable.py +27 -21
  57. arelle/Updater.py +7 -3
  58. arelle/UrlUtil.py +6 -2
  59. arelle/Validate.py +596 -402
  60. arelle/ValidateDuplicateFacts.py +584 -0
  61. arelle/ValidateFileSource.py +38 -0
  62. arelle/ValidateFilingText.py +46 -29
  63. arelle/ValidateInfoset.py +104 -32
  64. arelle/ValidateUtr.py +31 -4
  65. arelle/ValidateXbrl.py +144 -120
  66. arelle/ValidateXbrlCalcs.py +51 -66
  67. arelle/ValidateXbrlDTS.py +98 -29
  68. arelle/Version.py +2 -7
  69. arelle/ViewFile.py +2 -0
  70. arelle/ViewFileDTS.py +7 -2
  71. arelle/ViewFileFactList.py +1 -1
  72. arelle/ViewFileFactTable.py +4 -4
  73. arelle/ViewFileRelationshipSet.py +36 -19
  74. arelle/ViewFileRenderedGrid.py +164 -753
  75. arelle/ViewFileRenderedLayout.py +174 -0
  76. arelle/ViewFileRenderedStructure.py +108 -0
  77. arelle/ViewWinDTS.py +4 -1
  78. arelle/ViewWinFactList.py +1 -1
  79. arelle/ViewWinFactTable.py +1 -1
  80. arelle/ViewWinRelationshipSet.py +14 -8
  81. arelle/ViewWinRenderedGrid.py +397 -287
  82. arelle/ViewWinRssFeed.py +4 -0
  83. arelle/ViewWinTree.py +15 -9
  84. arelle/ViewWinXml.py +1 -1
  85. arelle/WebCache.py +510 -272
  86. arelle/XbrlConst.py +202 -196
  87. arelle/XbrlUtil.py +2 -1
  88. arelle/XhtmlValidate.py +9 -23
  89. arelle/XmlUtil.py +24 -19
  90. arelle/XmlValidate.py +95 -67
  91. arelle/XmlValidateParticles.py +4 -4
  92. arelle/_version.py +33 -3
  93. arelle/api/Session.py +183 -0
  94. arelle/config/creationSoftwareNames.json +24 -10
  95. arelle/config/disclosuresystems.xml +1 -1
  96. arelle/config/disclosuresystems.xsd +3 -0
  97. arelle/config/sbr-text-formatting.xsd +737 -0
  98. arelle/conformance/CSVTestcaseLoader.py +102 -0
  99. arelle/formula/FactAspectsCache.py +10 -4
  100. arelle/formula/ValidateFormula.py +82 -194
  101. arelle/formula/XPathContext.py +42 -28
  102. arelle/formula/XPathParser.py +15 -9
  103. arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po +3 -4
  104. arelle/locale/messages.pot +1 -2
  105. arelle/locale/ru/LC_MESSAGES/ru.po +2 -2
  106. arelle/logging/formatters/LogFormatter.py +47 -0
  107. arelle/logging/handlers/LogHandlerWithXml.py +94 -0
  108. arelle/logging/handlers/LogToBufferHandler.py +20 -0
  109. arelle/logging/handlers/LogToPrintHandler.py +41 -0
  110. arelle/logging/handlers/LogToXmlHandler.py +244 -0
  111. arelle/logging/handlers/StructuredMessageLogHandler.py +74 -0
  112. arelle/model/CommentBase.py +3 -0
  113. arelle/model/ElementBase.py +3 -0
  114. arelle/model/PIBase.py +3 -0
  115. arelle/model/__init__.py +3 -0
  116. arelle/oim/Load.py +2869 -0
  117. arelle/oim/Validate.py +155 -0
  118. arelle/oim/xml/Save.py +21 -0
  119. arelle/packages/PackageConst.py +7 -0
  120. arelle/packages/PackageType.py +13 -0
  121. arelle/packages/PackageUtils.py +22 -0
  122. arelle/packages/PackageValidation.py +200 -0
  123. arelle/packages/report/DetectReportPackage.py +13 -0
  124. arelle/packages/report/ReportPackage.py +265 -0
  125. arelle/packages/report/ReportPackageConst.py +79 -0
  126. arelle/packages/report/ReportPackageValidator.py +207 -0
  127. arelle/plugin/EdgarRendererAllReports.py +12 -12
  128. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  129. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  130. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
  131. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  132. arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
  133. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  134. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  135. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  136. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  137. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  138. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  139. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  140. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  141. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  142. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  143. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  144. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  145. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  146. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  147. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  148. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  149. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  150. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  151. arelle/plugin/OimTaxonomy/__init__.py +1037 -0
  152. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  153. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  154. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  155. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  156. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  157. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  158. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  159. arelle/plugin/formulaLoader.py +3 -3
  160. arelle/plugin/formulaSaver.py +4 -4
  161. arelle/plugin/inlineXbrlDocumentSet.py +331 -102
  162. arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py +1 -1
  163. arelle/plugin/loadFromExcel.py +13 -10
  164. arelle/plugin/loadFromOIM.py +16 -3096
  165. arelle/plugin/logging/saveMessages.py +1 -1
  166. arelle/plugin/saveHtmlEBAtables.py +293 -213
  167. arelle/plugin/saveLoadableOIM.py +652 -361
  168. arelle/plugin/saveOIMTaxonomy.py +311 -0
  169. arelle/plugin/streamingExtensions.py +1 -1
  170. arelle/plugin/systemInfo.py +46 -0
  171. arelle/plugin/transforms/tester.py +4 -4
  172. arelle/plugin/validate/CIPC/Const.py +18 -0
  173. arelle/plugin/validate/CIPC/__init__.py +34 -13
  174. arelle/plugin/validate/DBA/DisclosureSystems.py +12 -0
  175. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +165 -0
  176. arelle/plugin/validate/DBA/ValidationPluginExtension.py +545 -0
  177. arelle/plugin/validate/DBA/__init__.py +49 -0
  178. arelle/plugin/validate/DBA/resources/config.xml +21 -0
  179. arelle/plugin/validate/DBA/rules/__init__.py +323 -0
  180. arelle/plugin/validate/DBA/rules/fr.py +1377 -0
  181. arelle/plugin/validate/DBA/rules/tc.py +45 -0
  182. arelle/plugin/validate/DBA/rules/th.py +172 -0
  183. arelle/plugin/validate/DBA/rules/tm.py +351 -0
  184. arelle/plugin/validate/DBA/rules/tr.py +373 -0
  185. arelle/plugin/validate/EBA/__init__.py +11 -12
  186. arelle/plugin/validate/EDINET/Constants.py +208 -0
  187. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  188. arelle/plugin/validate/EDINET/ControllerPluginData.py +298 -0
  189. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  190. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  191. arelle/plugin/validate/EDINET/DisclosureSystems.py +1 -0
  192. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  193. arelle/plugin/validate/EDINET/FormType.py +134 -0
  194. arelle/plugin/validate/EDINET/ManifestInstance.py +236 -0
  195. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +640 -0
  196. arelle/plugin/validate/EDINET/ReportFolderType.py +162 -0
  197. arelle/plugin/validate/EDINET/Statement.py +139 -0
  198. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +493 -0
  199. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  200. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +64 -0
  201. arelle/plugin/validate/EDINET/__init__.py +109 -0
  202. arelle/plugin/validate/EDINET/resources/config.xml +22 -0
  203. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  204. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  205. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +62 -0
  206. arelle/plugin/validate/EDINET/rules/contexts.py +547 -0
  207. arelle/plugin/validate/EDINET/rules/edinet.py +1991 -0
  208. arelle/plugin/validate/EDINET/rules/frta.py +301 -0
  209. arelle/plugin/validate/EDINET/rules/gfm.py +2394 -0
  210. arelle/plugin/validate/EDINET/rules/manifests.py +88 -0
  211. arelle/plugin/validate/EDINET/rules/upload.py +1370 -0
  212. arelle/plugin/validate/ESEF/Const.py +16 -75
  213. arelle/plugin/validate/ESEF/Dimensions.py +2 -2
  214. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +6 -1
  215. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +7 -4
  216. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +80 -57
  217. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +60 -22
  218. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +272 -133
  219. arelle/plugin/validate/ESEF/Util.py +5 -19
  220. arelle/plugin/validate/ESEF/__init__.py +61 -46
  221. arelle/plugin/validate/ESEF/resources/authority-validations.json +120 -10
  222. arelle/plugin/validate/ESEF/resources/config.xml +44 -3
  223. arelle/plugin/validate/FERC/__init__.py +31 -18
  224. arelle/plugin/validate/FERC/config.xml +18 -18
  225. arelle/plugin/validate/NL/DisclosureSystems.py +19 -3
  226. arelle/plugin/validate/NL/PluginValidationDataExtension.py +710 -7
  227. arelle/plugin/validate/NL/ValidationPluginExtension.py +117 -12
  228. arelle/plugin/validate/NL/__init__.py +21 -10
  229. arelle/plugin/validate/NL/resources/config.xml +27 -6
  230. arelle/plugin/validate/NL/rules/br_kvk.py +81 -21
  231. arelle/plugin/validate/NL/rules/fg_nl.py +292 -0
  232. arelle/plugin/validate/NL/rules/fr_kvk.py +60 -7
  233. arelle/plugin/validate/NL/rules/fr_nl.py +705 -24
  234. arelle/plugin/validate/NL/rules/nl_kvk.py +2182 -0
  235. arelle/plugin/validate/ROS/DisclosureSystems.py +1 -0
  236. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +109 -0
  237. arelle/plugin/validate/ROS/ValidationPluginExtension.py +27 -0
  238. arelle/plugin/validate/ROS/__init__.py +28 -341
  239. arelle/plugin/validate/ROS/resources/config.xml +20 -0
  240. arelle/plugin/validate/ROS/rules/__init__.py +56 -0
  241. arelle/plugin/validate/ROS/rules/ros.py +393 -0
  242. arelle/plugin/validate/UK/ValidateUK.py +1372 -0
  243. arelle/plugin/validate/{HMRC → UK}/__init__.py +195 -189
  244. arelle/plugin/validate/{HMRC → UK}/config.xml +1 -1
  245. arelle/plugin/xbrlDB/SqlDb.py +1 -1
  246. arelle/plugin/xbrlDB/XbrlOpenSqlDB.py +5 -5
  247. arelle/plugin/xbrlDB/XbrlPublicPostgresDB.py +1 -1
  248. arelle/plugin/xbrlDB/XbrlSemanticJsonDB.py +1 -1
  249. arelle/plugin/xbrlDB/XbrlSemanticRdfDB.py +1 -1
  250. arelle/plugin/xbrlDB/__init__.py +4 -1
  251. arelle/{RenderingEvaluator.py → rendering/RenderingEvaluator.py} +120 -99
  252. arelle/rendering/RenderingLayout.py +476 -0
  253. arelle/rendering/RenderingResolution.py +814 -0
  254. arelle/resources/cache/http/www.eurofiling.info/eu/fr/xbrl/ext/filing-indicators.xsd +20 -0
  255. arelle/resources/cache/http/www.w3.org/2001/03/xml.xsd +117 -0
  256. arelle/resources/cache/http/www.w3.org/2001/XMLSchema.xsd +2534 -0
  257. arelle/resources/cache/http/www.w3.org/2001/xml.xsd +287 -0
  258. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd +779 -0
  259. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd +486 -0
  260. arelle/resources/cache/http/www.xbrl.org/2003/xl-2003-12-31.xsd +251 -0
  261. arelle/resources/cache/http/www.xbrl.org/2003/xlink-2003-12-31.xsd +121 -0
  262. arelle/resources/cache/http/www.xbrl.org/2004/ref-2004-08-10.xsd +129 -0
  263. arelle/resources/cache/http/www.xbrl.org/2005/xbrldt-2005.xsd +53 -0
  264. arelle/resources/cache/http/www.xbrl.org/2006/ref-2006-02-27.xsd +120 -0
  265. arelle/resources/cache/http/www.xbrl.org/2006/xbrldi-2006.xsd +41 -0
  266. arelle/resources/cache/http/www.xbrl.org/2008/boolean-filter.xsd +51 -0
  267. arelle/resources/cache/http/www.xbrl.org/2008/concept-filter.xsd +127 -0
  268. arelle/resources/cache/http/www.xbrl.org/2008/conformance.xsd +116 -0
  269. arelle/resources/cache/http/www.xbrl.org/2008/conformanceFunction.xsd +51 -0
  270. arelle/resources/cache/http/www.xbrl.org/2008/consistency-assertion.xsd +66 -0
  271. arelle/resources/cache/http/www.xbrl.org/2008/dimension-filter.xsd +86 -0
  272. arelle/resources/cache/http/www.xbrl.org/2008/entity-filter.xsd +92 -0
  273. arelle/resources/cache/http/www.xbrl.org/2008/existence-assertion.xsd +44 -0
  274. arelle/resources/cache/http/www.xbrl.org/2008/formula.xsd +261 -0
  275. arelle/resources/cache/http/www.xbrl.org/2008/function.xsd +90 -0
  276. arelle/resources/cache/http/www.xbrl.org/2008/general-filter.xsd +38 -0
  277. arelle/resources/cache/http/www.xbrl.org/2008/generic-label.xsd +80 -0
  278. arelle/resources/cache/http/www.xbrl.org/2008/generic-link.xsd +81 -0
  279. arelle/resources/cache/http/www.xbrl.org/2008/generic-reference.xsd +63 -0
  280. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  281. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  282. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xl-2003-12-31.xsd +248 -0
  283. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xlink-2003-12-31.xsd +117 -0
  284. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xframes-1.xsd +166 -0
  285. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-applet-1.xsd +66 -0
  286. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-attribs-1.xsd +72 -0
  287. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-base-1.xsd +36 -0
  288. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-form-1.xsd +195 -0
  289. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-table-1.xsd +169 -0
  290. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-model-1.xsd +376 -0
  291. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  292. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  293. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10.xsd +98 -0
  294. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-bdo-1.xsd +78 -0
  295. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkphras-1.xsd +161 -0
  296. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkpres-1.xsd +37 -0
  297. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkstruct-1.xsd +49 -0
  298. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-charent-1.xsd +38 -0
  299. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-copyright-1.xsd +29 -0
  300. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-csismap-1.xsd +96 -0
  301. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-datatypes-1.xsd +128 -0
  302. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-edit-1.xsd +39 -0
  303. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-events-1.xsd +130 -0
  304. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-form-1.xsd +326 -0
  305. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-frames-1.xsd +113 -0
  306. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-framework-1.xsd +66 -0
  307. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-hypertext-1.xsd +47 -0
  308. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-iframe-1.xsd +68 -0
  309. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-image-1.xsd +45 -0
  310. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlphras-1.xsd +163 -0
  311. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlpres-1.xsd +39 -0
  312. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstruct-1.xsd +50 -0
  313. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstyle-1.xsd +27 -0
  314. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-legacy-1.xsd +97 -0
  315. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-link-1.xsd +45 -0
  316. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-list-1.xsd +99 -0
  317. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-meta-1.xsd +42 -0
  318. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-misc-1.xsd +441 -0
  319. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-nameident-1.xsd +63 -0
  320. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-notations-1.xsd +69 -0
  321. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-object-1.xsd +76 -0
  322. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-param-1.xsd +51 -0
  323. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-pres-1.xsd +51 -0
  324. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-1.xsd +171 -0
  325. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  326. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-script-1.xsd +70 -0
  327. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ssismap-1.xsd +43 -0
  328. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-struct-1.xsd +112 -0
  329. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-style-1.xsd +52 -0
  330. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-table-1.xsd +272 -0
  331. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-target-1.xsd +53 -0
  332. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-text-1.xsd +67 -0
  333. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-model-1.xsd +677 -0
  334. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  335. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-modules-1.xsd +528 -0
  336. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11.xsd +104 -0
  337. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml2.xsd +21 -0
  338. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-1.xsd +73 -0
  339. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-2.xsd +74 -0
  340. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-1.xsd +73 -0
  341. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-2.xsd +75 -0
  342. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-1.xsd +34 -0
  343. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-2.xsd +34 -0
  344. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-handlers-2.xsd +98 -0
  345. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-definitions.xsd +225 -0
  346. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-model.xsd +681 -0
  347. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-modules.xsd +535 -0
  348. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0.xsd +40 -0
  349. arelle/resources/cache/http/www.xbrl.org/2008/match-filter.xsd +94 -0
  350. arelle/resources/cache/http/www.xbrl.org/2008/period-filter.xsd +86 -0
  351. arelle/resources/cache/http/www.xbrl.org/2008/registry.xsd +145 -0
  352. arelle/resources/cache/http/www.xbrl.org/2008/relative-filter.xsd +38 -0
  353. arelle/resources/cache/http/www.xbrl.org/2008/segment-scenario-filter.xsd +41 -0
  354. arelle/resources/cache/http/www.xbrl.org/2008/tuple-filter.xsd +83 -0
  355. arelle/resources/cache/http/www.xbrl.org/2008/unit-filter.xsd +58 -0
  356. arelle/resources/cache/http/www.xbrl.org/2008/validation.xsd +78 -0
  357. arelle/resources/cache/http/www.xbrl.org/2008/value-assertion.xsd +43 -0
  358. arelle/resources/cache/http/www.xbrl.org/2008/value-filter.xsd +43 -0
  359. arelle/resources/cache/http/www.xbrl.org/2008/variable.xsd +240 -0
  360. arelle/resources/cache/http/www.xbrl.org/2010/aspect-cover-filter.xsd +67 -0
  361. arelle/resources/cache/http/www.xbrl.org/2010/concept-relation-filter.xsd +108 -0
  362. arelle/resources/cache/http/www.xbrl.org/2010/custom-function-implementation.xsd +71 -0
  363. arelle/resources/cache/http/www.xbrl.org/2010/generic-message.xsd +68 -0
  364. arelle/resources/cache/http/www.xbrl.org/2010/validation-message.xsd +50 -0
  365. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  366. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  367. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xl-2003-12-31.xsd +248 -0
  368. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xlink-2003-12-31.xsd +117 -0
  369. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xframes-1.xsd +166 -0
  370. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-applet-1.xsd +66 -0
  371. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-attribs-1.xsd +72 -0
  372. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-base-1.xsd +36 -0
  373. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-form-1.xsd +195 -0
  374. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-table-1.xsd +169 -0
  375. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-model-1.xsd +376 -0
  376. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  377. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  378. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10.xsd +98 -0
  379. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-bdo-1.xsd +78 -0
  380. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkphras-1.xsd +161 -0
  381. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkpres-1.xsd +37 -0
  382. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkstruct-1.xsd +49 -0
  383. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-charent-1.xsd +38 -0
  384. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-copyright-1.xsd +29 -0
  385. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-csismap-1.xsd +96 -0
  386. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-datatypes-1.xsd +128 -0
  387. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-edit-1.xsd +39 -0
  388. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-events-1.xsd +130 -0
  389. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-form-1.xsd +326 -0
  390. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-frames-1.xsd +113 -0
  391. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-framework-1.xsd +66 -0
  392. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-hypertext-1.xsd +47 -0
  393. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-iframe-1.xsd +68 -0
  394. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-image-1.xsd +45 -0
  395. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlphras-1.xsd +163 -0
  396. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlpres-1.xsd +39 -0
  397. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstruct-1.xsd +50 -0
  398. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstyle-1.xsd +27 -0
  399. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-legacy-1.xsd +97 -0
  400. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-link-1.xsd +45 -0
  401. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-list-1.xsd +99 -0
  402. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-meta-1.xsd +42 -0
  403. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-misc-1.xsd +441 -0
  404. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-nameident-1.xsd +63 -0
  405. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-notations-1.xsd +69 -0
  406. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-object-1.xsd +76 -0
  407. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-param-1.xsd +51 -0
  408. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-pres-1.xsd +51 -0
  409. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-1.xsd +171 -0
  410. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  411. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-script-1.xsd +70 -0
  412. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ssismap-1.xsd +43 -0
  413. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-struct-1.xsd +112 -0
  414. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-style-1.xsd +52 -0
  415. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-table-1.xsd +272 -0
  416. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-target-1.xsd +53 -0
  417. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-text-1.xsd +67 -0
  418. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-model-1.xsd +677 -0
  419. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  420. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-modules-1.xsd +528 -0
  421. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11.xsd +104 -0
  422. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml2.xsd +21 -0
  423. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-1.xsd +73 -0
  424. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-2.xsd +74 -0
  425. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-1.xsd +73 -0
  426. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-2.xsd +75 -0
  427. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-1.xsd +34 -0
  428. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-2.xsd +34 -0
  429. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-handlers-2.xsd +98 -0
  430. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-definitions.xsd +252 -0
  431. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-model.xsd +681 -0
  432. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-modules.xsd +535 -0
  433. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1.xsd +40 -0
  434. arelle/resources/cache/http/www.xbrl.org/2013/match-filter.xsd +94 -0
  435. arelle/resources/cache/http/www.xbrl.org/2013/preferred-label.xsd +12 -0
  436. arelle/resources/cache/http/www.xbrl.org/2013/versioning-base.xsd +142 -0
  437. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-details.xsd +143 -0
  438. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-use.xsd +64 -0
  439. arelle/resources/cache/http/www.xbrl.org/2013/versioning-dimensions.xsd +162 -0
  440. arelle/resources/cache/http/www.xbrl.org/2014/extensible-enumerations.xsd +27 -0
  441. arelle/resources/cache/http/www.xbrl.org/2014/table.xsd +356 -0
  442. arelle/resources/cache/http/www.xbrl.org/2014/tablemodel.xsd +156 -0
  443. arelle/resources/cache/http/www.xbrl.org/2016/assertion-severity.xsd +29 -0
  444. arelle/resources/cache/http/www.xbrl.org/2016/severities.xml +21 -0
  445. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package-catalog.xsd +38 -0
  446. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package.xsd +154 -0
  447. arelle/resources/cache/http/www.xbrl.org/2022/assertion-severity.xsd +43 -0
  448. arelle/resources/cache/http/www.xbrl.org/2022/severities.xml +21 -0
  449. arelle/resources/cache/http/www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd +76 -0
  450. arelle/resources/cache/http/www.xbrl.org/dtr/type/numeric-2009-12-16.xsd +78 -0
  451. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/accounting-arcrole-2023-01-04.xsd +39 -0
  452. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd +29 -0
  453. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/esma-arcrole-2018-11-21.xsd +14 -0
  454. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd +13 -0
  455. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/jpfr-arcrole-2007-11-07.xsd +27 -0
  456. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/parent-child-2013-09-19.xsd +12 -0
  457. arelle/resources/cache/http/www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd +17 -0
  458. arelle/resources/cache/http/www.xbrl.org/lrr/role/jpfr-role-2007-11-07.xsd +47 -0
  459. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2008-03-31.xsd +30 -0
  460. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2009-12-16.xsd +33 -0
  461. arelle/resources/cache/http/www.xbrl.org/lrr/role/negative-2009-12-16.xsd +25 -0
  462. arelle/resources/cache/http/www.xbrl.org/lrr/role/net-2009-12-16.xsd +13 -0
  463. arelle/resources/cache/http/www.xbrl.org/lrr/role/positive-2009-12-16.xsd +25 -0
  464. arelle/resources/cache/http/www.xbrl.org/lrr/role/property-2022-09-28.xsd +15 -0
  465. arelle/resources/cache/http/www.xbrl.org/lrr/role/reference-2009-12-16.xsd +21 -0
  466. arelle/resources/cache/http/www.xbrl.org/lrr/role/restated-2006-02-21.xsd +19 -0
  467. arelle/resources/cache/http/www.xbrl.org/utr/2012-01-30/utr.xml +4543 -0
  468. arelle/resources/cache/http/www.xbrl.org/utr/2012-10-31/utr.xml +4510 -0
  469. arelle/resources/cache/http/www.xbrl.org/utr/2012-11-30/utr.xml +4567 -0
  470. arelle/resources/cache/http/www.xbrl.org/utr/2013-02-28/utr.xml +5180 -0
  471. arelle/resources/cache/http/www.xbrl.org/utr/2013-05-17/utr.xml +5349 -0
  472. arelle/resources/cache/http/www.xbrl.org/utr/2016-08-10/utr.xml +5363 -0
  473. arelle/resources/cache/http/www.xbrl.org/utr/2017-07-12/utr.xml +6164 -0
  474. arelle/resources/cache/http/www.xbrl.org/utr/2021-02-16/utr.xml +6370 -0
  475. arelle/resources/cache/http/www.xbrl.org/utr/2021-12-08/utr.xml +6493 -0
  476. arelle/resources/cache/http/www.xbrl.org/utr/2022-02-16/utr.xml +6551 -0
  477. arelle/resources/cache/http/www.xbrl.org/utr/2022-07-20/utr.xml +6638 -0
  478. arelle/resources/cache/http/www.xbrl.org/utr/2023-12-20/utr.xml +6680 -0
  479. arelle/resources/cache/http/www.xbrl.org/utr/2024-01-31/utr.xml +6680 -0
  480. arelle/resources/cache/http/www.xbrl.org/utr/2024-10-22/utr.xml +6693 -0
  481. arelle/resources/cache/http/www.xbrl.org/utr/utr.xml +6693 -0
  482. arelle/resources/cache/https/www.xbrl.org/2005/conformance.xsd +87 -0
  483. arelle/resources/cache/https/www.xbrl.org/2020/extensible-enumerations-2.0.xsd +51 -0
  484. arelle/resources/cache/https/www.xbrl.org/2023/calculation-1.1.xsd +27 -0
  485. arelle/resources/cache/https/www.xbrl.org/dtr/type/2020-01-21/types.xsd +812 -0
  486. arelle/resources/cache/https/www.xbrl.org/dtr/type/2022-03-31/types.xsd +847 -0
  487. arelle/resources/cache/https/www.xbrl.org/dtr/type/2024-01-31/types.xsd +897 -0
  488. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-def.xml +68 -0
  489. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-label.xml +84 -0
  490. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators.xsd +67 -0
  491. arelle/resources/libs/Tktable2.11/linux-x86_64/README.txt +149 -0
  492. arelle/resources/libs/Tktable2.11/linux-x86_64/html/tkTable.html +2039 -0
  493. arelle/resources/libs/Tktable2.11/linux-x86_64/libTktable2.11.so +0 -0
  494. arelle/resources/libs/Tktable2.11/linux-x86_64/license.txt +51 -0
  495. arelle/resources/libs/Tktable2.11/linux-x86_64/pkgIndex.tcl +3 -0
  496. arelle/resources/libs/Tktable2.11/linux-x86_64/tkTable.tcl +825 -0
  497. arelle/resources/libs/Tktable2.11/linux-x86_64/tktable.py +674 -0
  498. arelle/resources/libs/Tktable2.11/macos-arm64/README.txt +149 -0
  499. arelle/resources/libs/Tktable2.11/macos-arm64/html/tkTable.html +2039 -0
  500. arelle/resources/libs/Tktable2.11/macos-arm64/libTktable2.11.dylib +0 -0
  501. arelle/resources/libs/Tktable2.11/macos-arm64/license.txt +51 -0
  502. arelle/resources/libs/Tktable2.11/macos-arm64/pkgIndex.tcl +2 -0
  503. arelle/resources/libs/Tktable2.11/macos-arm64/tkTable.tcl +825 -0
  504. arelle/resources/libs/Tktable2.11/macos-arm64/tktable.py +674 -0
  505. arelle/resources/libs/Tktable2.11/macos-x86_64/README.txt +149 -0
  506. arelle/resources/libs/Tktable2.11/macos-x86_64/html/tkTable.html +2039 -0
  507. arelle/resources/libs/Tktable2.11/macos-x86_64/libTktable2.11.dylib +0 -0
  508. arelle/resources/libs/Tktable2.11/macos-x86_64/license.txt +51 -0
  509. arelle/resources/libs/Tktable2.11/macos-x86_64/pkgIndex.tcl +2 -0
  510. arelle/resources/libs/Tktable2.11/macos-x86_64/tkTable.tcl +825 -0
  511. arelle/resources/libs/Tktable2.11/macos-x86_64/tktable.py +674 -0
  512. arelle/resources/libs/Tktable2.11/win-x86_64/Tktable.dll +0 -0
  513. arelle/resources/libs/Tktable2.11/win-x86_64/pkgIndex.tcl +2 -0
  514. arelle/resources/libs/Tktable2.11/win-x86_64/tkTable.tcl +825 -0
  515. arelle/typing.py +9 -4
  516. arelle/utils/Contexts.py +38 -0
  517. arelle/utils/EntryPointDetection.py +139 -0
  518. arelle/utils/Equivalence.py +22 -0
  519. arelle/utils/{validate/PluginValidationData.py → PluginData.py} +5 -2
  520. arelle/utils/PluginHooks.py +256 -5
  521. arelle/utils/Units.py +36 -0
  522. arelle/utils/validate/Decorator.py +5 -3
  523. arelle/utils/validate/DetectScriptsInXhtml.py +99 -0
  524. arelle/utils/validate/ESEFImage.py +283 -0
  525. arelle/utils/validate/Validation.py +9 -1
  526. arelle/utils/validate/ValidationPlugin.py +74 -11
  527. arelle/utils/validate/ValidationUtil.py +55 -0
  528. arelle/webserver/bottle.py +5 -4424
  529. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/METADATA +51 -42
  530. arelle_release-2.37.71.dist-info/RECORD +697 -0
  531. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/WHEEL +1 -1
  532. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info/licenses}/LICENSE.md +1 -4
  533. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/top_level.txt +0 -1
  534. arelle/DialogOpenTaxonomyPackage.py +0 -1
  535. arelle/RenderingResolver.py +0 -624
  536. arelle/examples/.pydevproject +0 -5
  537. arelle/examples/CustomLogger.py +0 -43
  538. arelle/examples/LoadEFMvalidate.py +0 -32
  539. arelle/examples/LoadSavePreLbCsv.py +0 -26
  540. arelle/examples/LoadValidate.cs +0 -31
  541. arelle/examples/LoadValidate.py +0 -36
  542. arelle/examples/LoadValidateCmdLine.java +0 -69
  543. arelle/examples/LoadValidatePostedZip.java +0 -57
  544. arelle/examples/LoadValidateWebService.java +0 -34
  545. arelle/examples/SaveTableToExelle.py +0 -140
  546. arelle/examples/TR3toTR4.py +0 -88
  547. arelle/examples/plugin/bigInstance.py +0 -394
  548. arelle/examples/plugin/cmdWebServerExtension.py +0 -42
  549. arelle/examples/plugin/crashTest.py +0 -38
  550. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  551. arelle/examples/plugin/functionsCustom.py +0 -59
  552. arelle/examples/plugin/hello_dolly.py +0 -64
  553. arelle/examples/plugin/hello_i18n.pot +0 -26
  554. arelle/examples/plugin/hello_i18n.py +0 -32
  555. arelle/examples/plugin/importTestChild1.py +0 -21
  556. arelle/examples/plugin/importTestChild2.py +0 -22
  557. arelle/examples/plugin/importTestGrandchild1.py +0 -21
  558. arelle/examples/plugin/importTestGrandchild2.py +0 -21
  559. arelle/examples/plugin/importTestImported1.py +0 -23
  560. arelle/examples/plugin/importTestImported11.py +0 -22
  561. arelle/examples/plugin/importTestParent.py +0 -48
  562. arelle/examples/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  563. arelle/examples/plugin/packagedImportTest/__init__.py +0 -47
  564. arelle/examples/plugin/packagedImportTest/importTestChild1.py +0 -21
  565. arelle/examples/plugin/packagedImportTest/importTestChild2.py +0 -22
  566. arelle/examples/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  567. arelle/examples/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  568. arelle/examples/plugin/packagedImportTest/importTestImported1.py +0 -24
  569. arelle/examples/plugin/packagedImportTest/importTestImported11.py +0 -21
  570. arelle/examples/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  571. arelle/examples/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  572. arelle/examples/plugin/sakaCalendar.py +0 -215
  573. arelle/examples/plugin/saveInstanceInfoset.py +0 -121
  574. arelle/examples/plugin/streamingExtensions.py +0 -335
  575. arelle/examples/plugin/testcaseCalc11ValidateSetup.py +0 -32
  576. arelle/examples/plugin/testcaseIxExpectedHtmlFixup.py +0 -45
  577. arelle/examples/plugin/updateTableLB.py +0 -242
  578. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  579. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  580. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  581. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  582. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  583. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -109
  584. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -58
  585. arelle/examples/plugin/validateSchemaLxml.py +0 -156
  586. arelle/examples/plugin/validateTableInfoset.py +0 -52
  587. arelle/examples/us-gaap-dei-docType-extraction-frm.xml +0 -90
  588. arelle/examples/us-gaap-dei-ratio-cash-frm.xml +0 -150
  589. arelle/plugin/functionsXmlCreation.py +0 -106
  590. arelle/plugin/instanceInfo.py +0 -306
  591. arelle/plugin/loadFromOIM-2018.py +0 -1282
  592. arelle/plugin/objectmaker.py +0 -285
  593. arelle/plugin/sphinx/FormulaGenerator.py +0 -823
  594. arelle/plugin/sphinx/SphinxContext.py +0 -404
  595. arelle/plugin/sphinx/SphinxEvaluator.py +0 -783
  596. arelle/plugin/sphinx/SphinxMethods.py +0 -1287
  597. arelle/plugin/sphinx/SphinxParser.py +0 -1093
  598. arelle/plugin/sphinx/SphinxValidator.py +0 -163
  599. arelle/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  600. arelle/plugin/sphinx/__init__.py +0 -285
  601. arelle/plugin/transforms/SEC/__init__.py +0 -308
  602. arelle/plugin/transforms/SEC/conf/README.md +0 -39
  603. arelle/plugin/transforms/SEC/conf/extractTestcase.sh +0 -2
  604. arelle/plugin/transforms/SEC/conf/extractTestcase.xsl +0 -109
  605. arelle/plugin/transforms/SEC/conf/runIxtSecTests.sh +0 -16
  606. arelle/plugin/transforms/SEC/conf/saxon9.jar +0 -0
  607. arelle/plugin/transforms/SEC/conf/testcase.xml +0 -7117
  608. arelle/plugin/transforms/SEC/conf/tests.xml +0 -848
  609. arelle/plugin/transforms/SEC/text2num.py +0 -110
  610. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-boolballotbox.xml +0 -66
  611. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-countrynameen.xml +0 -65
  612. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-datequarterend.xml +0 -66
  613. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durday.xml +0 -61
  614. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durhour.xml +0 -69
  615. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durmonth.xml +0 -71
  616. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durweek.xml +0 -70
  617. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durwordsen.xml +0 -56
  618. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-duryear.xml +0 -64
  619. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-edgarprovcountryen.xml +0 -65
  620. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-entityfilercategoryen.xml +0 -63
  621. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-exchnameen.xml +0 -86
  622. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-numwordsen.xml +0 -55
  623. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-stateprovnameen.xml +0 -64
  624. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-yesnoballotbox.xml +0 -66
  625. arelle/plugin/transforms/SEC/transformationRegistry/registry/transform-registry.xml +0 -314
  626. arelle/plugin/transforms/SEC/transformationRegistry/schema/inlinexbrl-sec-transformation.xsd +0 -418
  627. arelle/plugin/validate/EFM/Consts.py +0 -362
  628. arelle/plugin/validate/EFM/DTS.py +0 -569
  629. arelle/plugin/validate/EFM/Dimensions.py +0 -264
  630. arelle/plugin/validate/EFM/Document.py +0 -206
  631. arelle/plugin/validate/EFM/Filing.py +0 -4383
  632. arelle/plugin/validate/EFM/IsolateSeparateIXDSes.py +0 -19
  633. arelle/plugin/validate/EFM/MessageNumericId.py +0 -142
  634. arelle/plugin/validate/EFM/PreCalAlignment.py +0 -324
  635. arelle/plugin/validate/EFM/Util.py +0 -688
  636. arelle/plugin/validate/EFM/__init__.py +0 -843
  637. arelle/plugin/validate/EFM/config.xml +0 -333
  638. arelle/plugin/validate/EFM/resources/README.md +0 -57
  639. arelle/plugin/validate/EFM/resources/axiswarnings.json +0 -27
  640. arelle/plugin/validate/EFM/resources/cef-deprecated-concepts.json +0 -8
  641. arelle/plugin/validate/EFM/resources/country-deprecated-concepts.json +0 -19
  642. arelle/plugin/validate/EFM/resources/currency-deprecated-concepts.json +0 -7
  643. arelle/plugin/validate/EFM/resources/dei-deprecated-concepts.json +0 -8
  644. arelle/plugin/validate/EFM/resources/dei-validations.json +0 -2884
  645. arelle/plugin/validate/EFM/resources/dqc-us-rules.json +0 -1389
  646. arelle/plugin/validate/EFM/resources/ecd-deprecated-concepts.json +0 -1
  647. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-16-4.xml +0 -115
  648. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-0-4.xml +0 -300
  649. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-1.xml +0 -304
  650. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-2.xml +0 -290
  651. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-3-1.xml +0 -294
  652. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.1.xml +0 -549
  653. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.2.xml +0 -506
  654. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.3.xml +0 -496
  655. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-1.xml +0 -662
  656. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-2.xml +0 -3761
  657. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-3.xml +0 -3577
  658. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-1.xml +0 -4020
  659. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-2.xml +0 -3320
  660. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-3.xml +0 -2998
  661. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2012.xml +0 -957
  662. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2013.xml +0 -982
  663. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2014.xml +0 -1001
  664. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2015.xml +0 -1076
  665. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2016.xml +0 -120
  666. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-1.xml +0 -3329
  667. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-2.xml +0 -1230
  668. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-3.xml +0 -1113
  669. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-4.xml +0 -1321
  670. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1-preview.xml +0 -1721
  671. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1.xml +0 -1841
  672. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2-2.xml +0 -1450
  673. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2.xml +0 -1429
  674. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-4.xml +0 -1527
  675. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1-1.xml +0 -2049
  676. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1.xml +0 -2065
  677. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-2.xml +0 -1674
  678. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-3.xml +0 -1715
  679. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-all-years.xml +0 -10671
  680. arelle/plugin/validate/EFM/resources/edgartaxonomies/erxl.xsd +0 -69
  681. arelle/plugin/validate/EFM/resources/edgartaxonomies/extendedtaxonomies-all-years.xml +0 -18
  682. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrs-taxonomies.xml +0 -3126
  683. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrstaxonomies-all-years.xml +0 -22
  684. arelle/plugin/validate/EFM/resources/ex26-validations.json +0 -255
  685. arelle/plugin/validate/EFM/resources/exch-deprecated-concepts.json +0 -163
  686. arelle/plugin/validate/EFM/resources/ifrs-full-deprecated-concepts.json +0 -204
  687. arelle/plugin/validate/EFM/resources/invest-deprecated-concepts.json +0 -99
  688. arelle/plugin/validate/EFM/resources/ixbrl-transform-registries.json +0 -16
  689. arelle/plugin/validate/EFM/resources/naics-deprecated-concepts.json +0 -295
  690. arelle/plugin/validate/EFM/resources/oef-deprecated-concepts.json +0 -59
  691. arelle/plugin/validate/EFM/resources/other-standard-taxonomies.json +0 -12
  692. arelle/plugin/validate/EFM/resources/rr-deprecated-concepts.json +0 -14
  693. arelle/plugin/validate/EFM/resources/rxp-deprecated-concepts.json +0 -1
  694. arelle/plugin/validate/EFM/resources/shr-deprecated-concepts.json +0 -1
  695. arelle/plugin/validate/EFM/resources/sic-deprecated-concepts.json +0 -1
  696. arelle/plugin/validate/EFM/resources/signwarnings.json +0 -112
  697. arelle/plugin/validate/EFM/resources/srt-deprecated-concepts.json +0 -1
  698. arelle/plugin/validate/EFM/resources/stpr-deprecated-concepts.json +0 -1
  699. arelle/plugin/validate/EFM/resources/taxonomy-compatibility.json +0 -79
  700. arelle/plugin/validate/EFM/resources/us-gaap-deprecated-concepts.json +0 -2886
  701. arelle/plugin/validate/EFM/resources/us-gaap-rels-2020.json +0 -29068
  702. arelle/plugin/validate/EFM/resources/us-gaap-rels-2021.json +0 -29598
  703. arelle/plugin/validate/EFM/resources/us-gaap-rels-2022.json +0 -29141
  704. arelle/plugin/validate/EFM/resources/us-gaap-rels-2023.json +0 -29400
  705. arelle/plugin/validate/EFM/resources/vip-deprecated-concepts.json +0 -1
  706. arelle/plugin/validate/EFM/tools/CheckTxmyRefs.py +0 -180
  707. arelle/plugin/validate/EFM-htm/Const.py +0 -205
  708. arelle/plugin/validate/EFM-htm/__init__.py +0 -217
  709. arelle/plugin/validate/EFM-htm/config.xml +0 -17
  710. arelle/plugin/validate/EFM-htm/resources/efm-htm.dtd +0 -664
  711. arelle/plugin/validate/ESEF/ESEF_Current/Image.py +0 -199
  712. arelle/plugin/validate/ESEF_2022/__init__.py +0 -47
  713. arelle/plugin/validate/GFM/__init__.py +0 -59
  714. arelle/plugin/validate/GFM/config.xml +0 -82
  715. arelle/plugin/validate/SBRnl/CustomLoader.py +0 -19
  716. arelle/plugin/validate/SBRnl/DTS.py +0 -305
  717. arelle/plugin/validate/SBRnl/Dimensions.py +0 -357
  718. arelle/plugin/validate/SBRnl/Document.py +0 -799
  719. arelle/plugin/validate/SBRnl/Filing.py +0 -467
  720. arelle/plugin/validate/SBRnl/__init__.py +0 -75
  721. arelle/plugin/validate/SBRnl/config.xml +0 -26
  722. arelle/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  723. arelle/plugin/validate/USBestPractices.py +0 -570
  724. arelle/plugin/validate/USCorpAction.py +0 -557
  725. arelle/plugin/validate/USSecTagging.py +0 -337
  726. arelle/plugin/validate/XDC/__init__.py +0 -77
  727. arelle/plugin/validate/XDC/config.xml +0 -20
  728. arelle/plugin/validate/XFsyntax/__init__.py +0 -64
  729. arelle/plugin/validate/XFsyntax/xf.py +0 -2227
  730. arelle/plugin/validate/__init__.py +0 -20
  731. arelle/plugin/validate/calc2.py +0 -536
  732. arelle/plugin/validateSBRnl.py +0 -530
  733. arelle/scripts-macOS/startWebServer.command +0 -3
  734. arelle/scripts-unix/startWebServer.sh +0 -1
  735. arelle/scripts-windows/startWebServer.bat +0 -5
  736. arelle_release-2.17.1.dist-info/RECORD +0 -676
  737. tests/__init__.py +0 -0
  738. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.csproj +0 -30
  739. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs +0 -381
  740. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs +0 -1
  741. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest.sln +0 -31
  742. tests/integration_tests/ui_tests/resources/workiva.zip +0 -0
  743. tests/integration_tests/validation/README.md +0 -50
  744. tests/integration_tests/validation/conformance_suite_config.py +0 -59
  745. tests/integration_tests/validation/conformance_suite_configs.py +0 -63
  746. tests/integration_tests/validation/conformance_suite_configurations/efm_current.py +0 -261
  747. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2021.py +0 -85
  748. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2022.py +0 -90
  749. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2021.py +0 -15
  750. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2022.py +0 -15
  751. tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py +0 -13
  752. tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py +0 -13
  753. tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py +0 -13
  754. tests/integration_tests/validation/conformance_suite_configurations/xbrl_2_1.py +0 -34
  755. tests/integration_tests/validation/conformance_suite_configurations/xbrl_calculations_1_1.py +0 -40
  756. tests/integration_tests/validation/conformance_suite_configurations/xbrl_dimensions_1_0.py +0 -28
  757. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_1_0.py +0 -10
  758. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py +0 -10
  759. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py +0 -9
  760. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py +0 -9
  761. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +0 -14
  762. tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py +0 -22
  763. tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py +0 -11
  764. tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py +0 -19
  765. tests/integration_tests/validation/conformance_suite_configurations/xbrl_table_linkbase_1_0.py +0 -296
  766. tests/integration_tests/validation/conformance_suite_configurations/xbrl_taxonomy_packages_1_0.py +0 -13
  767. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_3.py +0 -13
  768. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_4.py +0 -13
  769. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_5.py +0 -13
  770. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_malformed_1_0.py +0 -31
  771. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_registry_1_0.py +0 -22
  772. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_structure_1_0.py +0 -18
  773. tests/integration_tests/validation/conftest.py +0 -24
  774. tests/integration_tests/validation/discover_tests.py +0 -22
  775. tests/integration_tests/validation/download_conformance_suites.py +0 -47
  776. tests/integration_tests/validation/run_conformance_suites.py +0 -175
  777. tests/integration_tests/validation/test_conformance_suites.py +0 -14
  778. tests/integration_tests/validation/validation_util.py +0 -271
  779. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl +0 -63
  780. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-testcase.xml +0 -22
  781. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-missing.xbrl +0 -53
  782. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-multiple.xbrl +0 -60
  783. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-testcase.xml +0 -33
  784. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-invalid.xbrl +0 -57
  785. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-testcase.xml +0 -22
  786. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-invalid.xbrl +0 -58
  787. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-testcase.xml +0 -22
  788. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-invalid.xbrl +0 -63
  789. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-testcase.xml +0 -22
  790. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-missing.xbrl +0 -61
  791. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-testcase.xml +0 -22
  792. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-invalid-date.xbrl +0 -89
  793. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-testcase.xml +0 -22
  794. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  795. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-testcase.xml +0 -22
  796. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  797. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-missing-lang.xbrl +0 -55
  798. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-testcase.xml +0 -33
  799. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-entrypoint.xsd +0 -6
  800. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  801. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-testcase.xml +0 -22
  802. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  803. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-testcase.xml +0 -22
  804. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  805. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-testcase.xml +0 -22
  806. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-file.xbrl +0 -2
  807. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-zip.zip +0 -0
  808. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-testcase.xml +0 -33
  809. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  810. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml +0 -22
  811. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  812. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml +0 -22
  813. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06-testcase.xml +0 -22
  814. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06.invalid.xbrl +0 -2
  815. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-file.xbrl +0 -8
  816. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-zip.zip +0 -0
  817. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-testcase.xml +0 -33
  818. tests/resources/conformance_suites/nl_nt16/index.xml +0 -20
  819. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-invalid-period.xbrl +0 -63
  820. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-testcase.xml +0 -22
  821. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-missing.xbrl +0 -53
  822. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-multiple.xbrl +0 -60
  823. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-testcase.xml +0 -33
  824. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-invalid.xbrl +0 -57
  825. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-testcase.xml +0 -22
  826. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-invalid.xbrl +0 -58
  827. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-testcase.xml +0 -22
  828. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-invalid.xbrl +0 -63
  829. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-testcase.xml +0 -22
  830. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-missing.xbrl +0 -61
  831. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-testcase.xml +0 -22
  832. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-invalid-date.xbrl +0 -89
  833. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-testcase.xml +0 -22
  834. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  835. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-testcase.xml +0 -22
  836. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  837. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-missing-lang.xbrl +0 -55
  838. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-testcase.xml +0 -33
  839. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-entrypoint.xsd +0 -6
  840. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  841. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-testcase.xml +0 -22
  842. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  843. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-testcase.xml +0 -22
  844. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  845. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-testcase.xml +0 -22
  846. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-file.xbrl +0 -2
  847. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-zip.zip +0 -0
  848. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-testcase.xml +0 -33
  849. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  850. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml +0 -22
  851. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  852. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcases.xml +0 -22
  853. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06-testcase.xml +0 -22
  854. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06.invalid.xbrl +0 -2
  855. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-file.xbrl +0 -8
  856. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-zip.zip +0 -0
  857. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-testcase.xml +0 -33
  858. tests/resources/conformance_suites/nl_nt17/index.xml +0 -20
  859. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  860. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml +0 -22
  861. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  862. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcases.xml +0 -22
  863. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06-testcase.xml +0 -22
  864. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06.invalid.xbrl +0 -2
  865. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-file.xbrl +0 -2
  866. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-zip.zip +0 -0
  867. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-testcase.xml +0 -33
  868. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-file.xbrl +0 -8
  869. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-zip.zip +0 -0
  870. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-testcase.xml +0 -33
  871. tests/resources/conformance_suites/nl_nt18/index.xml +0 -8
  872. tests/unit_tests/arelle/conftest.py +0 -16
  873. tests/unit_tests/arelle/formula/test_fact_aspects_cache.py +0 -170
  874. tests/unit_tests/arelle/plugin/test_loadfromoim.py +0 -40
  875. tests/unit_tests/arelle/plugin/test_plugin_imports.py +0 -27
  876. tests/unit_tests/arelle/test_betafeatures.py +0 -81
  877. tests/unit_tests/arelle/test_cntlr.py +0 -28
  878. tests/unit_tests/arelle/test_import.py +0 -40
  879. tests/unit_tests/arelle/test_locale.py +0 -73
  880. tests/unit_tests/arelle/test_modelmanager.py +0 -15
  881. tests/unit_tests/arelle/test_packagemanager.py +0 -65
  882. tests/unit_tests/arelle/test_pluginmanager.py +0 -176
  883. tests/unit_tests/arelle/test_qname.py +0 -140
  884. tests/unit_tests/arelle/test_runtimeoptions.py +0 -56
  885. tests/unit_tests/arelle/test_system_info.py +0 -26
  886. tests/unit_tests/arelle/test_updater.py +0 -507
  887. tests/unit_tests/arelle/test_urlutil.py +0 -49
  888. tests/unit_tests/arelle/test_version.py +0 -46
  889. tests/unit_tests/arelle/utils/validate/test_decorator.py +0 -59
  890. /arelle/{examples/plugin/validate/XYZ → plugin/validate/EDINET}/rules/__init__.py +0 -0
  891. /arelle/plugin/validate/{HMRC → UK}/consistencyChecksByName.json +0 -0
  892. /arelle/plugin/validate/{HMRC → UK}/hmrc-taxonomies.xml +0 -0
  893. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/entry_points.txt +0 -0
@@ -2,20 +2,24 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  '''
4
4
  import os
5
- from arelle import ViewFile
5
+ from datetime import timedelta
6
+ from collections import OrderedDict
7
+ from copy import deepcopy
6
8
  from lxml import etree
7
- from arelle.RenderingResolver import resolveAxesStructure, RENDER_UNITS_PER_CHAR
8
- from arelle.ViewFile import HTML, XML
9
- from arelle.ModelObject import ModelObject
10
- from arelle.ModelFormulaObject import Aspect, aspectModels, aspectRuleAspects, aspectModelAspect, aspectStr
11
- from arelle.formula.FormulaEvaluator import aspectMatches
12
- from arelle.FunctionXs import xsString
9
+ from arelle import ViewFile
10
+ from arelle.Aspect import Aspect, aspectModels, aspectRuleAspects, aspectModelAspect, aspectStr
13
11
  from arelle.ModelInstanceObject import ModelDimensionValue
12
+ from arelle.PrototypeInstanceObject import FactPrototype
13
+ from arelle.PythonUtil import OrderedSet
14
+ from arelle.ModelRenderingObject import (StrctMdlBreakdown, StrctMdlStructuralNode,
15
+ DefnMdlClosedDefinitionNode, DefnMdlRuleDefinitionNode, DefnMdlAspectNode,
16
+ OPEN_ASPECT_ENTRY_SURROGATE, ROLLUP_SPECIFIES_MEMBER, ROLLUP_FOR_DIMENSION_RELATIONSHIP_NODE,
17
+ aspectStrctNodes)
18
+ from arelle.rendering.RenderingLayout import layoutTable
19
+ from arelle.rendering.RenderingResolution import RENDER_UNITS_PER_CHAR
14
20
  from arelle.ModelValue import QName
15
21
  from arelle.ModelXbrl import DEFAULT
16
- from arelle.ModelRenderingObject import (ModelClosedDefinitionNode, ModelEuAxisCoord, ModelFilterDefinitionNode,
17
- OPEN_ASPECT_ENTRY_SURROGATE)
18
- from arelle.PrototypeInstanceObject import FactPrototype
22
+ from arelle.ViewFile import HTML, XML
19
23
  # change tableModel for namespace needed for consistency suite
20
24
  '''
21
25
  from arelle.XbrlConst import (tableModelMMDD as tableModelNamespace,
@@ -28,34 +32,41 @@ from collections import defaultdict
28
32
  emptySet = set()
29
33
  emptyList = []
30
34
 
31
- def viewRenderedGrid(modelXbrl, outfile, lang=None, viewTblELR=None, sourceView=None, diffToFile=False, cssExtras=""):
32
- modelXbrl.modelManager.showStatus(_("saving rendering"))
35
+ headerOmittedRollupAspects = {
36
+ Aspect.CONCEPT,
37
+ Aspect.COMPLETE_SEGMENT, Aspect.COMPLETE_SCENARIO, Aspect.NON_XDT_SEGMENT, Aspect.NON_XDT_SCENARIO,
38
+ Aspect.VALUE, Aspect.SCHEME,
39
+ Aspect.PERIOD_TYPE, Aspect.START, Aspect.END, Aspect.INSTANT,
40
+ Aspect.UNIT_MEASURES, Aspect.MULTIPLY_BY, Aspect.DIVIDE_BY}
41
+
42
+
43
+ def viewRenderedGrid(modelXbrl, outfile, lang=None, viewTblELR=None, sourceView=None, diffToFile=False, cssExtras="", table=None):
44
+ modelXbrl.modelManager.showStatus(_("saving rendered tagle"))
33
45
  view = ViewRenderedGrid(modelXbrl, outfile, lang, cssExtras)
34
46
 
35
47
  if sourceView is not None:
36
- viewTblELR = sourceView.tblELR
37
- view.ignoreDimValidity.set(sourceView.ignoreDimValidity.get())
38
- view.xAxisChildrenFirst.set(sourceView.xAxisChildrenFirst.get())
39
- view.yAxisChildrenFirst.set(sourceView.yAxisChildrenFirst.get())
40
- view.view(viewTblELR)
41
- if diffToFile and outfile:
42
- from arelle.ValidateInfoset import validateRenderingInfoset
43
- validateRenderingInfoset(modelXbrl, outfile, view.xmlDoc)
44
- view.close(noWrite=True)
48
+ if sourceView.lytMdlTblMdl:
49
+ lytMdlTblMdl = sourceView.lytMdlTblMdl
50
+ else:
51
+ lytMdlTblMdl = layoutTable(sourceView)
45
52
  else:
46
- view.close()
47
- modelXbrl.modelManager.showStatus(_("rendering saved to {0}").format(outfile), clearAfter=5000)
53
+ layoutTable(view, table)
54
+ lytMdlTblMdl = view.lytMdlTblMdl
55
+ if view.tblElt is not None: # may be None if there is no table
56
+ view.view(lytMdlTblMdl)
57
+ view.close()
58
+ modelXbrl.modelManager.showStatus(_("rendered table saved to {0}").format(outfile), clearAfter=5000)
48
59
 
49
60
  class ViewRenderedGrid(ViewFile.View):
50
61
  def __init__(self, modelXbrl, outfile, lang, cssExtras):
51
62
  # find table model namespace based on table namespace
52
63
  self.tableModelNamespace = XbrlConst.tableModel
53
64
  for xsdNs in modelXbrl.namespaceDocs.keys():
54
- if xsdNs in (XbrlConst.tableMMDD, XbrlConst.table, XbrlConst.table201305, XbrlConst.table201301, XbrlConst.table2011):
65
+ if xsdNs in (XbrlConst.tableMMDD, XbrlConst.table):
55
66
  self.tableModelNamespace = xsdNs + "/model"
56
67
  break
57
68
  super(ViewRenderedGrid, self).__init__(modelXbrl, outfile,
58
- 'tableModel xmlns="{0}"'.format(self.tableModelNamespace),
69
+ 'tableModel',
59
70
  lang,
60
71
  style="rendering",
61
72
  cssExtras=cssExtras)
@@ -68,737 +79,137 @@ class ViewRenderedGrid(ViewFile.View):
68
79
  return self.value
69
80
  # context menu boolean vars (non-tkinter boolean
70
81
  self.ignoreDimValidity = nonTkBooleanVar(value=True)
71
- self.xAxisChildrenFirst = nonTkBooleanVar(value=True)
72
- self.yAxisChildrenFirst = nonTkBooleanVar(value=False)
73
-
74
-
75
- def tableModelQName(self, localName):
76
- return '{' + self.tableModelNamespace + '}' + localName
77
-
82
+ self.openBreakdownLines = 0 # layout model conformance suite requires no open entry lines
78
83
  def viewReloadDueToMenuAction(self, *args):
79
84
  self.view()
80
85
 
81
- def view(self, viewTblELR=None):
82
- if viewTblELR is not None:
83
- tblELRs = (viewTblELR,)
84
- else:
85
- tblELRs = self.modelXbrl.relationshipSet("Table-rendering").linkRoleUris
86
-
87
- if self.type == XML:
88
- self.tblElt.append(etree.Comment("Entry point file: {0}".format(self.modelXbrl.modelDocument.basename)))
89
-
90
- for tblELR in tblELRs:
91
- self.zOrdinateChoices = {}
92
-
93
-
94
- for discriminator in range(1, 65535):
95
- # each table z production
96
- tblAxisRelSet, xTopStructuralNode, yTopStructuralNode, zTopStructuralNode = resolveAxesStructure(self, tblELR)
97
- self.hasTableFilters = bool(self.modelTable.filterRelationships)
98
-
99
- self.zStrNodesWithChoices = []
100
- if tblAxisRelSet and self.tblElt is not None:
101
- tableLabel = (self.modelTable.genLabel(lang=self.lang, strip=True) or # use table label, if any
102
- self.roledefinition)
103
- if self.type == HTML: # table on each Z
104
- # each Z is a separate table in the outer table
105
- zTableRow = etree.SubElement(self.tblElt, "{http://www.w3.org/1999/xhtml}tr")
106
- zRowCell = etree.SubElement(zTableRow, "{http://www.w3.org/1999/xhtml}td")
107
- zCellTable = etree.SubElement(zRowCell, "{http://www.w3.org/1999/xhtml}table",
108
- attrib={"border":"1", "cellspacing":"0", "cellpadding":"4", "style":"font-size:8pt;"})
109
- self.rowElts = [etree.SubElement(zCellTable, "{http://www.w3.org/1999/xhtml}tr")
110
- for r in range(self.dataFirstRow + self.dataRows - 1)]
111
- etree.SubElement(self.rowElts[0], "{http://www.w3.org/1999/xhtml}th",
112
- attrib={"class":"tableHdr",
113
- "style":"max-width:100em;",
114
- "colspan": str(self.dataFirstCol - 1),
115
- "rowspan": str(self.dataFirstRow - 1)}
116
- ).text = tableLabel
117
- elif self.type == XML:
118
- self.structuralNodeModelElements = []
119
- if discriminator == 1:
120
- # headers structure only build once for table
121
- tableSetElt = etree.SubElement(self.tblElt, self.tableModelQName("tableSet"))
122
- tableSetElt.append(etree.Comment("TableSet linkbase file: {0}, line {1}".format(self.modelTable.modelDocument.basename, self.modelTable.sourceline)))
123
- tableSetElt.append(etree.Comment("TableSet namespace: {0}".format(self.modelTable.namespaceURI)))
124
- tableSetElt.append(etree.Comment("TableSet linkrole: {0}".format(tblELR)))
125
- etree.SubElement(tableSetElt, self.tableModelQName("label")
126
- ).text = tableLabel
127
- zAspectStructuralNodes = defaultdict(set)
128
-
129
- tableElt = etree.SubElement(tableSetElt, self.tableModelQName("table"))
130
- self.groupElts = {}
131
- self.headerElts = {}
132
- self.headerCells = defaultdict(list) # order #: (breakdownNode, xml element)
133
- for axis in ("z", "y", "x"):
134
- breakdownNodes = self.breakdownNodes.get(axis)
135
- if breakdownNodes:
136
- hdrsElt = etree.SubElement(tableElt, self.tableModelQName("headers"),
137
- attrib={"axis": axis})
138
- for brkdownNode in self.breakdownNodes.get(axis):
139
- groupElt = etree.SubElement(hdrsElt, self.tableModelQName("group"))
140
- groupElt.append(etree.Comment("Breakdown node file: {0}, line {1}".format(brkdownNode.modelDocument.basename, brkdownNode.sourceline)))
141
- label = brkdownNode.genLabel(lang=self.lang, strip=True)
142
- if label:
143
- etree.SubElement(groupElt, self.tableModelQName("label")).text=label
144
- self.groupElts[brkdownNode] = groupElt
145
- # HF TODO omit header if zero cardinality on breakdown
146
- self.headerElts[brkdownNode] = etree.SubElement(groupElt, self.tableModelQName("header"))
147
- else:
148
- tableElt.append(etree.Comment("No breakdown group for \"{0}\" axis".format(axis)))
149
- self.zAxis(1, zTopStructuralNode, zAspectStructuralNodes, True)
150
- self.cellsParentElt = tableElt
151
- self.cellsParentElt = etree.SubElement(self.cellsParentElt, self.tableModelQName("cells"),
152
- attrib={"axis": "z"})
153
- self.cellsParentElt = etree.SubElement(self.cellsParentElt, self.tableModelQName("cells"),
154
- attrib={"axis": "y"})
155
- ''' move into body cells, for entry row-by-row
156
- self.cellsParentElt = etree.SubElement(self.cellsParentElt, self.tableModelQName("cells"),
157
- attrib={"axis": "x"})
158
- '''
159
- # rows/cols only on firstTime for infoset XML, but on each time for xhtml
160
- zAspectStructuralNodes = defaultdict(set)
161
- self.zAxis(1, zTopStructuralNode, zAspectStructuralNodes, False)
162
- xStructuralNodes = []
163
- if self.type == HTML or (xTopStructuralNode and xTopStructuralNode.childStructuralNodes):
164
- self.xAxis(self.dataFirstCol, self.colHdrTopRow, self.colHdrTopRow + self.colHdrRows - 1,
165
- xTopStructuralNode, xStructuralNodes, self.xAxisChildrenFirst.get(), True, True)
166
- if self.type == HTML: # table/tr goes by row
167
- self.yAxisByRow(1, self.dataFirstRow,
168
- yTopStructuralNode, self.yAxisChildrenFirst.get(), True, True)
169
- elif self.type == XML: # infoset goes by col of row header
170
- if yTopStructuralNode and yTopStructuralNode.childStructuralNodes: # no row header element if no rows
171
- self.yAxisByCol(1, self.dataFirstRow,
172
- yTopStructuralNode, self.yAxisChildrenFirst.get(), True, True)
173
- # add header cells to header elements
174
- for position, breakdownCellElts in sorted(self.headerCells.items()):
175
- for breakdownNode, headerCell in breakdownCellElts:
176
- self.headerElts[breakdownNode].append(headerCell)
177
- for structuralNode,modelElt in self.structuralNodeModelElements: # must do after elements are all arragned
178
- modelElt.addprevious(etree.Comment("{0}: label {1}, file {2}, line {3}"
179
- .format(structuralNode.definitionNode.localName,
180
- structuralNode.definitionNode.xlinkLabel,
181
- structuralNode.definitionNode.modelDocument.basename,
182
- structuralNode.definitionNode.sourceline)))
183
- if structuralNode.definitionNode.get('value'):
184
- modelElt.addprevious(etree.Comment(" @value {0}".format(structuralNode.definitionNode.get('value'))))
185
- for aspect in sorted(structuralNode.aspectsCovered(), key=lambda a: aspectStr(a)):
186
- if structuralNode.hasAspect(aspect) and aspect not in (Aspect.DIMENSIONS, Aspect.OMIT_DIMENSIONS):
187
- aspectValue = structuralNode.aspectValue(aspect)
188
- if aspectValue is None: aspectValue = "(bound dynamically)"
189
- modelElt.addprevious(etree.Comment(" aspect {0}: {1}".format(aspectStr(aspect), xsString(None,None,aspectValue))))
190
- for varName, varValue in structuralNode.variables.items():
191
- modelElt.addprevious(etree.Comment(" variable ${0}: {1}".format(varName, varValue)))
192
- for headerElt in self.headerElts.values(): # remove empty header elements
193
- if not any(e is not None for e in headerElt.iterchildren()):
194
- if headerElt.getparent() is not None:
195
- headerElt.getparent().remove(headerElt)
196
- self.bodyCells(self.dataFirstRow, yTopStructuralNode, xStructuralNodes, zAspectStructuralNodes, self.yAxisChildrenFirst.get())
197
- # find next choice structural node
198
- moreDiscriminators = False
199
- for zStrNodeWithChoices in self.zStrNodesWithChoices:
200
- currentIndex = zStrNodeWithChoices.choiceNodeIndex + 1
201
- if currentIndex < len(zStrNodeWithChoices.choiceStructuralNodes):
202
- zStrNodeWithChoices.choiceNodeIndex = currentIndex
203
- self.zOrdinateChoices[zStrNodeWithChoices.definitionNode] = currentIndex
204
- moreDiscriminators = True
205
- break
206
- else:
207
- zStrNodeWithChoices.choiceNodeIndex = 0
208
- self.zOrdinateChoices[zStrNodeWithChoices.definitionNode] = 0
209
- # continue incrementing next outermore z choices index
210
- if not moreDiscriminators:
211
- break
212
-
213
-
214
- def zAxis(self, row, zStructuralNode, zAspectStructuralNodes, discriminatorsTable):
215
- if zStructuralNode is not None:
216
- label = zStructuralNode.header(lang=self.lang)
217
- choiceLabel = None
218
- effectiveStructuralNode = zStructuralNode
219
- if zStructuralNode.choiceStructuralNodes: # same as combo box selection in GUI mode
220
- if not discriminatorsTable:
221
- self.zStrNodesWithChoices.insert(0, zStructuralNode) # iteration from last is first
222
- try:
223
- effectiveStructuralNode = zStructuralNode.choiceStructuralNodes[zStructuralNode.choiceNodeIndex]
224
- choiceLabel = effectiveStructuralNode.header(lang=self.lang)
225
- if not label and choiceLabel:
226
- label = choiceLabel # no header for choice
227
- choiceLabel = None
228
- except KeyError:
229
- pass
230
- if choiceLabel:
231
- if self.dataCols > 3:
232
- zLabelSpan = 2
233
- else:
234
- zLabelSpan = 1
235
- zChoiceLabelSpan = self.dataCols - zLabelSpan
236
- else:
237
- zLabelSpan = self.dataCols
238
- if self.type == HTML:
239
- etree.SubElement(self.rowElts[row-1], "{http://www.w3.org/1999/xhtml}th",
240
- attrib={"class":"zAxisHdr",
241
- "style":"max-width:200pt;text-align:left;border-bottom:.5pt solid windowtext",
242
- "colspan": str(zLabelSpan)} # "2"}
243
- ).text = label
244
- if choiceLabel:
245
- etree.SubElement(self.rowElts[row-1], "{http://www.w3.org/1999/xhtml}th",
246
- attrib={"class":"zAxisHdr",
247
- "style":"max-width:200pt;text-align:left;border-bottom:.5pt solid windowtext",
248
- "colspan": str(zChoiceLabelSpan)} # "2"}
249
- ).text = choiceLabel
250
- elif self.type == XML:
251
- # headers element built for first pass on z axis
252
- if discriminatorsTable:
253
- brkdownNode = zStructuralNode.breakdownNode
254
- if zStructuralNode.choiceStructuralNodes: # same as combo box selection in GUI mode
255
- # hdrElt.set("label", label)
256
- if discriminatorsTable:
257
- def zSpan(zNode, startNode=False):
258
- if startNode:
259
- thisSpan = 0
260
- elif zStructuralNode.choiceStructuralNodes:
261
- thisSpan = len(zStructuralNode.choiceStructuralNodes)
262
- else:
263
- thisSpan = 1
264
- return sum(zSpan(z) for z in zNode.childStructuralNodes) + thisSpan
265
- span = zSpan(zStructuralNode, True)
266
- for i, choiceStructuralNode in enumerate(zStructuralNode.choiceStructuralNodes):
267
- choiceLabel = choiceStructuralNode.header(lang=self.lang)
268
- cellElt = etree.Element(self.tableModelQName("cell"),
269
- attrib={"span": str(span)} if span > 1 else None)
270
- self.headerCells[i].append((brkdownNode, cellElt))
271
- # self.structuralNodeModelElements.append((zStructuralNode, cellElt))
272
- elt = etree.SubElement(cellElt, self.tableModelQName("label"))
273
- if choiceLabel:
274
- elt.text = choiceLabel
275
- #else: # choiceLabel from above
276
- # etree.SubElement(hdrElt, self.tableModelQName("label")
277
- # ).text = choiceLabel
278
- else: # no combo choices, single label
279
- cellElt = etree.Element(self.tableModelQName("cell"))
280
- self.headerCells[0].append((brkdownNode, cellElt))
281
- # self.structuralNodeModelElements.append((zStructuralNode, cellElt))
282
- elt = etree.SubElement(cellElt, self.tableModelQName("label"))
283
- if label:
284
- elt.text = label
285
-
286
- for aspect in aspectModels[self.aspectModel]:
287
- if effectiveStructuralNode.hasAspect(aspect, inherit=True): #implies inheriting from other z axes
288
- if aspect == Aspect.DIMENSIONS:
289
- for dim in (effectiveStructuralNode.aspectValue(Aspect.DIMENSIONS, inherit=True) or emptyList):
290
- zAspectStructuralNodes[dim].add(effectiveStructuralNode)
291
- else:
292
- zAspectStructuralNodes[aspect].add(effectiveStructuralNode)
293
- for zStructuralNode in zStructuralNode.childStructuralNodes:
294
- self.zAxis(row + 1, zStructuralNode, zAspectStructuralNodes, discriminatorsTable)
295
-
296
- def xAxis(self, leftCol, topRow, rowBelow, xParentStructuralNode, xStructuralNodes, childrenFirst, renderNow, atTop):
297
- if xParentStructuralNode is not None:
298
- parentRow = rowBelow
299
- noDescendants = True
300
- rightCol = leftCol
301
- widthToSpanParent = 0
302
- sideBorder = not xStructuralNodes
303
- for xStructuralNode in xParentStructuralNode.childStructuralNodes:
304
- noDescendants = False
305
- rightCol, row, width, leafNode = self.xAxis(leftCol, topRow + 1, rowBelow, xStructuralNode, xStructuralNodes, # nested items before totals
306
- childrenFirst, childrenFirst, False)
307
- if row - 1 < parentRow:
308
- parentRow = row - 1
309
- #if not leafNode:
310
- # rightCol -= 1
311
- nonAbstract = not xStructuralNode.isAbstract
312
- if nonAbstract:
313
- width += 100 # width for this label
314
- widthToSpanParent += width
315
- if childrenFirst:
316
- thisCol = rightCol
86
+ def view(self, lytMdlTblMdl):
87
+
88
+ for lytMdlTableSet in lytMdlTblMdl.lytMdlTableSets:
89
+ self.tblElt.append(etree.Comment(f"TableSet linkbase file: {lytMdlTableSet.srcFile}, line {lytMdlTableSet.srcLine}"))
90
+ self.tblElt.append(etree.Comment(f"TableSet linkrole: {lytMdlTableSet.srcLinkrole}"))
91
+ tblSetHdr = etree.SubElement(self.tblElt, "{http://www.w3.org/1999/xhtml}tr")
92
+ etree.SubElement(tblSetHdr, "{http://www.w3.org/1999/xhtml}td").text = lytMdlTableSet.label
93
+ for lytMdlTable in lytMdlTableSet.lytMdlTables:
94
+ if lytMdlTable.strctMdlTable.tblParamValues:
95
+ # show any parameters
96
+ pTableRow = etree.SubElement(self.tblElt, "{http://www.w3.org/1999/xhtml}tr")
97
+ pRowCell = etree.SubElement(pTableRow, "{http://www.w3.org/1999/xhtml}td")
98
+ paramTable = etree.SubElement(pRowCell, "{http://www.w3.org/1999/xhtml}table",
99
+ attrib={"border":"1", "cellspacing":"0", "cellpadding":"4", "style":"font-size:8pt;"})
100
+ pHdrRow = etree.SubElement(paramTable, "{http://www.w3.org/1999/xhtml}tr")
101
+ etree.SubElement(pHdrRow, "{http://www.w3.org/1999/xhtml}th").text = "parameter"
102
+ etree.SubElement(pHdrRow, "{http://www.w3.org/1999/xhtml}th").text = "value"
103
+ for name, value in lytMdlTable.strctMdlTable.tblParamValues.items():
104
+ pTableRow = etree.SubElement(paramTable, "{http://www.w3.org/1999/xhtml}tr")
105
+ etree.SubElement(pTableRow, "{http://www.w3.org/1999/xhtml}td").text = str(name)
106
+ etree.SubElement(pTableRow, "{http://www.w3.org/1999/xhtml}td").text = str(value)
107
+ # each Z is a separate table in the outer table
108
+ lytMdlZHdrs = lytMdlTable.lytMdlAxisHeaders("z")
109
+ if lytMdlZHdrs is not None:
110
+ lytMdlZHdrGroups = lytMdlZHdrs.lytMdlGroups
111
+ numZtbls = lytMdlTable.numBodyCells("z") or 1 # must have at least 1 z entry
112
+ zHdrElts = [[] for i in range(numZtbls)]
113
+ for lytMdlZGrp in lytMdlZHdrs.lytMdlGroups:
114
+ for lytMdlZHdr in lytMdlZGrp.lytMdlHeaders:
115
+ zRow = 0
116
+ if all(lytMdlCell.isOpenAspectEntrySurrogate for lytMdlCell in lytMdlZHdr.lytMdlCells):
117
+ continue # skip header with only open aspect entry surrogate
118
+ for lytMdlZCell in lytMdlZHdr.lytMdlCells:
119
+ for iSpan in range(lytMdlZCell.span):
120
+ zHdrElts[zRow].append([lbl[0] for lbl in lytMdlZCell.labels])
121
+ zRow += 1
317
122
  else:
318
- thisCol = leftCol
319
- #print ( "thisCol {0} leftCol {1} rightCol {2} topRow{3} renderNow {4} label {5}".format(thisCol, leftCol, rightCol, topRow, renderNow, label))
320
- if renderNow:
321
- label = xStructuralNode.header(lang=self.lang,
322
- returnGenLabel=isinstance(xStructuralNode.definitionNode, (ModelClosedDefinitionNode, ModelEuAxisCoord)))
323
- columnspan = rightCol - leftCol
324
- if columnspan > 0 and nonAbstract: columnspan += 1
325
- elt = None
326
- if self.type == HTML:
327
- if rightCol == self.dataFirstCol + self.dataCols - 1:
328
- edgeBorder = "border-right:.5pt solid windowtext;"
329
- else:
330
- edgeBorder = ""
331
- attrib = {"class":"xAxisHdr",
332
- "style":"text-align:center;max-width:{0}pt;{1}".format(width,edgeBorder)}
333
- if columnspan > 1:
334
- attrib["colspan"] = str(columnspan)
335
- if leafNode and row > topRow:
336
- rowspan = row - topRow + 1
337
- if rowspan > 1:
338
- attrib["rowspan"] = str(rowspan)
339
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
340
- attrib=attrib)
341
- self.rowElts[topRow-1].insert(leftCol,elt)
342
- elif (self.type == XML and # is leaf or no sub-breakdown cardinality
343
- # TBD: determine why following clause is needed
344
- (True or xStructuralNode.childStructuralNodes is None or columnspan > 0)): # ignore no-breakdown situation
345
- brkdownNode = xStructuralNode.breakdownNode
346
- cellElt = etree.Element(self.tableModelQName("cell"),
347
- attrib={"span": str(columnspan)} if columnspan > 1 else None)
348
- self.headerCells[thisCol].append((brkdownNode, cellElt))
349
- # self.structuralNodeModelElements.append((xStructuralNode, cellElt))
350
- elt = etree.SubElement(cellElt, self.tableModelQName("label"))
351
- if nonAbstract or (leafNode and row > topRow):
352
- for rollUpCol in range(topRow - self.colHdrTopRow + 1, self.colHdrRows - 1):
353
- rollUpElt = etree.Element(self.tableModelQName("cell"),
354
- attrib={"rollup":"true"})
355
- self.headerCells[thisCol].append((brkdownNode, cellElt))
356
- for i, role in enumerate(self.colHdrNonStdRoles):
357
- roleLabel = xStructuralNode.header(role=role, lang=self.lang, recurseParent=False) # infoset does not move parent label to decscndant
358
- if roleLabel is not None:
359
- cellElt.append(etree.Comment("Label role: {0}, lang {1}"
360
- .format(os.path.basename(role), self.lang)))
361
- labelElt = etree.SubElement(cellElt, self.tableModelQName("label"),
362
- #attrib={"role": role,
363
- # "lang": self.lang}
364
- )
365
- labelElt.text = roleLabel
366
-
367
- for aspect in sorted(xStructuralNode.aspectsCovered(), key=lambda a: aspectStr(a)):
368
- if xStructuralNode.hasAspect(aspect) and aspect not in (Aspect.DIMENSIONS, Aspect.OMIT_DIMENSIONS):
369
- aspectValue = xStructuralNode.aspectValue(aspect)
370
- if aspectValue is None: aspectValue = "(bound dynamically)"
371
- if isinstance(aspectValue, ModelObject): # typed dimension value
372
- aspectValue = innerTextList(aspectValue)
373
- if isinstance(aspectValue, QName) and aspectValue.prefix is None: # may be dynamic
374
- try:
375
- aspectValue = self.modelXbrl.qnameConcepts[aspectValue].qname # usually has a prefix
376
- except KeyError:
377
- pass
378
- aspElt = etree.SubElement(cellElt, self.tableModelQName("constraint"))
379
- etree.SubElement(aspElt, self.tableModelQName("aspect")
380
- ).text = aspectStr(aspect)
381
- etree.SubElement(aspElt, self.tableModelQName("value")
382
- ).text = xsString(None,None,addQnameValue(self.xmlDoc, aspectValue))
383
- if elt is not None:
384
- elt.text = label if bool(label) and label != OPEN_ASPECT_ENTRY_SURROGATE else "\u00A0" #produces &nbsp;
385
- if nonAbstract:
386
- if columnspan > 1 and rowBelow > topRow: # add spanned left leg portion one row down
387
- if self.type == HTML:
388
- attrib= {"class":"xAxisSpanLeg",
389
- "rowspan": str(rowBelow - row)}
390
- if edgeBorder:
391
- attrib["style"] = edgeBorder
392
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
393
- attrib=attrib)
394
- elt.text = "\u00A0"
395
- if childrenFirst:
396
- self.rowElts[topRow].append(elt)
397
- else:
398
- self.rowElts[topRow].insert(leftCol,elt)
399
- if self.type == HTML:
400
- for i, role in enumerate(self.colHdrNonStdRoles):
401
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
402
- attrib={"class":"xAxisHdr",
403
- "style":"text-align:center;max-width:100pt;{0}".format(edgeBorder)})
404
- self.rowElts[self.dataFirstRow - 1 - len(self.colHdrNonStdRoles) + i].insert(thisCol,elt)
405
- elt.text = xStructuralNode.header(role=role, lang=self.lang) or "\u00A0"
406
- '''
407
- if self.colHdrDocRow:
408
- doc = xStructuralNode.header(role="http://www.xbrl.org/2008/role/documentation", lang=self.lang)
409
- if self.type == HTML:
410
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
411
- attrib={"class":"xAxisHdr",
412
- "style":"text-align:center;max-width:100pt;{0}".format(edgeBorder)})
413
- self.rowElts[self.dataFirstRow - 2 - self.rowHdrCodeCol].insert(thisCol,elt)
414
- elif self.type == XML:
415
- elt = etree.Element(self.tableModelQName("label"))
416
- self.colHdrElts[self.colHdrRows - 1].insert(thisCol,elt)
417
- elt.text = doc or "\u00A0"
418
- if self.colHdrCodeRow:
419
- code = xStructuralNode.header(role="http://www.eurofiling.info/role/2010/coordinate-code")
420
- if self.type == HTML:
421
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
422
- attrib={"class":"xAxisHdr",
423
- "style":"text-align:center;max-width:100pt;{0}".format(edgeBorder)})
424
- self.rowElts[self.dataFirstRow - 2].insert(thisCol,elt)
425
- elif self.type == XML:
426
- elt = etree.Element(self.tableModelQName("label"))
427
- self.colHdrElts[self.colHdrRows - 1 + self.colHdrDocRow].insert(thisCol,elt)
428
- elt.text = code or "\u00A0"
429
- '''
430
- xStructuralNodes.append(xStructuralNode)
431
- if nonAbstract:
432
- rightCol += 1
433
- if renderNow and not childrenFirst:
434
- self.xAxis(leftCol + (1 if nonAbstract else 0), topRow + 1, rowBelow, xStructuralNode, xStructuralNodes, childrenFirst, True, False) # render on this pass
435
- leftCol = rightCol
436
- return (rightCol, parentRow, widthToSpanParent, noDescendants)
437
-
438
- def yAxisByRow(self, leftCol, row, yParentStructuralNode, childrenFirst, renderNow, atLeft):
439
- if yParentStructuralNode is not None:
440
- nestedBottomRow = row
441
- for yStructuralNode in yParentStructuralNode.childStructuralNodes:
442
- nestRow, nextRow = self.yAxisByRow(leftCol + 1, row, yStructuralNode, # nested items before totals
443
- childrenFirst, childrenFirst, False)
444
- isAbstract = (yStructuralNode.isAbstract or
445
- (yStructuralNode.childStructuralNodes and
446
- not isinstance(yStructuralNode.definitionNode, (ModelClosedDefinitionNode, ModelEuAxisCoord))))
447
- isNonAbstract = not isAbstract
448
- isLabeled = yStructuralNode.isLabeled
449
- topRow = row
450
- #print ( "row {0} topRow {1} nxtRow {2} col {3} renderNow {4} label {5}".format(row, topRow, nextRow, leftCol, renderNow, label))
451
- if renderNow and isLabeled:
452
- label = yStructuralNode.header(lang=self.lang,
453
- returnGenLabel=isinstance(yStructuralNode.definitionNode, ModelClosedDefinitionNode),
454
- recurseParent=not isinstance(yStructuralNode.definitionNode, ModelFilterDefinitionNode))
455
- columnspan = self.rowHdrCols - leftCol + 1 if isNonAbstract or nextRow == row else 1
456
- if childrenFirst and isNonAbstract and nextRow > row:
457
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
458
- attrib={"class":"yAxisSpanArm",
459
- "style":"text-align:center;min-width:2em;",
460
- "rowspan": str(nextRow - topRow)}
461
- )
462
- insertPosition = self.rowElts[nextRow-1].__len__()
463
- self.rowElts[row - 1].insert(insertPosition, elt)
464
- elt.text = "\u00A0"
465
- hdrRow = nextRow # put nested stuff on bottom row
466
- row = nextRow # nested header still goes on this row
467
- else:
468
- hdrRow = row
469
- # provide top or bottom borders
470
- edgeBorder = ""
471
-
472
- if childrenFirst:
473
- if hdrRow == self.dataFirstRow:
474
- edgeBorder = "border-top:.5pt solid windowtext;"
475
- else:
476
- if hdrRow == len(self.rowElts):
477
- edgeBorder = "border-bottom:.5pt solid windowtext;"
478
- depth = yStructuralNode.depth
479
- attrib = {"style":"text-align:{0};max-width:{1}em;{2}".format(
480
- self.langAlign if isNonAbstract or nestRow == hdrRow else "center",
481
- # this is a wrap length max width in characters
482
- self.rowHdrColWidth[depth] if isAbstract else
483
- self.rowHdrWrapLength - sum(self.rowHdrColWidth[0:depth]),
484
- edgeBorder),
485
- "colspan": str(columnspan)}
486
- if label == OPEN_ASPECT_ENTRY_SURROGATE: # entry of dimension
487
- attrib["style"] += ";background:#fff" # override for white background
488
- if isAbstract:
489
- attrib["rowspan"] = str(nestRow - hdrRow)
490
- attrib["class"] = "yAxisHdrAbstractChildrenFirst" if childrenFirst else "yAxisHdrAbstract"
491
- elif nestRow > hdrRow:
492
- attrib["class"] = "yAxisHdrWithLeg"
493
- elif childrenFirst:
494
- attrib["class"] = "yAxisHdrWithChildrenFirst"
495
- else:
496
- attrib["class"] = "yAxisHdr"
497
- elt = etree.Element("{http://www.w3.org/1999/xhtml}th",
498
- attrib=attrib
499
- )
500
- elt.text = label if bool(label) and label != OPEN_ASPECT_ENTRY_SURROGATE else "\u00A0"
501
- if isNonAbstract:
502
- self.rowElts[hdrRow-1].append(elt)
503
- if not childrenFirst and nestRow > hdrRow: # add spanned left leg portion one row down
504
- etree.SubElement(self.rowElts[hdrRow],
505
- "{http://www.w3.org/1999/xhtml}th",
506
- attrib={"class":"yAxisSpanLeg",
507
- "style":"text-align:center;max-width:{0}pt;{1}".format(RENDER_UNITS_PER_CHAR, edgeBorder),
508
- "rowspan": str(nestRow - hdrRow)}
509
- ).text = "\u00A0"
510
- hdrClass = "yAxisHdr" if not childrenFirst else "yAxisHdrWithChildrenFirst"
511
- for i, role in enumerate(self.rowHdrNonStdRoles):
512
- hdr = yStructuralNode.header(role=role, lang=self.lang)
513
- etree.SubElement(self.rowElts[hdrRow - 1],
514
- "{http://www.w3.org/1999/xhtml}th",
515
- attrib={"class":hdrClass,
516
- "style":"text-align:left;max-width:100pt;{0}".format(edgeBorder)}
517
- ).text = hdr or "\u00A0"
518
- '''
519
- if self.rowHdrDocCol:
520
- docCol = self.dataFirstCol - 1 - self.rowHdrCodeCol
521
- doc = yStructuralNode.header(role="http://www.xbrl.org/2008/role/documentation")
522
- etree.SubElement(self.rowElts[hdrRow - 1],
523
- "{http://www.w3.org/1999/xhtml}th",
524
- attrib={"class":hdrClass,
525
- "style":"text-align:left;max-width:100pt;{0}".format(edgeBorder)}
526
- ).text = doc or "\u00A0"
527
- if self.rowHdrCodeCol:
528
- codeCol = self.dataFirstCol - 1
529
- code = yStructuralNode.header(role="http://www.eurofiling.info/role/2010/coordinate-code")
530
- etree.SubElement(self.rowElts[hdrRow - 1],
531
- "{http://www.w3.org/1999/xhtml}th",
532
- attrib={"class":hdrClass,
533
- "style":"text-align:center;max-width:40pt;{0}".format(edgeBorder)}
534
- ).text = code or "\u00A0"
535
- # gridBorder(self.gridRowHdr, leftCol, self.dataFirstRow - 1, BOTTOMBORDER)
536
- '''
537
- elif nestRow > hdrRow:
538
- self.rowElts[hdrRow-1].insert(leftCol - 1, elt)
539
- if isNonAbstract:
540
- row += 1
541
- elif childrenFirst:
542
- row = nextRow
543
- if nestRow > nestedBottomRow:
544
- nestedBottomRow = nestRow + (isNonAbstract and not childrenFirst)
545
- if row > nestedBottomRow:
546
- nestedBottomRow = row
547
- #if renderNow and not childrenFirst:
548
- # dummy, row = self.yAxis(leftCol + 1, row, yAxisHdrObj, childrenFirst, True, False) # render on this pass
549
- if not childrenFirst:
550
- dummy, row = self.yAxisByRow(leftCol + 1, row, yStructuralNode, childrenFirst, renderNow, False) # render on this pass
551
- return (nestedBottomRow, row)
552
-
553
- def yAxisByCol(self, leftCol, row, yParentStructuralNode, childrenFirst, renderNow, atTop):
554
- if yParentStructuralNode is not None:
555
- nestedBottomRow = row
556
- for yStructuralNode in yParentStructuralNode.childStructuralNodes:
557
- nestRow, nextRow = self.yAxisByCol(leftCol + 1, row, yStructuralNode, # nested items before totals
558
- childrenFirst, childrenFirst, False)
559
- isAbstract = (yStructuralNode.isAbstract or
560
- (yStructuralNode.childStructuralNodes and
561
- not isinstance(yStructuralNode.definitionNode, (ModelClosedDefinitionNode, ModelEuAxisCoord))))
562
- isNonAbstract = not isAbstract
563
- isLabeled = yStructuralNode.isLabeled
564
- topRow = row
565
- if childrenFirst and isNonAbstract:
566
- row = nextRow
567
- #print ( "thisCol {0} leftCol {1} rightCol {2} topRow{3} renderNow {4} label {5}".format(thisCol, leftCol, rightCol, topRow, renderNow, label))
568
- if renderNow and isLabeled:
569
- label = yStructuralNode.header(lang=self.lang,
570
- returnGenLabel=isinstance(yStructuralNode.definitionNode, (ModelClosedDefinitionNode, ModelEuAxisCoord)),
571
- recurseParent=not isinstance(yStructuralNode.definitionNode, ModelFilterDefinitionNode))
572
- brkdownNode = yStructuralNode.breakdownNode
573
- rowspan= nestRow - row + 1
574
- cellElt = etree.Element(self.tableModelQName("cell"),
575
- attrib={"span": str(rowspan)} if rowspan > 1 else None)
576
- elt = etree.SubElement(cellElt, self.tableModelQName("label"))
577
- elt.text = label if label != OPEN_ASPECT_ENTRY_SURROGATE else ""
578
- self.headerCells[leftCol].append((brkdownNode, cellElt))
579
- # self.structuralNodeModelElements.append((yStructuralNode, cellElt))
580
- for rollUpCol in range(leftCol, self.rowHdrCols - 1):
581
- rollUpElt = etree.Element(self.tableModelQName("cell"),
582
- attrib={"rollup":"true"})
583
- self.headerCells[leftCol].append((brkdownNode, rollUpElt))
584
- #if isNonAbstract:
585
- i = -1 # for case where no enumeration takes place
586
- for i, role in enumerate(self.rowHdrNonStdRoles):
587
- roleLabel = yStructuralNode.header(role=role, lang=self.lang, recurseParent=False)
588
- if roleLabel is not None:
589
- cellElt.append(etree.Comment("Label role: {0}, lang {1}"
590
- .format(os.path.basename(role), self.lang)))
591
- labelElt = etree.SubElement(cellElt, self.tableModelQName("label"),
592
- #attrib={"role":role,
593
- # "lang":self.lang}
594
- ).text = roleLabel
595
- self.headerCells[leftCol].append((brkdownNode, cellElt))
596
- for aspect in sorted(yStructuralNode.aspectsCovered(), key=lambda a: aspectStr(a)):
597
- if yStructuralNode.hasAspect(aspect) and aspect not in (Aspect.DIMENSIONS, Aspect.OMIT_DIMENSIONS):
598
- aspectValue = yStructuralNode.aspectValue(aspect)
599
- if aspectValue is None: aspectValue = "(bound dynamically)"
600
- if isinstance(aspectValue, ModelObject): # typed dimension value
601
- aspectValue = innerTextList(aspectValue)
602
- if isinstance(aspectValue, QName) and aspectValue.prefix is None: # may be dynamic
603
- try:
604
- aspectValue = self.modelXbrl.qnameConcepts[aspectValue].qname # usually has a prefix
605
- except KeyError:
606
- pass
607
- if isinstance(aspectValue, str) and aspectValue.startswith(OPEN_ASPECT_ENTRY_SURROGATE):
608
- continue # not an aspect, position for a new entry
609
- elt = etree.SubElement(cellElt, self.tableModelQName("constraint"))
610
- etree.SubElement(elt, self.tableModelQName("aspect")
611
- ).text = aspectStr(aspect)
612
- etree.SubElement(elt, self.tableModelQName("value")
613
- ).text = xsString(None,None,addQnameValue(self.xmlDoc, aspectValue))
614
- '''
615
- if self.rowHdrDocCol:
616
- labelElt = etree.SubElement(cellElt, self.tableModelQName("label"),
617
- attrib={"span": str(rowspan)} if rowspan > 1 else None)
618
- elt.text = yStructuralNode.header(role="http://www.xbrl.org/2008/role/documentation",
619
- lang=self.lang)
620
- self.rowHdrElts[self.rowHdrCols - 1].append(elt)
621
- if self.rowHdrCodeCol:
622
- elt = etree.Element(self.tableModelQName("label"),
623
- attrib={"span": str(rowspan)} if rowspan > 1 else None)
624
- elt.text = yStructuralNode.header(role="http://www.eurofiling.info/role/2010/coordinate-code",
625
- lang=self.lang)
626
- self.rowHdrElts[self.rowHdrCols - 1 + self.rowHdrDocCol].append(elt)
627
- '''
628
- if isNonAbstract:
629
- row += 1
630
- elif childrenFirst:
631
- row = nextRow
632
- if nestRow > nestedBottomRow:
633
- nestedBottomRow = nestRow + (isNonAbstract and not childrenFirst)
634
- if row > nestedBottomRow:
635
- nestedBottomRow = row
636
- #if renderNow and not childrenFirst:
637
- # dummy, row = self.yAxis(leftCol + 1, row, yStructuralNode, childrenFirst, True, False) # render on this pass
638
- if not childrenFirst:
639
- dummy, row = self.yAxisByCol(leftCol + 1, row, yStructuralNode, childrenFirst, renderNow, False) # render on this pass
640
- return (nestedBottomRow, row)
641
-
642
-
643
- def bodyCells(self, row, yParentStructuralNode, xStructuralNodes, zAspectStructuralNodes, yChildrenFirst):
644
- if yParentStructuralNode is not None:
645
- dimDefaults = self.modelXbrl.qnameDimensionDefaults
646
- for yStructuralNode in yParentStructuralNode.childStructuralNodes:
647
- if yChildrenFirst:
648
- row = self.bodyCells(row, yStructuralNode, xStructuralNodes, zAspectStructuralNodes, yChildrenFirst)
649
- if not (yStructuralNode.isAbstract or
650
- (yStructuralNode.childStructuralNodes and
651
- not isinstance(yStructuralNode.definitionNode, (ModelClosedDefinitionNode, ModelEuAxisCoord)))) and yStructuralNode.isLabeled:
652
- if self.type == XML:
653
- if self.breakdownNodes.get("x"):
654
- cellsParentElt = etree.SubElement(self.cellsParentElt, self.tableModelQName("cells"),
655
- attrib={"axis": "x"})
656
- else:
657
- cellsParentElt = self.cellsParentElt
658
- isEntryPrototype = yStructuralNode.isEntryPrototype(default=False) # row to enter open aspects
659
- yAspectStructuralNodes = defaultdict(set)
660
- for aspect in aspectModels[self.aspectModel]:
661
- if yStructuralNode.hasAspect(aspect):
662
- if aspect == Aspect.DIMENSIONS:
663
- for dim in (yStructuralNode.aspectValue(Aspect.DIMENSIONS) or emptyList):
664
- yAspectStructuralNodes[dim].add(yStructuralNode)
665
- else:
666
- yAspectStructuralNodes[aspect].add(yStructuralNode)
667
- yTagSelectors = yStructuralNode.tagSelectors
668
- # data for columns of rows
669
- ignoreDimValidity = self.ignoreDimValidity.get()
670
- for i, xStructuralNode in enumerate(xStructuralNodes):
671
- xAspectStructuralNodes = defaultdict(set)
672
- for aspect in aspectModels[self.aspectModel]:
673
- if xStructuralNode.hasAspect(aspect):
674
- if aspect == Aspect.DIMENSIONS:
675
- for dim in (xStructuralNode.aspectValue(Aspect.DIMENSIONS) or emptyList):
676
- xAspectStructuralNodes[dim].add(xStructuralNode)
677
- else:
678
- xAspectStructuralNodes[aspect].add(xStructuralNode)
679
- cellTagSelectors = yTagSelectors | xStructuralNode.tagSelectors
680
- cellAspectValues = {}
681
- matchableAspects = set()
682
- for aspect in xAspectStructuralNodes.keys() | yAspectStructuralNodes.keys() | zAspectStructuralNodes.keys():
683
- aspectValue = xStructuralNode.inheritedAspectValue(yStructuralNode,
684
- self, aspect, cellTagSelectors,
685
- xAspectStructuralNodes, yAspectStructuralNodes, zAspectStructuralNodes)
686
- # value is None for a dimension whose value is to be not reported in this slice
687
- if (isinstance(aspect, int) or # not a dimension
688
- dimDefaults.get(aspect) != aspectValue or # explicit dim defaulted will equal the value
689
- aspectValue is not None): # typed dim absent will be none
690
- cellAspectValues[aspect] = aspectValue
691
- matchableAspects.add(aspectModelAspect.get(aspect,aspect)) #filterable aspect from rule aspect
692
- cellDefaultedDims = dimDefaults - cellAspectValues.keys()
693
- priItemQname = cellAspectValues.get(Aspect.CONCEPT)
694
-
695
- concept = self.modelXbrl.qnameConcepts.get(priItemQname)
696
- conceptNotAbstract = concept is None or not concept.isAbstract
697
- from arelle.ValidateXbrlDimensions import isFactDimensionallyValid
698
- fact = None
699
- value = None
700
- objectId = None
701
- justify = None
702
- fp = FactPrototype(self, cellAspectValues)
703
- if conceptNotAbstract:
704
- # reduce set of matchable facts to those with pri item qname and have dimension aspects
705
- facts = self.modelXbrl.factsByQname[priItemQname] if priItemQname else self.modelXbrl.factsInInstance
706
- if self.hasTableFilters:
707
- facts = self.modelTable.filterFacts(self.rendrCntx, facts)
708
- for aspect in matchableAspects: # trim down facts with explicit dimensions match or just present
709
- if isinstance(aspect, QName):
710
- aspectValue = cellAspectValues.get(aspect, None)
711
- if isinstance(aspectValue, ModelDimensionValue):
712
- if aspectValue.isExplicit:
713
- dimMemQname = aspectValue.memberQname # match facts with this explicit value
714
- else:
715
- dimMemQname = None # match facts that report this dimension
716
- elif isinstance(aspectValue, QName):
717
- dimMemQname = aspectValue # match facts that have this explicit value
718
- elif aspectValue is None: # match typed dims that don't report this value
719
- dimMemQname = DEFAULT
123
+ zHdrElts = [[]]
124
+ numZtbls = 1
125
+ zTbl = 0
126
+ lytMdlZBodyCell = lytMdlTable.lytMdlBodyChildren[0] # examples only show one z cell despite number of tables
127
+ for lytMdlYBodyCell in lytMdlZBodyCell.lytMdlBodyChildren:
128
+ zTableRow = etree.SubElement(self.tblElt, "{http://www.w3.org/1999/xhtml}tr")
129
+ zRowCell = etree.SubElement(zTableRow, "{http://www.w3.org/1999/xhtml}td")
130
+ zCellTable = etree.SubElement(zRowCell, "{http://www.w3.org/1999/xhtml}table",
131
+ attrib={"border":"1", "cellspacing":"0", "cellpadding":"4", "style":"font-size:8pt;"})
132
+ lytMdlXHdrs = lytMdlTable.lytMdlAxisHeaders("x")
133
+ lytMdlYHdrs = lytMdlTable.lytMdlAxisHeaders("y")
134
+ nbrXcolHdrs = lytMdlTable.headerDepth("x")
135
+ nbrYrowHdrs = lytMdlTable.headerDepth("y")
136
+ # build y row headers
137
+ numYrows = lytMdlTable.numBodyCells("y")
138
+ yRowHdrs = [[] for i in range(numYrows)] # list of list of row header elements for each row
139
+ for lytMdlYGrp in lytMdlYHdrs.lytMdlGroups:
140
+ for lytMdlYHdr in lytMdlYGrp.lytMdlHeaders:
141
+ yRow = 0
142
+ if all(lytMdlCell.isOpenAspectEntrySurrogate for lytMdlCell in lytMdlYHdr.lytMdlCells):
143
+ continue # skip header with only open aspect entry surrogate
144
+ for lytMdlYCell in lytMdlYHdr.lytMdlCells:
145
+ for iLabel in range(lytMdlYHdr.maxNumLabels):
146
+ if lytMdlYCell.isOpenAspectEntrySurrogate:
147
+ continue # strip all open aspect entry surrogates from layout model file
148
+ attrib = {"style":"max-width:100em;text-align:left;"}
149
+ if lytMdlYCell.rollup:
150
+ attrib["class"] = "yAxisTopSpanLeg"
151
+ else:
152
+ attrib["class"] = "yAxisHdr"
153
+ if lytMdlYCell.span > 1:
154
+ attrib["rowspan"] = str(lytMdlYCell.span)
155
+ rowHdrElt = etree.Element("{http://www.w3.org/1999/xhtml}th", attrib=attrib)
156
+ rowHdrElt.text = lytMdlYCell.labelXmlText(iLabel,"\u00a0")
157
+ yRowHdrs[yRow].append(rowHdrElt)
158
+ yRow += lytMdlYCell.span
159
+ firstColHdr = True
160
+ for lytMdlGroup in lytMdlXHdrs.lytMdlGroups:
161
+ for lytMdlHeader in lytMdlGroup.lytMdlHeaders:
162
+ if all(lytMdlCell.isOpenAspectEntrySurrogate for lytMdlCell in lytMdlHeader.lytMdlCells):
163
+ continue # skip header with only open aspect entry surrogate
164
+ for iLabel in range(lytMdlHeader.maxNumLabels):
165
+ rowElt = etree.SubElement(zCellTable, "{http://www.w3.org/1999/xhtml}tr")
166
+ if firstColHdr:
167
+ zHdrElt = etree.SubElement(rowElt, "{http://www.w3.org/1999/xhtml}th",
168
+ attrib={"class":"tableHdr",
169
+ "style":"max-width:100em;",
170
+ "colspan": str(nbrYrowHdrs),
171
+ "rowspan": str(nbrXcolHdrs)})
172
+ if zHdrElts[zTbl]:
173
+ zHdrTblElt = etree.SubElement(zHdrElt,"{http://www.w3.org/1999/xhtml}table",
174
+ attrib={"style":"border-top:none;border-left:none;border-right:none;border-bottom:none;"})
175
+ for zHdrLblRow in zHdrElts[zTbl]:
176
+ zHdrRowElt = etree.SubElement(zHdrTblElt, "{http://www.w3.org/1999/xhtml}tr")
177
+ for lbl in zHdrLblRow:
178
+ etree.SubElement(zHdrRowElt, "{http://www.w3.org/1999/xhtml}th",
179
+ attrib={"class":"tableHdr","style":"max-width:100em;font-size:8pt;text-align:left;border-top:none;border-left:none;border-right:none;border-bottom:none;"}
180
+ ).text = lbl
720
181
  else:
721
- dimMemQname = None # match facts that report this dimension
722
- facts = facts & self.modelXbrl.factsByDimMemQname(aspect, dimMemQname)
723
- for fact in facts:
724
- if (all(aspectMatches(self.rendrCntx, fact, fp, aspect)
725
- for aspect in matchableAspects) and
726
- all(fact.context.dimMemberQname(dim,includeDefaults=True) in (dimDefaults[dim], None)
727
- for dim in cellDefaultedDims) and
728
- len(fp.context.qnameDims) == len(fact.context.qnameDims)):
729
- if yStructuralNode.hasValueExpression(xStructuralNode):
730
- value = yStructuralNode.evalValueExpression(fact, xStructuralNode)
182
+ zHdrElt.text = '\u00a0'
183
+ firstColHdr = False
184
+ for lytMdlCell in lytMdlHeader.lytMdlCells:
185
+ if lytMdlCell.isOpenAspectEntrySurrogate:
186
+ continue # strip all open aspect entry surrogates from layout model file
187
+ attrib = {"style":"max-width:100em;"}
188
+ if lytMdlCell.rollup:
189
+ attrib["class"] = "xAxisSpanLeg"
731
190
  else:
732
- value = fact.effectiveValue
733
- justify = "right" if fact.isNumeric else "left"
734
- break
735
- if justify is None:
736
- justify = "right" if fp.isNumeric else "left"
737
- if conceptNotAbstract:
738
- if self.type == XML:
739
- cellsParentElt.append(etree.Comment("Cell concept {0}: segDims {1}, scenDims {2}"
740
- .format(fp.qname,
741
- ', '.join("({}={})".format(dimVal.dimensionQname, dimVal.memberQname)
742
- for dimVal in sorted(fp.context.segDimVals.values(), key=lambda d: d.dimensionQname)),
743
- ', '.join("({}={})".format(dimVal.dimensionQname, dimVal.memberQname)
744
- for dimVal in sorted(fp.context.scenDimVals.values(), key=lambda d: d.dimensionQname)),
745
- )))
746
- if value is not None or ignoreDimValidity or isFactDimensionallyValid(self, fp) or isEntryPrototype:
747
- if self.type == HTML:
748
- etree.SubElement(self.rowElts[row - 1],
749
- "{http://www.w3.org/1999/xhtml}td",
750
- attrib={"class":"cell",
751
- "style":"text-align:{0};width:8em".format(justify)}
752
- ).text = value or "\u00A0"
753
- elif self.type == XML:
754
- if value is not None and fact is not None:
755
- cellsParentElt.append(etree.Comment("{0}: context {1}, value {2}, file {3}, line {4}"
756
- .format(fact.qname,
757
- fact.contextID,
758
- value[:32], # no more than 32 characters
759
- fact.modelDocument.basename,
760
- fact.sourceline)))
761
- elif fact is not None:
762
- cellsParentElt.append(etree.Comment("Fact was not matched {0}: context {1}, value {2}, file {3}, line {4}, aspects not matched: {5}, dimensions expected to have been defaulted: {6}"
763
- .format(fact.qname,
764
- fact.contextID,
765
- fact.effectiveValue[:32],
766
- fact.modelDocument.basename,
767
- fact.sourceline,
768
- ', '.join(str(aspect)
769
- for aspect in matchableAspects
770
- if not aspectMatches(self.rendrCntx, fact, fp, aspect)),
771
- ', '.join(str(dim)
772
- for dim in cellDefaultedDims
773
- if fact.context.dimMemberQname(dim,includeDefaults=True) not in (dimDefaults[dim], None))
774
- )))
775
- cellElt = etree.SubElement(cellsParentElt, self.tableModelQName("cell"))
776
- if value is not None and fact is not None:
777
- etree.SubElement(cellElt, self.tableModelQName("fact")
778
- ).text = '{}#{}'.format(fact.modelDocument.basename,
779
- elementFragmentIdentifier(fact))
780
- else:
781
- if self.type == HTML:
782
- etree.SubElement(self.rowElts[row - 1],
783
- "{http://www.w3.org/1999/xhtml}td",
784
- attrib={"class":"blockedCell",
785
- "style":"text-align:{0};width:8em".format(justify)}
786
- ).text = "\u00A0\u00A0"
787
- elif self.type == XML:
788
- etree.SubElement(cellsParentElt, self.tableModelQName("cell"),
789
- attrib={"blocked":"true"})
790
- else: # concept is abstract
791
- if self.type == HTML:
792
- etree.SubElement(self.rowElts[row - 1],
793
- "{http://www.w3.org/1999/xhtml}td",
794
- attrib={"class":"abstractCell",
795
- "style":"text-align:{0};width:8em".format(justify)}
796
- ).text = "\u00A0\u00A0"
797
- elif self.type == XML:
798
- etree.SubElement(cellsParentElt, self.tableModelQName("cell"),
799
- attrib={"abstract":"true"})
800
- fp.clear() # dereference
801
- row += 1
802
- if not yChildrenFirst:
803
- row = self.bodyCells(row, yStructuralNode, xStructuralNodes, zAspectStructuralNodes, yChildrenFirst)
804
- return row
191
+ attrib["class"] = "xAxisHdr"
192
+ if lytMdlCell.span > 1:
193
+ attrib["colspan"] = str(lytMdlCell.span)
194
+ etree.SubElement(rowElt, "{http://www.w3.org/1999/xhtml}th", attrib=attrib
195
+ ).text = lytMdlCell.labelXmlText(iLabel,"\u00a0")
196
+ yRowNum = 0
197
+ for lytMdlXBodyCell in lytMdlYBodyCell.lytMdlBodyChildren:
198
+ if True: # not any(lytMdlCell.isOpenAspectEntrySurrogate for lytMdlCell in lytMdlXBodyCell.lytMdlBodyChildren):
199
+ rowElt = etree.SubElement(zCellTable, "{http://www.w3.org/1999/xhtml}tr")
200
+ if yRowNum < len(yRowHdrs):
201
+ for rowHdrElt in yRowHdrs[yRowNum]:
202
+ rowElt.append(rowHdrElt)
203
+ for lytMdlCell in lytMdlXBodyCell.lytMdlBodyChildren:
204
+ if lytMdlCell.isOpenAspectEntrySurrogate:
205
+ continue
206
+ justify = "left"
207
+ for f, v, justify in lytMdlCell.facts:
208
+ break;
209
+ colElt = etree.SubElement(rowElt, "{http://www.w3.org/1999/xhtml}td",
210
+ attrib={"class":"cell",
211
+ "style":f"text-align:{justify};width:8em;"}
212
+ ).text = "\n".join(v for f, v, justify in lytMdlCell.facts)
213
+ yRowNum += 1
214
+ if zTbl < len(lytMdlZBodyCell.lytMdlBodyChildren) - 1:
215
+ zTbl += 1