arelle-release 2.37.46__py3-none-any.whl → 2.38.0__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 (204) hide show
  1. arelle/BetaFeatures.py +0 -21
  2. arelle/Cntlr.py +15 -8
  3. arelle/CntlrCmdLine.py +121 -56
  4. arelle/CntlrWinMain.py +143 -70
  5. arelle/DialogFind.py +1 -1
  6. arelle/DialogPluginManager.py +6 -4
  7. arelle/DisclosureSystem.py +7 -0
  8. arelle/ErrorManager.py +21 -6
  9. arelle/FileSource.py +11 -4
  10. arelle/FunctionIxt.py +16 -11
  11. arelle/HtmlUtil.py +5 -4
  12. arelle/LeiUtil.py +63 -43
  13. arelle/ModelDocument.py +20 -15
  14. arelle/ModelDtsObject.py +8 -0
  15. arelle/ModelInstanceObject.py +1 -1
  16. arelle/ModelObject.py +16 -18
  17. arelle/ModelObjectFactory.py +35 -17
  18. arelle/ModelXbrl.py +28 -11
  19. arelle/PluginManager.py +130 -105
  20. arelle/RuntimeOptions.py +1 -0
  21. arelle/UrlUtil.py +14 -0
  22. arelle/Validate.py +17 -12
  23. arelle/ValidateDuplicateFacts.py +3 -1
  24. arelle/ValidateFileSource.py +38 -0
  25. arelle/ValidateFilingText.py +3 -3
  26. arelle/ValidateXbrl.py +5 -2
  27. arelle/ValidateXbrlCalcs.py +210 -186
  28. arelle/ValidateXbrlDTS.py +1 -1
  29. arelle/ViewFile.py +1 -0
  30. arelle/ViewFileFactTable.py +2 -2
  31. arelle/ViewWinDTS.py +4 -1
  32. arelle/WebCache.py +28 -24
  33. arelle/XbrlConst.py +22 -0
  34. arelle/XmlUtil.py +16 -21
  35. arelle/XmlValidate.py +6 -9
  36. arelle/_version.py +16 -3
  37. arelle/api/Session.py +11 -2
  38. arelle/config/disclosuresystems.xsd +2 -0
  39. arelle/config/rosettaEntitlements.plist +8 -0
  40. arelle/conformance/CSVTestcaseLoader.py +1 -1
  41. arelle/formula/XPathContext.py +3 -3
  42. arelle/logging/formatters/LogFormatter.py +3 -1
  43. arelle/packages/report/ReportPackage.py +26 -13
  44. arelle/packages/report/ReportPackageConst.py +0 -1
  45. arelle/plugin/inlineXbrlDocumentSet.py +19 -5
  46. arelle/plugin/validate/DBA/DisclosureSystems.py +19 -1
  47. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +2 -4
  48. arelle/plugin/validate/DBA/ValidationPluginExtension.py +2 -1
  49. arelle/plugin/validate/DBA/resources/config.xml +5 -0
  50. arelle/plugin/validate/DBA/rules/__init__.py +2 -2
  51. arelle/plugin/validate/DBA/rules/fr.py +19 -2
  52. arelle/plugin/validate/DBA/rules/tc.py +2 -0
  53. arelle/plugin/validate/DBA/rules/th.py +6 -0
  54. arelle/plugin/validate/DBA/rules/tm.py +18 -5
  55. arelle/plugin/validate/DBA/rules/tr.py +11 -5
  56. arelle/plugin/validate/EDINET/Constants.py +193 -9
  57. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  58. arelle/plugin/validate/EDINET/ControllerPluginData.py +220 -1
  59. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  60. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  61. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  62. arelle/plugin/validate/EDINET/FormType.py +134 -0
  63. arelle/plugin/validate/EDINET/ManifestInstance.py +72 -5
  64. arelle/plugin/validate/EDINET/NamespaceConfig.py +50 -0
  65. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +493 -132
  66. arelle/plugin/validate/EDINET/{InstanceType.py → ReportFolderType.py} +72 -15
  67. arelle/plugin/validate/EDINET/Statement.py +139 -0
  68. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +595 -0
  69. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  70. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +20 -2
  71. arelle/plugin/validate/EDINET/__init__.py +31 -6
  72. arelle/plugin/validate/EDINET/resources/config.xml +8 -1
  73. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  74. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  75. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +2 -0
  76. arelle/plugin/validate/EDINET/rules/contexts.py +375 -14
  77. arelle/plugin/validate/EDINET/rules/edinet.py +1934 -45
  78. arelle/plugin/validate/EDINET/rules/frta.py +122 -3
  79. arelle/plugin/validate/EDINET/rules/gfm.py +1907 -11
  80. arelle/plugin/validate/EDINET/rules/upload.py +989 -141
  81. arelle/plugin/validate/ESEF/Const.py +3 -1
  82. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +5 -0
  83. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +2 -2
  84. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +23 -20
  85. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +47 -14
  86. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +100 -25
  87. arelle/plugin/validate/ESEF/__init__.py +20 -6
  88. arelle/plugin/validate/ESEF/resources/authority-validations.json +76 -9
  89. arelle/plugin/validate/ESEF/resources/config.xml +20 -0
  90. arelle/plugin/validate/NL/DisclosureSystems.py +22 -0
  91. arelle/plugin/validate/NL/PluginValidationDataExtension.py +27 -9
  92. arelle/plugin/validate/NL/ValidationPluginExtension.py +51 -7
  93. arelle/plugin/validate/NL/resources/config.xml +18 -0
  94. arelle/plugin/validate/NL/rules/br_kvk.py +17 -61
  95. arelle/plugin/validate/NL/rules/fg_nl.py +7 -38
  96. arelle/plugin/validate/NL/rules/fr_kvk.py +7 -42
  97. arelle/plugin/validate/NL/rules/fr_nl.py +31 -147
  98. arelle/plugin/validate/NL/rules/nl_kvk.py +142 -28
  99. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +2 -0
  100. arelle/plugin/validate/ROS/ValidationPluginExtension.py +4 -1
  101. arelle/plugin/validate/ROS/rules/ros.py +41 -9
  102. arelle/plugin/validate/UK/ValidateUK.py +130 -66
  103. arelle/plugin/validate/UK/__init__.py +89 -103
  104. arelle/utils/EntryPointDetection.py +79 -13
  105. arelle/utils/PluginHooks.py +125 -0
  106. arelle/utils/validate/ESEFImage.py +6 -6
  107. arelle/utils/validate/Validation.py +18 -0
  108. arelle/utils/validate/ValidationPlugin.py +76 -11
  109. arelle/utils/validate/ValidationUtil.py +35 -3
  110. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/METADATA +30 -20
  111. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/RECORD +115 -191
  112. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/licenses/LICENSE.md +0 -3
  113. arelle/archive/CustomLogger.py +0 -43
  114. arelle/archive/LoadEFMvalidate.py +0 -32
  115. arelle/archive/LoadSavePreLbCsv.py +0 -26
  116. arelle/archive/LoadValidate.cs +0 -31
  117. arelle/archive/LoadValidate.py +0 -36
  118. arelle/archive/LoadValidateCmdLine.java +0 -69
  119. arelle/archive/LoadValidatePostedZip.java +0 -57
  120. arelle/archive/LoadValidateWebService.java +0 -34
  121. arelle/archive/SaveTableToExelle.py +0 -140
  122. arelle/archive/TR3toTR4.py +0 -88
  123. arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
  124. arelle/archive/plugin/bigInstance.py +0 -394
  125. arelle/archive/plugin/cmdWebServerExtension.py +0 -43
  126. arelle/archive/plugin/crashTest.py +0 -38
  127. arelle/archive/plugin/functionsXmlCreation.py +0 -106
  128. arelle/archive/plugin/hello_i18n.pot +0 -26
  129. arelle/archive/plugin/hello_i18n.py +0 -32
  130. arelle/archive/plugin/importTestChild1.py +0 -21
  131. arelle/archive/plugin/importTestChild2.py +0 -22
  132. arelle/archive/plugin/importTestGrandchild1.py +0 -21
  133. arelle/archive/plugin/importTestGrandchild2.py +0 -21
  134. arelle/archive/plugin/importTestImported1.py +0 -23
  135. arelle/archive/plugin/importTestImported11.py +0 -22
  136. arelle/archive/plugin/importTestParent.py +0 -48
  137. arelle/archive/plugin/instanceInfo.py +0 -306
  138. arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
  139. arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  140. arelle/archive/plugin/objectmaker.py +0 -285
  141. arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
  142. arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
  143. arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
  144. arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  145. arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  146. arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
  147. arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
  148. arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  149. arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  150. arelle/archive/plugin/sakaCalendar.py +0 -215
  151. arelle/archive/plugin/saveInstanceInfoset.py +0 -121
  152. arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
  153. arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
  154. arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
  155. arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
  156. arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
  157. arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
  158. arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  159. arelle/archive/plugin/sphinx/__init__.py +0 -285
  160. arelle/archive/plugin/streamingExtensions.py +0 -335
  161. arelle/archive/plugin/updateTableLB.py +0 -242
  162. arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
  163. arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
  164. arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
  165. arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
  166. arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
  167. arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
  168. arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
  169. arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  170. arelle/archive/plugin/validate/USBestPractices.py +0 -570
  171. arelle/archive/plugin/validate/USCorpAction.py +0 -557
  172. arelle/archive/plugin/validate/USSecTagging.py +0 -337
  173. arelle/archive/plugin/validate/XDC/__init__.py +0 -77
  174. arelle/archive/plugin/validate/XDC/config.xml +0 -20
  175. arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
  176. arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
  177. arelle/archive/plugin/validate/calc2.py +0 -536
  178. arelle/archive/plugin/validateSchemaLxml.py +0 -156
  179. arelle/archive/plugin/validateTableInfoset.py +0 -52
  180. arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
  181. arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
  182. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  183. arelle/examples/plugin/functionsCustom.py +0 -59
  184. arelle/examples/plugin/hello_dolly.py +0 -64
  185. arelle/examples/plugin/multi.py +0 -58
  186. arelle/examples/plugin/rssSaveOim.py +0 -96
  187. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  188. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  189. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  190. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  191. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  192. arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
  193. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
  194. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
  195. arelle/model/CommentBase.py +0 -9
  196. arelle/model/ElementBase.py +0 -11
  197. arelle/model/PIBase.py +0 -10
  198. arelle/model/__init__.py +0 -15
  199. arelle/scripts-macOS/startWebServer.command +0 -3
  200. arelle/scripts-unix/startWebServer.sh +0 -1
  201. arelle/scripts-windows/startWebServer.bat +0 -5
  202. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/WHEEL +0 -0
  203. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/entry_points.txt +0 -0
  204. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/top_level.txt +0 -0
@@ -3,6 +3,7 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
+ from arelle.Cntlr import Cntlr
6
7
  from arelle.ModelValue import qname
7
8
  from arelle.ValidateXbrl import ValidateXbrl
8
9
  from arelle.typing import TypeGetText
@@ -26,7 +27,7 @@ REQUIRED_DISCLOSURE_OF_EQUITY_FACTS = 2
26
27
 
27
28
 
28
29
  class ValidationPluginExtension(ValidationPlugin):
29
- def newPluginData(self, validateXbrl: ValidateXbrl) -> PluginValidationDataExtension:
30
+ def newPluginData(self, cntlr: Cntlr, validateXbrl: ValidateXbrl | None) -> PluginValidationDataExtension:
30
31
  return PluginValidationDataExtension(
31
32
  self.name,
32
33
  accountingPolicyConceptQns=frozenset([
@@ -18,4 +18,9 @@
18
18
  description="Checks for 2024 multi-target rules"
19
19
  validationType="DBA"
20
20
  />
21
+ <DisclosureSystem
22
+ names="dkfin-2024-multi-target-preview"
23
+ description="Checks for dkfin 2024 multi-target rules"
24
+ validationType="DBA"
25
+ />
21
26
  </DisclosureSystems>
@@ -14,7 +14,7 @@ from arelle.ModelInstanceObject import ModelFact
14
14
  from arelle.ModelValue import QName
15
15
  from arelle.ModelXbrl import ModelXbrl
16
16
  from arelle.typing import TypeGetText
17
- from arelle.UrlUtil import scheme
17
+ from arelle.UrlUtil import isExternalUrl
18
18
  from arelle.utils.Contexts import ContextHashKey
19
19
  from arelle.utils.validate.Validation import Validation
20
20
  from arelle.ValidateFilingText import parseImageDataURL
@@ -73,7 +73,7 @@ def errorOnForbiddenImage(
73
73
  """
74
74
  invalidImages = []
75
75
  for image in images:
76
- if scheme(image) in ("http", "https", "ftp"):
76
+ if isExternalUrl(image):
77
77
  invalidImages.append(image)
78
78
  elif image.startswith("data:image"):
79
79
  dataURLParts = parseImageDataURL(image)
@@ -20,12 +20,13 @@ from . import errorOnDateFactComparison, getFactsWithDimension, getFactsGroupedB
20
20
  minimumRequiredFactsFound, consolidatedDimensionExists
21
21
  from ..PluginValidationDataExtension import PluginValidationDataExtension
22
22
  from ..ValidationPluginExtension import DANISH_CURRENCY_ID, ROUNDING_MARGIN, PERSONNEL_EXPENSE_THRESHOLD, REQUIRED_DISCLOSURE_OF_EQUITY_FACTS, REQUIRED_STATEMENT_OF_CHANGES_IN_EQUITY_FACTS
23
- from ..DisclosureSystems import MULTI_TARGET_DISCLOSURE_SYSTEMS, STAND_ALONE_DISCLOSURE_SYSTEMS
23
+ from ..DisclosureSystems import ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS, STAND_ALONE_DISCLOSURE_SYSTEMS, ARL_DISCLOSURE_SYSTEMS
24
24
 
25
25
  _: TypeGetText
26
26
 
27
27
  @validation(
28
28
  hook=ValidationHook.XBRL_FINALLY,
29
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
29
30
  )
30
31
  def rule_fr1(
31
32
  pluginData: PluginValidationDataExtension,
@@ -52,6 +53,7 @@ def rule_fr1(
52
53
 
53
54
  @validation(
54
55
  hook=ValidationHook.XBRL_FINALLY,
56
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
55
57
  )
56
58
  def rule_fr7(
57
59
  pluginData: PluginValidationDataExtension,
@@ -108,6 +110,7 @@ def rule_fr20(
108
110
 
109
111
  @validation(
110
112
  hook=ValidationHook.XBRL_FINALLY,
113
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
111
114
  )
112
115
  def rule_fr24(
113
116
  pluginData: PluginValidationDataExtension,
@@ -143,6 +146,7 @@ def rule_fr24(
143
146
 
144
147
  @validation(
145
148
  hook=ValidationHook.XBRL_FINALLY,
149
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
146
150
  )
147
151
  def rule_fr25(
148
152
  pluginData: PluginValidationDataExtension,
@@ -302,6 +306,7 @@ def rule_fr35(
302
306
 
303
307
  @validation(
304
308
  hook=ValidationHook.XBRL_FINALLY,
309
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
305
310
  )
306
311
  def rule_fr36(
307
312
  pluginData: PluginValidationDataExtension,
@@ -329,6 +334,7 @@ def rule_fr36(
329
334
 
330
335
  @validation(
331
336
  hook=ValidationHook.XBRL_FINALLY,
337
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
332
338
  )
333
339
  def rule_fr37(
334
340
  pluginData: PluginValidationDataExtension,
@@ -468,6 +474,7 @@ def rule_fr52(
468
474
 
469
475
  @validation(
470
476
  hook=ValidationHook.XBRL_FINALLY,
477
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
471
478
  )
472
479
  def rule_fr53(
473
480
  pluginData: PluginValidationDataExtension,
@@ -770,6 +777,7 @@ def rule_fr57(
770
777
 
771
778
  @validation(
772
779
  hook=ValidationHook.XBRL_FINALLY,
780
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
773
781
  )
774
782
  def rule_fr58(
775
783
  pluginData: PluginValidationDataExtension,
@@ -805,6 +813,7 @@ def rule_fr58(
805
813
 
806
814
  @validation(
807
815
  hook=ValidationHook.XBRL_FINALLY,
816
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
808
817
  )
809
818
  def rule_fr59(
810
819
  pluginData: PluginValidationDataExtension,
@@ -934,6 +943,7 @@ def rule_fr71(
934
943
 
935
944
  @validation(
936
945
  hook=ValidationHook.XBRL_FINALLY,
946
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
937
947
  )
938
948
  def rule_fr72(
939
949
  pluginData: PluginValidationDataExtension,
@@ -973,6 +983,7 @@ def rule_fr72(
973
983
 
974
984
  @validation(
975
985
  hook=ValidationHook.XBRL_FINALLY,
986
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
976
987
  )
977
988
  def rule_fr73(
978
989
  pluginData: PluginValidationDataExtension,
@@ -1006,6 +1017,7 @@ def rule_fr73(
1006
1017
 
1007
1018
  @validation(
1008
1019
  hook=ValidationHook.XBRL_FINALLY,
1020
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1009
1021
  )
1010
1022
  def rule_fr74(
1011
1023
  pluginData: PluginValidationDataExtension,
@@ -1146,6 +1158,7 @@ def rule_fr77(
1146
1158
 
1147
1159
  @validation(
1148
1160
  hook=ValidationHook.XBRL_FINALLY,
1161
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1149
1162
  )
1150
1163
  def rule_fr81(
1151
1164
  pluginData: PluginValidationDataExtension,
@@ -1171,7 +1184,7 @@ def rule_fr81(
1171
1184
 
1172
1185
  @validation(
1173
1186
  hook=ValidationHook.XBRL_FINALLY,
1174
- disclosureSystems=MULTI_TARGET_DISCLOSURE_SYSTEMS,
1187
+ disclosureSystems=ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS,
1175
1188
  )
1176
1189
  def rule_fr82(
1177
1190
  pluginData: PluginValidationDataExtension,
@@ -1215,6 +1228,7 @@ def rule_fr83(
1215
1228
 
1216
1229
  @validation(
1217
1230
  hook=ValidationHook.XBRL_FINALLY,
1231
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1218
1232
  )
1219
1233
  def rule_fr87(
1220
1234
  pluginData: PluginValidationDataExtension,
@@ -1251,6 +1265,7 @@ def rule_fr87(
1251
1265
 
1252
1266
  @validation(
1253
1267
  hook=ValidationHook.XBRL_FINALLY,
1268
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1254
1269
  )
1255
1270
  def rule_fr89(
1256
1271
  pluginData: PluginValidationDataExtension,
@@ -1301,6 +1316,7 @@ def rule_fr89(
1301
1316
 
1302
1317
  @validation(
1303
1318
  hook=ValidationHook.XBRL_FINALLY,
1319
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1304
1320
  )
1305
1321
  def rule_fr91(
1306
1322
  pluginData: PluginValidationDataExtension,
@@ -1331,6 +1347,7 @@ def rule_fr91(
1331
1347
 
1332
1348
  @validation(
1333
1349
  hook=ValidationHook.XBRL_FINALLY,
1350
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1334
1351
  )
1335
1352
  def rule_fr92(
1336
1353
  pluginData: PluginValidationDataExtension,
@@ -13,11 +13,13 @@ from arelle.utils.validate.Decorator import validation
13
13
  from arelle.utils.validate.Validation import Validation
14
14
  from arelle.XmlValidateConst import VALID
15
15
  from ..PluginValidationDataExtension import PluginValidationDataExtension
16
+ from ..DisclosureSystems import ARL_DISCLOSURE_SYSTEMS
16
17
 
17
18
  _: TypeGetText
18
19
 
19
20
  @validation(
20
21
  hook=ValidationHook.XBRL_FINALLY,
22
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
21
23
  )
22
24
  def rule_tc02(
23
25
  pluginData: PluginValidationDataExtension,
@@ -14,12 +14,14 @@ from arelle.utils.validate.Decorator import validation
14
14
  from arelle.utils.validate.Validation import Validation
15
15
  from arelle.XmlValidateConst import VALID
16
16
  from ..PluginValidationDataExtension import PluginValidationDataExtension
17
+ from ..DisclosureSystems import ALL_DISCLOSURE_SYSTEMS
17
18
 
18
19
  _: TypeGetText
19
20
 
20
21
 
21
22
  @validation(
22
23
  hook=ValidationHook.XBRL_FINALLY,
24
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
23
25
  )
24
26
  def rule_th01(
25
27
  pluginData: PluginValidationDataExtension,
@@ -49,6 +51,7 @@ def rule_th01(
49
51
 
50
52
  @validation(
51
53
  hook=ValidationHook.XBRL_FINALLY,
54
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
52
55
  )
53
56
  def rule_th05 (
54
57
  pluginData: PluginValidationDataExtension,
@@ -71,6 +74,7 @@ def rule_th05 (
71
74
 
72
75
  @validation(
73
76
  hook=ValidationHook.XBRL_FINALLY,
77
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
74
78
  )
75
79
  def rule_th06 (
76
80
  pluginData: PluginValidationDataExtension,
@@ -95,6 +99,7 @@ def rule_th06 (
95
99
 
96
100
  @validation(
97
101
  hook=ValidationHook.XBRL_FINALLY,
102
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
98
103
  )
99
104
  def rule_th10 (
100
105
  pluginData: PluginValidationDataExtension,
@@ -143,6 +148,7 @@ def rule_th10 (
143
148
 
144
149
  @validation(
145
150
  hook=ValidationHook.XBRL_FINALLY,
151
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
146
152
  )
147
153
  def rule_th14 (
148
154
  pluginData: PluginValidationDataExtension,
@@ -3,26 +3,24 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
- import datetime
7
- import decimal
8
- import itertools
9
6
  from collections.abc import Iterable
10
- from typing import Any, cast
7
+ from typing import Any
11
8
 
12
9
  from arelle.typing import TypeGetText
13
10
  from arelle.ValidateXbrl import ValidateXbrl
14
11
  from arelle.utils.PluginHooks import ValidationHook
15
12
  from arelle.utils.validate.Decorator import validation
16
13
  from arelle.utils.validate.Validation import Validation
17
- from arelle.XmlValidateConst import VALID
18
14
  from . import errorOnRequiredFact, errorOnMultipleFacts
19
15
  from ..PluginValidationDataExtension import PluginValidationDataExtension
16
+ from ..DisclosureSystems import ALL_DISCLOSURE_SYSTEMS, ARL_DISCLOSURE_SYSTEMS
20
17
 
21
18
  _: TypeGetText
22
19
 
23
20
 
24
21
  @validation(
25
22
  hook=ValidationHook.XBRL_FINALLY,
23
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
26
24
  )
27
25
  def rule_tm12(
28
26
  pluginData: PluginValidationDataExtension,
@@ -43,6 +41,7 @@ def rule_tm12(
43
41
 
44
42
  @validation(
45
43
  hook=ValidationHook.XBRL_FINALLY,
44
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
46
45
  )
47
46
  def rule_tm13(
48
47
  pluginData: PluginValidationDataExtension,
@@ -58,6 +57,7 @@ def rule_tm13(
58
57
 
59
58
  @validation(
60
59
  hook=ValidationHook.XBRL_FINALLY,
60
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
61
61
  )
62
62
  def rule_tm16(
63
63
  pluginData: PluginValidationDataExtension,
@@ -73,6 +73,7 @@ def rule_tm16(
73
73
 
74
74
  @validation(
75
75
  hook=ValidationHook.XBRL_FINALLY,
76
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
76
77
  )
77
78
  def rule_tm18(
78
79
  pluginData: PluginValidationDataExtension,
@@ -102,6 +103,7 @@ def rule_tm18(
102
103
 
103
104
  @validation(
104
105
  hook=ValidationHook.XBRL_FINALLY,
106
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
105
107
  )
106
108
  def rule_tm20(
107
109
  pluginData: PluginValidationDataExtension,
@@ -131,6 +133,7 @@ def rule_tm20(
131
133
 
132
134
  @validation(
133
135
  hook=ValidationHook.XBRL_FINALLY,
136
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
134
137
  )
135
138
  def rule_tm22(
136
139
  pluginData: PluginValidationDataExtension,
@@ -146,6 +149,7 @@ def rule_tm22(
146
149
 
147
150
  @validation(
148
151
  hook=ValidationHook.XBRL_FINALLY,
152
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
149
153
  )
150
154
  def rule_tm24(
151
155
  pluginData: PluginValidationDataExtension,
@@ -161,6 +165,7 @@ def rule_tm24(
161
165
 
162
166
  @validation(
163
167
  hook=ValidationHook.XBRL_FINALLY,
168
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
164
169
  )
165
170
  def rule_tm25(
166
171
  pluginData: PluginValidationDataExtension,
@@ -181,6 +186,7 @@ def rule_tm25(
181
186
 
182
187
  @validation(
183
188
  hook=ValidationHook.XBRL_FINALLY,
189
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
184
190
  )
185
191
  def rule_tm26(
186
192
  pluginData: PluginValidationDataExtension,
@@ -196,6 +202,7 @@ def rule_tm26(
196
202
 
197
203
  @validation(
198
204
  hook=ValidationHook.XBRL_FINALLY,
205
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
199
206
  )
200
207
  def rule_tm27(
201
208
  pluginData: PluginValidationDataExtension,
@@ -216,6 +223,7 @@ def rule_tm27(
216
223
 
217
224
  @validation(
218
225
  hook=ValidationHook.XBRL_FINALLY,
226
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
219
227
  )
220
228
  def rule_tm28(
221
229
  pluginData: PluginValidationDataExtension,
@@ -231,6 +239,7 @@ def rule_tm28(
231
239
 
232
240
  @validation(
233
241
  hook=ValidationHook.XBRL_FINALLY,
242
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
234
243
  )
235
244
  def rule_tm29(
236
245
  pluginData: PluginValidationDataExtension,
@@ -253,6 +262,7 @@ def rule_tm29(
253
262
 
254
263
  @validation(
255
264
  hook=ValidationHook.XBRL_FINALLY,
265
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
256
266
  )
257
267
  def rule_tm30(
258
268
  pluginData: PluginValidationDataExtension,
@@ -268,6 +278,7 @@ def rule_tm30(
268
278
 
269
279
  @validation(
270
280
  hook=ValidationHook.XBRL_FINALLY,
281
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
271
282
  )
272
283
  def rule_tm31(
273
284
  pluginData: PluginValidationDataExtension,
@@ -293,6 +304,7 @@ def rule_tm31(
293
304
 
294
305
  @validation(
295
306
  hook=ValidationHook.XBRL_FINALLY,
307
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
296
308
  )
297
309
  def rule_tm32(
298
310
  pluginData: PluginValidationDataExtension,
@@ -323,6 +335,7 @@ def rule_tm32(
323
335
 
324
336
  @validation(
325
337
  hook=ValidationHook.XBRL_FINALLY,
338
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
326
339
  )
327
340
  def rule_tm33(
328
341
  pluginData: PluginValidationDataExtension,
@@ -19,13 +19,15 @@ from arelle.XmlValidateConst import VALID
19
19
  from . import lookup_namespaced_facts, errorOnForbiddenImage
20
20
  from ..PluginValidationDataExtension import PluginValidationDataExtension
21
21
  from ..ValidationPluginExtension import NAMESPACE_GSD
22
- from ..DisclosureSystems import MULTI_TARGET_DISCLOSURE_SYSTEMS, STAND_ALONE_DISCLOSURE_SYSTEMS
22
+ from ..DisclosureSystems import (ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS, STAND_ALONE_DISCLOSURE_SYSTEMS,
23
+ ALL_DISCLOSURE_SYSTEMS, ARL_DISCLOSURE_SYSTEMS)
23
24
 
24
25
  _: TypeGetText
25
26
 
26
27
 
27
28
  @validation(
28
29
  hook=ValidationHook.XBRL_FINALLY,
30
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
29
31
  )
30
32
  def rule_tr01(
31
33
  pluginData: PluginValidationDataExtension,
@@ -178,6 +180,7 @@ def rule_tr06(
178
180
 
179
181
  @validation(
180
182
  hook=ValidationHook.XBRL_FINALLY,
183
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
181
184
  )
182
185
  def rule_tr09(
183
186
  pluginData: PluginValidationDataExtension,
@@ -197,7 +200,8 @@ def rule_tr09(
197
200
 
198
201
 
199
202
  @validation(
200
- hook=ValidationHook.XBRL_FINALLY
203
+ hook=ValidationHook.XBRL_FINALLY,
204
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
201
205
  )
202
206
  def rule_tr12(
203
207
  pluginData: PluginValidationDataExtension,
@@ -223,6 +227,7 @@ def rule_tr12(
223
227
 
224
228
  @validation(
225
229
  hook=ValidationHook.XBRL_FINALLY,
230
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
226
231
  )
227
232
  def rule_tr11(
228
233
  pluginData: PluginValidationDataExtension,
@@ -252,7 +257,7 @@ def rule_tr11(
252
257
 
253
258
  @validation(
254
259
  hook=ValidationHook.XBRL_FINALLY,
255
- disclosureSystems=MULTI_TARGET_DISCLOSURE_SYSTEMS,
260
+ disclosureSystems=ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS,
256
261
  )
257
262
  def rule_tr15(
258
263
  pluginData: PluginValidationDataExtension,
@@ -276,7 +281,7 @@ def rule_tr15(
276
281
 
277
282
  @validation(
278
283
  hook=ValidationHook.XBRL_FINALLY,
279
- disclosureSystems=MULTI_TARGET_DISCLOSURE_SYSTEMS,
284
+ disclosureSystems=ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS,
280
285
  )
281
286
  def rule_tr16(
282
287
  pluginData: PluginValidationDataExtension,
@@ -301,7 +306,7 @@ def rule_tr16(
301
306
 
302
307
  @validation(
303
308
  hook=ValidationHook.XBRL_FINALLY,
304
- disclosureSystems=MULTI_TARGET_DISCLOSURE_SYSTEMS,
309
+ disclosureSystems=ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS,
305
310
  )
306
311
  def rule_tr17(
307
312
  pluginData: PluginValidationDataExtension,
@@ -342,6 +347,7 @@ def rule_tr17(
342
347
 
343
348
  @validation(
344
349
  hook=ValidationHook.XBRL_FINALLY,
350
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
345
351
  )
346
352
  def rule_tr19(
347
353
  pluginData: PluginValidationDataExtension,
@@ -3,18 +3,18 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from enum import Enum
5
5
 
6
+ import regex
7
+
6
8
  from arelle.ModelValue import qname
7
9
 
8
- class FormType(Enum):
9
- FORM_2_4 = '第二号の四様式'
10
- FORM_2_7 = '第二号の七様式'
11
- FORM_3 = '第三号様式'
10
+ class AccountingStandard(Enum):
11
+ IFRS = 'IFRS'
12
+ JAPAN_GAAP = 'Japan GAAP'
13
+ US_GAAP = 'US GAAP'
14
+
15
+
16
+ domainItemTypeQname = qname("{http://www.xbrl.org/dtr/type/non-numeric}nonnum:domainItemType")
12
17
 
13
- CORPORATE_FORMS =frozenset([
14
- FormType.FORM_2_4,
15
- FormType.FORM_2_7,
16
- FormType.FORM_3,
17
- ])
18
18
  qnEdinetManifestInsert = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}insert")
19
19
  qnEdinetManifestInstance = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}instance")
20
20
  qnEdinetManifestItem = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}item")
@@ -22,3 +22,187 @@ qnEdinetManifestIxbrl = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest
22
22
  qnEdinetManifestList = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}list")
23
23
  qnEdinetManifestTitle = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}title")
24
24
  qnEdinetManifestTocComposition = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}tocComposition")
25
+ xhtmlDtdExtension = "xhtml1-strict-ix.dtd"
26
+
27
+ COVER_PAGE_FILENAME_PREFIX = "0000000_header_"
28
+
29
+ LC3_NAME_PATTERN = regex.compile(r"^[A-Z][^\][\(\)\*\+\?\/\^\{\}\|@#%^=~`\"';:,<>&$\u00a3\u20ac]*$") # u20ac=Euro, u00a3=pound sterling
30
+
31
+ PROHIBITED_HTML_ATTRIBUTES = frozenset({
32
+ 'onblur',
33
+ 'onchange',
34
+ 'onclick',
35
+ 'ondblclick',
36
+ 'onfocus',
37
+ 'onkeydown',
38
+ 'onkeypress',
39
+ 'onkeyup',
40
+ 'onload',
41
+ 'onmousedown',
42
+ 'onmousemove',
43
+ 'onmouseout',
44
+ 'onmouseover',
45
+ 'onmouseup',
46
+ 'onreset',
47
+ 'onselect',
48
+ 'onsubmit',
49
+ 'onunload',
50
+ })
51
+
52
+ PROHIBITED_HTML_TAGS = frozenset({
53
+ 'applet',
54
+ 'embed',
55
+ 'form',
56
+ 'frame',
57
+ 'frameset',
58
+ 'iframe',
59
+ 'input',
60
+ 'object',
61
+ 'plaintext',
62
+ 'pre',
63
+ 'script',
64
+ 'select',
65
+ 'textarea',
66
+ })
67
+
68
+ NUMERIC_LABEL_ROLES = frozenset({
69
+ 'http://www.xbrl.org/2003/role/positiveLabel',
70
+ 'http://www.xbrl.org/2003/role/positiveTerseLabel',
71
+ 'http://www.xbrl.org/2003/role/positiveVerboseLabel',
72
+ 'http://www.xbrl.org/2003/role/negativeLabel',
73
+ 'http://www.xbrl.org/2003/role/negativeTerseLabel',
74
+ 'http://www.xbrl.org/2003/role/negativeVerboseLabel',
75
+ 'http://www.xbrl.org/2003/role/zeroLabel',
76
+ 'http://www.xbrl.org/2003/role/zeroTerseLabel',
77
+ 'http://www.xbrl.org/2003/role/zeroVerboseLabel',
78
+ 'http://www.xbrl.org/2003/role/totalLabel',
79
+ 'http://www.xbrl.org/2009/role/negatedLabel',
80
+ 'http://www.xbrl.org/2009/role/negatedPeriodEndLabel',
81
+ 'http://www.xbrl.org/2009/role/negatedPeriodStartLabel',
82
+ 'http://www.xbrl.org/2009/role/negatedTotalLabel',
83
+ 'http://www.xbrl.org/2009/role/negatedNetLabel',
84
+ 'http://www.xbrl.org/2009/role/negatedTerseLabel',
85
+ })
86
+
87
+ PATTERN_CODE = r'(?P<code>[A-Za-z\d]+)'
88
+ PATTERN_CONSOLIDATED = r'(?P<consolidated>c|n)'
89
+ PATTERN_COUNT = r'(?P<count>\d{2})'
90
+ PATTERN_PERIOD_DATE = r'(?P<period_year>\d{4})-(?P<period_month>\d{2})-(?P<period_day>\d{2})'
91
+ PATTERN_SUBMISSION_DATE = r'(?P<submission_year>\d{4})-(?P<submission_month>\d{2})-(?P<submission_day>\d{2})'
92
+ PATTERN_FORM = r'(?P<form>\d{6})'
93
+ PATTERN_LINKBASE = r'(?P<linkbase>lab|lab-en|gla|pre|def|cal)'
94
+ PATTERN_MAIN = r'(?P<main>\d{7})'
95
+ PATTERN_NAME = r'(?P<name>[a-z]{6})'
96
+ PATTERN_ORDINANCE = r'(?P<ordinance>[a-z]+)'
97
+ PATTERN_PERIOD = r'(?P<period>c|p)' # TODO: Have only seen "c" in sample/public filings, assuming "p" for previous.
98
+ PATTERN_REPORT = r'(?P<report>[a-z]+)'
99
+ PATTERN_REPORT_SERIAL = r'(?P<report_serial>\d{3})'
100
+ PATTERN_SERIAL = r'(?P<serial>\d{3})'
101
+
102
+ PATTERN_AUDIT_REPORT_PREFIX = rf'jpaud-{PATTERN_REPORT}-{PATTERN_PERIOD}{PATTERN_CONSOLIDATED}'
103
+ PATTERN_REPORT_PREFIX = rf'jp{PATTERN_ORDINANCE}{PATTERN_FORM}-{PATTERN_REPORT}'
104
+ PATTERN_SUFFIX = rf'{PATTERN_REPORT_SERIAL}_{PATTERN_CODE}-{PATTERN_SERIAL}_{PATTERN_PERIOD_DATE}_{PATTERN_COUNT}_{PATTERN_SUBMISSION_DATE}'
105
+
106
+ PATTERN_URI_HOST = r'http:\/\/disclosure\.edinet-fsa\.go\.jp'
107
+
108
+ PATTERN_AUDIT_NAMESPACE_PREFIX = rf'jpaud\/{PATTERN_REPORT}\/{PATTERN_PERIOD}{PATTERN_CONSOLIDATED}'
109
+ PATTERN_REPORT_NAMESPACE_PREFIX = rf'jp{PATTERN_ORDINANCE}{PATTERN_FORM}\/{PATTERN_REPORT}'
110
+ PATTERN_NAMESPACE_SUFFIX = rf'{PATTERN_REPORT_SERIAL}\/{PATTERN_CODE}-{PATTERN_SERIAL}\/{PATTERN_PERIOD_DATE}\/{PATTERN_COUNT}\/{PATTERN_SUBMISSION_DATE}'
111
+
112
+ PATTERN_ELR_ID = rf'rol_(?P<root_element_name>[\w]+)(?:-(?P<modifier>[a-zA-Z0-9]+))?(?:-{PATTERN_COUNT})?'
113
+
114
+ # Extension role ID
115
+ # Example: http://disclosure.edinet-fsa.go.jp/role/jpcrp-esr/rol_CoverPage-Modifier-01
116
+ REPORT_ELR_ID_PATTERN = regex.compile(PATTERN_ELR_ID)
117
+
118
+ # Extension role URI
119
+ # Example: http://disclosure.edinet-fsa.go.jp/role/jpdei/rol_RootElementName
120
+ # Example: http://disclosure.edinet-fsa.go.jp/role/jpdei-qrr/rol_RootElementName-Modifier-01
121
+ REPORT_ELR_URI_PATTERN = regex.compile(rf'{PATTERN_URI_HOST}\/role\/jp{PATTERN_ORDINANCE}(?:-{PATTERN_REPORT})?\/{PATTERN_ELR_ID}')
122
+
123
+ # Extension namespace URI for report
124
+ # Example: http://disclosure.edinet-fsa.go.jp/jpcrp030000/asr/001/X99002-000/2025-03-31/01/2025-06-28
125
+ REPORT_NAMESPACE_PATTERN = regex.compile(rf'{PATTERN_URI_HOST}\/{PATTERN_REPORT_NAMESPACE_PREFIX}\/{PATTERN_NAMESPACE_SUFFIX}')
126
+
127
+ # Extension namespace URI for audit report
128
+ # Example: http://disclosure.edinet-fsa.go.jp/jpaud/aar/cn/001/X99002-000/2025-03-31/01/2025-06-28
129
+ AUDIT_NAMESPACE_PATTERN = regex.compile(rf'{PATTERN_URI_HOST}\/{PATTERN_AUDIT_NAMESPACE_PREFIX}\/{PATTERN_NAMESPACE_SUFFIX}')
130
+
131
+ # Extension namespace prefix for report
132
+ # Example: jpcrp040300-ssr_X99005-000
133
+ REPORT_PREFIX_PATTERN = regex.compile(rf'{PATTERN_REPORT_PREFIX}_{PATTERN_CODE}-{PATTERN_SERIAL}')
134
+
135
+ # Extension namespace prefix for audit report
136
+ # Example: jpaud-qrr-cn_X99005-000
137
+ AUDIT_PREFIX_PATTERN = regex.compile(rf'{PATTERN_AUDIT_REPORT_PREFIX}_{PATTERN_CODE}-{PATTERN_SERIAL}')
138
+
139
+ # Instance file for report
140
+ # Example: jpcrp050300-esr-001_X99007-000_2025-04-10_01_2025-04-10.xsd
141
+ REPORT_XBRL_FILENAME_PATTERN = regex.compile(rf'{PATTERN_REPORT_PREFIX}-{PATTERN_SUFFIX}\.xbrl')
142
+
143
+ # Instance file for audit report
144
+ # Example: jpaud-aar-cn-001_X99001-000_2025-03-31_01_2025-06-28.xsd
145
+ AUDIT_XBRL_FILENAME_PATTERN = regex.compile(rf'{PATTERN_AUDIT_REPORT_PREFIX}-{PATTERN_SUFFIX}\.xbrl')
146
+
147
+ # Schema file for report
148
+ # Example: jpcrp050300-esr-001_X99007-000_2025-04-10_01_2025-04-10.xsd
149
+ REPORT_SCHEMA_FILENAME_PATTERN = regex.compile(rf'{PATTERN_REPORT_PREFIX}-{PATTERN_SUFFIX}\.xsd')
150
+
151
+ # Schema file for audit report
152
+ # Example: jpaud-aar-cn-001_X99001-000_2025-03-31_01_2025-06-28.xsd
153
+ AUDIT_SCHEMA_FILENAME_PATTERN = regex.compile(rf'{PATTERN_AUDIT_REPORT_PREFIX}-{PATTERN_SUFFIX}\.xsd')
154
+
155
+ # Linkbase file for report
156
+ # Example: jpcrp020000-srs-001_X99001-000_2025-03-31_01_2025-11-20_cal.xml
157
+ REPORT_LINKBASE_FILENAME_PATTERN = regex.compile(rf'{PATTERN_REPORT_PREFIX}-{PATTERN_SUFFIX}_{PATTERN_LINKBASE}\.xml')
158
+
159
+ # Linkbase file for audit report
160
+ # Example: jpaud-qrr-cc-001_X99001-000_2025-03-31_01_2025-11-20_pre.xml
161
+ AUDIT_LINKBASE_FILENAME_PATTERN = regex.compile(rf'{PATTERN_AUDIT_REPORT_PREFIX}-{PATTERN_SUFFIX}_{PATTERN_LINKBASE}\.xml')
162
+
163
+ # Cover page file for report
164
+ # Example: 0000000_header_jpcrp020000-srs-001_X99001-000_2025-03-31_01_2025-11-20_ixbrl.htm
165
+ REPORT_COVER_FILENAME_PATTERN = regex.compile(rf'{COVER_PAGE_FILENAME_PREFIX}{PATTERN_REPORT_PREFIX}-{PATTERN_SUFFIX}_ixbrl\.htm')
166
+
167
+ # Main file for report
168
+ # Example: 0205020_honbun_jpcrp020000-srs-001_X99001-000_2025-03-31_01_2025-11-20_ixbrl.htm
169
+ REPORT_IXBRL_FILENAME_PATTERN = regex.compile(rf'{PATTERN_MAIN}_{PATTERN_NAME}_{PATTERN_REPORT_PREFIX}-{PATTERN_SUFFIX}_ixbrl\.htm')
170
+
171
+ # Main file for audit report
172
+ # Example: jpaud-qrr-cc-001_X99001-000_2025-03-31_01_2025-11-20_pre.xml
173
+ AUDIT_IXBRL_FILENAME_PATTERN = regex.compile(rf'{PATTERN_AUDIT_REPORT_PREFIX}-{PATTERN_SUFFIX}_ixbrl\.htm')
174
+
175
+ PATTERN_CONTEXT_RELATIVE_PERIOD = r'(?P<relative_period>Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)'
176
+ PATTERN_CONTEXT_PERIOD = r'(?P<relative_period>Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Prior[1-9]Quarter|Prior[1-9]YTD|Interim|FilingDate|RecordDate|CurrentQuarter|CurrentYTD)'
177
+ PATTERN_CONTEXT_DURATION = r'(?P<duration>Duration|Instant)'
178
+ PATTERN_CONTEXT_MEMBERS = r'(?P<context_members>(?:_[a-zA-Z][a-zA-Z0-9-]+)+)*'
179
+ PATTERN_CONTEXT_NUMBER = r'(?P<context_number>[0-9]{3})'
180
+
181
+ # All context IDs
182
+ # Example: Prior2YearDuration_jpcrp020000-srs_X99001-000IndustrialMachineryReportableSegmentMember
183
+ CONTEXT_ID_PATTERN = regex.compile(rf'{PATTERN_CONTEXT_PERIOD}{PATTERN_CONTEXT_DURATION}{PATTERN_CONTEXT_MEMBERS}(?:_{PATTERN_CONTEXT_NUMBER})?')
184
+
185
+ # Context IDs for facts associated with Financial Statements
186
+ # Example: Prior2YearDuration
187
+ FINANCIAL_STATEMENT_CONTEXT_ID_PATTERN = regex.compile(rf'^{PATTERN_CONTEXT_RELATIVE_PERIOD}{PATTERN_CONTEXT_DURATION}.*')
188
+
189
+ # Context IDs for facts associated with individual (non-consolidated) Financial Statements
190
+ # Example: Prior2YearDuration_NonConsolidatedMember
191
+ INDIVIDUAL_CONTEXT_ID_PATTERN = regex.compile(rf'^{PATTERN_CONTEXT_RELATIVE_PERIOD}{PATTERN_CONTEXT_DURATION}_NonConsolidatedMember.*')
192
+
193
+ # Accepted language codes for Japan
194
+ JAPAN_LANGUAGE_CODES = frozenset({'ja', 'jp', 'ja-jp', 'JA', 'JP', 'JA-JP'})
195
+
196
+ # Half Kana characters taken from JACONV library
197
+ # We define it here because the JACONV library does not allow the constant to be imported
198
+ HALF_KANA = frozenset({'ァ', 'ア', 'ィ', 'イ', 'ゥ', 'ウ', 'ェ', 'エ', 'ォ', 'オ',
199
+ 'カ', 'ガ', 'キ', 'ギ', 'ク', 'グ', 'ケ', 'ゲ', 'コ',
200
+ 'ゴ', 'サ', 'ザ', 'シ', 'ジ', 'ス', 'ズ', 'セ', 'ゼ',
201
+ 'ソ', 'ゾ', 'タ', 'ダ', 'チ', 'ヂ', 'ッ', 'ツ', 'ヅ',
202
+ 'テ', 'デ', 'ト', 'ド', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ',
203
+ 'バ', 'パ', 'ヒ', 'ビ', 'ピ', 'フ', 'ブ', 'プ', 'ヘ',
204
+ 'ベ', 'ペ', 'ホ', 'ボ', 'ポ', 'マ', 'ミ', 'ム', 'メ',
205
+ 'モ', 'ャ', 'ヤ', 'ュ', 'ユ', 'ョ', 'ヨ', 'ラ', 'リ', 'ル',
206
+ 'レ', 'ロ', 'ワ', 'ヲ', 'ン', 'ー',
207
+ 'ヮ', 'ヰ', 'ヱ', 'ヵ', 'ヶ', 'ヴ', 'ヽ', 'ヾ', '・',
208
+ '「', '」', '。', '、'})