snappy 3.0.3__cp38-cp38-macosx_11_0_arm64.whl → 3.2__cp38-cp38-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. snappy/CyOpenGL.cpython-38-darwin.so +0 -0
  2. snappy/SnapPy.cpython-38-darwin.so +0 -0
  3. snappy/SnapPyHP.cpython-38-darwin.so +0 -0
  4. snappy/__init__.py +373 -426
  5. snappy/app.py +240 -75
  6. snappy/app_menus.py +93 -78
  7. snappy/browser.py +87 -63
  8. snappy/cache.py +5 -8
  9. snappy/canonical.py +249 -0
  10. snappy/{verify/cusp_shapes.py → cusps/__init__.py} +11 -19
  11. snappy/cusps/cusp_area_matrix.py +101 -0
  12. snappy/{verify/cusp_areas.py → cusps/cusp_areas_from_matrix.py} +39 -54
  13. snappy/cusps/maximal_cusp_area_matrix.py +136 -0
  14. snappy/cusps/test.py +21 -0
  15. snappy/cusps/trig_cusp_area_matrix.py +63 -0
  16. snappy/database.py +40 -31
  17. snappy/db_utilities.py +13 -14
  18. snappy/decorated_isosig.py +377 -133
  19. snappy/dev/extended_ptolemy/complexVolumesClosed.py +42 -9
  20. snappy/dev/extended_ptolemy/extended.py +32 -25
  21. snappy/dev/extended_ptolemy/giac_rur.py +23 -8
  22. snappy/dev/extended_ptolemy/phc_wrapper.py +10 -10
  23. snappy/dev/vericlosed/computeApproxHyperbolicStructureOrb.py +2 -1
  24. snappy/dev/vericlosed/gimbalLoopFinder.py +5 -5
  25. snappy/dev/vericlosed/hyperbolicStructure.py +3 -3
  26. snappy/dev/vericlosed/oneVertexTruncatedComplex.py +2 -2
  27. snappy/dev/vericlosed/truncatedComplex.py +3 -2
  28. snappy/dev/vericlosed/verifyHyperbolicStructureEngine.py +4 -3
  29. snappy/doc/_images/geodesics.jpg +0 -0
  30. snappy/doc/_images/m004_paper_plane_on_systole.jpg +0 -0
  31. snappy/doc/_images/m125_paper_plane.jpg +0 -0
  32. snappy/doc/_images/o9_00000_systole_paper_plane.jpg +0 -0
  33. snappy/doc/_images/o9_00000_systole_paper_plane_closer.jpg +0 -0
  34. snappy/doc/_sources/additional_classes.rst.txt +1 -0
  35. snappy/doc/_sources/credits.rst.txt +6 -1
  36. snappy/doc/_sources/development.rst.txt +69 -50
  37. snappy/doc/_sources/index.rst.txt +101 -66
  38. snappy/doc/_sources/installing.rst.txt +148 -165
  39. snappy/doc/_sources/news.rst.txt +136 -32
  40. snappy/doc/_sources/ptolemy.rst.txt +1 -1
  41. snappy/doc/_sources/ptolemy_examples1.rst.txt +9 -8
  42. snappy/doc/_sources/ptolemy_examples2.rst.txt +3 -3
  43. snappy/doc/_sources/ptolemy_examples3.rst.txt +14 -14
  44. snappy/doc/_sources/ptolemy_prelim.rst.txt +1 -1
  45. snappy/doc/_sources/snap.rst.txt +2 -2
  46. snappy/doc/_sources/snappy.rst.txt +1 -1
  47. snappy/doc/_sources/triangulation.rst.txt +3 -2
  48. snappy/doc/_sources/verify.rst.txt +89 -29
  49. snappy/doc/_sources/verify_internals.rst.txt +5 -16
  50. snappy/doc/_static/SnapPy-horizontal-128.png +0 -0
  51. snappy/doc/_static/SnapPy.ico +0 -0
  52. snappy/doc/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  53. snappy/doc/_static/basic.css +47 -27
  54. snappy/doc/_static/css/badge_only.css +1 -0
  55. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  56. snappy/doc/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  57. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  58. snappy/doc/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  59. snappy/doc/_static/css/fonts/fontawesome-webfont.eot +0 -0
  60. snappy/doc/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  61. snappy/doc/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  62. snappy/doc/_static/css/fonts/fontawesome-webfont.woff +0 -0
  63. snappy/doc/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  64. snappy/doc/_static/css/fonts/lato-bold-italic.woff +0 -0
  65. snappy/doc/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  66. snappy/doc/_static/css/fonts/lato-bold.woff +0 -0
  67. snappy/doc/_static/css/fonts/lato-bold.woff2 +0 -0
  68. snappy/doc/_static/css/fonts/lato-normal-italic.woff +0 -0
  69. snappy/doc/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  70. snappy/doc/_static/css/fonts/lato-normal.woff +0 -0
  71. snappy/doc/_static/css/fonts/lato-normal.woff2 +0 -0
  72. snappy/doc/_static/css/theme.css +4 -0
  73. snappy/doc/_static/doctools.js +107 -274
  74. snappy/doc/_static/documentation_options.js +6 -5
  75. snappy/doc/_static/fonts/Lato/lato-bold.eot +0 -0
  76. snappy/doc/_static/fonts/Lato/lato-bold.ttf +0 -0
  77. snappy/doc/_static/fonts/Lato/lato-bold.woff +0 -0
  78. snappy/doc/_static/fonts/Lato/lato-bold.woff2 +0 -0
  79. snappy/doc/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  80. snappy/doc/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  81. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  82. snappy/doc/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  83. snappy/doc/_static/fonts/Lato/lato-italic.eot +0 -0
  84. snappy/doc/_static/fonts/Lato/lato-italic.ttf +0 -0
  85. snappy/doc/_static/fonts/Lato/lato-italic.woff +0 -0
  86. snappy/doc/_static/fonts/Lato/lato-italic.woff2 +0 -0
  87. snappy/doc/_static/fonts/Lato/lato-regular.eot +0 -0
  88. snappy/doc/_static/fonts/Lato/lato-regular.ttf +0 -0
  89. snappy/doc/_static/fonts/Lato/lato-regular.woff +0 -0
  90. snappy/doc/_static/fonts/Lato/lato-regular.woff2 +0 -0
  91. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  92. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  93. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  94. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  95. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  96. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  97. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  98. snappy/doc/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  99. snappy/doc/_static/jquery.js +2 -2
  100. snappy/doc/_static/js/badge_only.js +1 -0
  101. snappy/doc/_static/js/theme.js +1 -0
  102. snappy/doc/_static/js/versions.js +228 -0
  103. snappy/doc/_static/language_data.js +3 -101
  104. snappy/doc/_static/pygments.css +1 -0
  105. snappy/doc/_static/searchtools.js +489 -398
  106. snappy/doc/_static/snappy_furo.css +33 -0
  107. snappy/doc/_static/snappy_sphinx_rtd_theme.css +42 -0
  108. snappy/doc/_static/sphinx_highlight.js +154 -0
  109. snappy/doc/additional_classes.html +688 -263
  110. snappy/doc/bugs.html +107 -94
  111. snappy/doc/censuses.html +155 -127
  112. snappy/doc/credits.html +115 -104
  113. snappy/doc/development.html +184 -146
  114. snappy/doc/genindex.html +287 -204
  115. snappy/doc/index.html +189 -150
  116. snappy/doc/installing.html +259 -266
  117. snappy/doc/manifold.html +1626 -592
  118. snappy/doc/manifoldhp.html +119 -105
  119. snappy/doc/news.html +198 -104
  120. snappy/doc/objects.inv +0 -0
  121. snappy/doc/other.html +117 -105
  122. snappy/doc/platonic_census.html +161 -114
  123. snappy/doc/plink.html +113 -105
  124. snappy/doc/ptolemy.html +131 -108
  125. snappy/doc/ptolemy_classes.html +242 -223
  126. snappy/doc/ptolemy_examples1.html +144 -130
  127. snappy/doc/ptolemy_examples2.html +141 -129
  128. snappy/doc/ptolemy_examples3.html +148 -132
  129. snappy/doc/ptolemy_examples4.html +131 -111
  130. snappy/doc/ptolemy_prelim.html +162 -138
  131. snappy/doc/py-modindex.html +104 -69
  132. snappy/doc/screenshots.html +117 -108
  133. snappy/doc/search.html +115 -84
  134. snappy/doc/searchindex.js +1 -1
  135. snappy/doc/snap.html +109 -96
  136. snappy/doc/snappy.html +134 -97
  137. snappy/doc/spherogram.html +259 -187
  138. snappy/doc/todo.html +107 -94
  139. snappy/doc/triangulation.html +1380 -111
  140. snappy/doc/tutorial.html +107 -94
  141. snappy/doc/verify.html +194 -125
  142. snappy/doc/verify_internals.html +248 -686
  143. snappy/drilling/__init__.py +456 -0
  144. snappy/drilling/barycentric.py +103 -0
  145. snappy/drilling/constants.py +5 -0
  146. snappy/drilling/crush.py +270 -0
  147. snappy/drilling/cusps.py +125 -0
  148. snappy/drilling/debug.py +242 -0
  149. snappy/drilling/epsilons.py +6 -0
  150. snappy/drilling/exceptions.py +55 -0
  151. snappy/drilling/moves.py +620 -0
  152. snappy/drilling/peripheral_curves.py +210 -0
  153. snappy/drilling/perturb.py +188 -0
  154. snappy/drilling/shorten.py +36 -0
  155. snappy/drilling/subdivide.py +274 -0
  156. snappy/drilling/test.py +23 -0
  157. snappy/drilling/test_cases.py +126 -0
  158. snappy/drilling/tracing.py +351 -0
  159. snappy/exceptions.py +23 -3
  160. snappy/export_stl.py +20 -14
  161. snappy/exterior_to_link/__init__.py +2 -0
  162. snappy/exterior_to_link/barycentric_geometry.py +463 -0
  163. snappy/exterior_to_link/exceptions.py +6 -0
  164. snappy/exterior_to_link/geodesic_map.json +14408 -0
  165. snappy/exterior_to_link/hyp_utils.py +112 -0
  166. snappy/exterior_to_link/link_projection.py +323 -0
  167. snappy/exterior_to_link/main.py +197 -0
  168. snappy/exterior_to_link/mcomplex_with_expansion.py +261 -0
  169. snappy/exterior_to_link/mcomplex_with_link.py +687 -0
  170. snappy/exterior_to_link/mcomplex_with_memory.py +162 -0
  171. snappy/exterior_to_link/pl_utils.py +491 -0
  172. snappy/exterior_to_link/put_in_S3.py +156 -0
  173. snappy/exterior_to_link/rational_linear_algebra.py +123 -0
  174. snappy/exterior_to_link/rational_linear_algebra_wrapped.py +135 -0
  175. snappy/exterior_to_link/simplify_to_base_tri.py +114 -0
  176. snappy/exterior_to_link/stored_moves.py +475 -0
  177. snappy/exterior_to_link/test.py +31 -0
  178. snappy/geometric_structure/__init__.py +212 -0
  179. snappy/geometric_structure/cusp_neighborhood/__init__.py +3 -0
  180. snappy/geometric_structure/cusp_neighborhood/complex_cusp_cross_section.py +697 -0
  181. snappy/geometric_structure/cusp_neighborhood/cusp_cross_section_base.py +484 -0
  182. snappy/geometric_structure/cusp_neighborhood/exceptions.py +42 -0
  183. snappy/geometric_structure/cusp_neighborhood/real_cusp_cross_section.py +298 -0
  184. snappy/geometric_structure/cusp_neighborhood/tiles_for_cusp_neighborhood.py +159 -0
  185. snappy/geometric_structure/cusp_neighborhood/vertices.py +32 -0
  186. snappy/geometric_structure/geodesic/__init__.py +0 -0
  187. snappy/geometric_structure/geodesic/add_core_curves.py +152 -0
  188. snappy/geometric_structure/geodesic/avoid_core_curves.py +369 -0
  189. snappy/geometric_structure/geodesic/canonical_keys.py +52 -0
  190. snappy/geometric_structure/geodesic/check_away_from_core_curve.py +60 -0
  191. snappy/geometric_structure/geodesic/constants.py +6 -0
  192. snappy/geometric_structure/geodesic/exceptions.py +22 -0
  193. snappy/geometric_structure/geodesic/fixed_points.py +93 -0
  194. snappy/geometric_structure/geodesic/geodesic_start_point_info.py +435 -0
  195. snappy/geometric_structure/geodesic/graph_trace_helper.py +67 -0
  196. snappy/geometric_structure/geodesic/line.py +30 -0
  197. snappy/geometric_structure/geodesic/multiplicity.py +127 -0
  198. snappy/geometric_structure/geodesic/tiles_for_geodesic.py +101 -0
  199. snappy/geometric_structure/test.py +22 -0
  200. snappy/gui.py +36 -36
  201. snappy/horoviewer.py +50 -48
  202. snappy/hyperboloid/__init__.py +212 -0
  203. snappy/hyperboloid/distances.py +245 -0
  204. snappy/hyperboloid/horoball.py +19 -0
  205. snappy/hyperboloid/line.py +35 -0
  206. snappy/hyperboloid/point.py +9 -0
  207. snappy/hyperboloid/triangle.py +29 -0
  208. snappy/{infodialog.py → infowindow.py} +32 -33
  209. snappy/isometry_signature.py +382 -0
  210. snappy/len_spec/__init__.py +596 -0
  211. snappy/len_spec/geodesic_info.py +110 -0
  212. snappy/len_spec/geodesic_key_info_dict.py +117 -0
  213. snappy/len_spec/geodesic_piece.py +143 -0
  214. snappy/len_spec/geometric_structure.py +182 -0
  215. snappy/len_spec/geometry.py +80 -0
  216. snappy/len_spec/length_spectrum_geodesic_info.py +170 -0
  217. snappy/len_spec/spine.py +206 -0
  218. snappy/len_spec/test.py +24 -0
  219. snappy/len_spec/test_cases.py +69 -0
  220. snappy/len_spec/tile.py +275 -0
  221. snappy/len_spec/word.py +86 -0
  222. snappy/manifolds/__init__.py +1 -1
  223. snappy/math_basics.py +176 -0
  224. snappy/matrix.py +525 -0
  225. snappy/number.py +97 -21
  226. snappy/numeric_output_checker.py +37 -27
  227. snappy/pari.py +30 -69
  228. snappy/phone_home.py +25 -20
  229. snappy/polyviewer.py +39 -37
  230. snappy/ptolemy/__init__.py +4 -6
  231. snappy/ptolemy/component.py +14 -12
  232. snappy/ptolemy/coordinates.py +312 -295
  233. snappy/ptolemy/fieldExtensions.py +14 -12
  234. snappy/ptolemy/findLoops.py +43 -31
  235. snappy/ptolemy/geometricRep.py +24 -26
  236. snappy/ptolemy/homology.py +12 -7
  237. snappy/ptolemy/manifoldMethods.py +69 -70
  238. snappy/ptolemy/matrix.py +65 -26
  239. snappy/ptolemy/numericalSolutionsToGroebnerBasis.py +18 -14
  240. snappy/ptolemy/polynomial.py +125 -119
  241. snappy/ptolemy/processComponents.py +36 -30
  242. snappy/ptolemy/processFileBase.py +79 -18
  243. snappy/ptolemy/processFileDispatch.py +13 -14
  244. snappy/ptolemy/processMagmaFile.py +44 -39
  245. snappy/ptolemy/processRurFile.py +18 -11
  246. snappy/ptolemy/ptolemyGeneralizedObstructionClass.py +20 -17
  247. snappy/ptolemy/ptolemyObstructionClass.py +13 -17
  248. snappy/ptolemy/ptolemyVariety.py +190 -121
  249. snappy/ptolemy/ptolemyVarietyPrimeIdealGroebnerBasis.py +20 -19
  250. snappy/ptolemy/reginaWrapper.py +25 -29
  251. snappy/ptolemy/rur.py +6 -14
  252. snappy/ptolemy/solutionsToPrimeIdealGroebnerBasis.py +27 -22
  253. snappy/ptolemy/test.py +247 -188
  254. snappy/ptolemy/utilities.py +41 -43
  255. snappy/raytracing/__init__.py +64 -0
  256. snappy/raytracing/additional_horospheres.py +64 -0
  257. snappy/raytracing/additional_len_spec_choices.py +63 -0
  258. snappy/raytracing/cohomology_fractal.py +10 -6
  259. snappy/raytracing/eyeball.py +123 -0
  260. snappy/raytracing/finite_raytracing_data.py +48 -38
  261. snappy/raytracing/finite_viewer.py +218 -210
  262. snappy/raytracing/geodesic_tube_info.py +174 -0
  263. snappy/raytracing/geodesics.py +246 -0
  264. snappy/raytracing/geodesics_window.py +258 -0
  265. snappy/raytracing/gui_utilities.py +152 -40
  266. snappy/raytracing/hyperboloid_navigation.py +102 -52
  267. snappy/raytracing/hyperboloid_utilities.py +114 -261
  268. snappy/raytracing/ideal_raytracing_data.py +256 -179
  269. snappy/raytracing/inside_viewer.py +522 -253
  270. snappy/raytracing/pack.py +22 -0
  271. snappy/raytracing/raytracing_data.py +46 -34
  272. snappy/raytracing/raytracing_view.py +190 -109
  273. snappy/raytracing/shaders/Eye.png +0 -0
  274. snappy/raytracing/shaders/NonGeometric.png +0 -0
  275. snappy/raytracing/shaders/__init__.py +60 -4
  276. snappy/raytracing/shaders/fragment.glsl +575 -148
  277. snappy/raytracing/test.py +29 -0
  278. snappy/raytracing/tooltip.py +146 -0
  279. snappy/raytracing/upper_halfspace_utilities.py +98 -0
  280. snappy/raytracing/view_scale_controller.py +98 -0
  281. snappy/raytracing/zoom_slider/__init__.py +32 -29
  282. snappy/raytracing/zoom_slider/test.py +2 -0
  283. snappy/sage_helper.py +69 -123
  284. snappy/{preferences.py → settings.py} +167 -145
  285. snappy/shell.py +4 -0
  286. snappy/snap/__init__.py +12 -8
  287. snappy/snap/character_varieties.py +24 -18
  288. snappy/snap/find_field.py +35 -34
  289. snappy/snap/fundamental_polyhedron.py +99 -85
  290. snappy/snap/generators.py +6 -8
  291. snappy/snap/interval_reps.py +18 -6
  292. snappy/snap/kernel_structures.py +8 -3
  293. snappy/snap/mcomplex_base.py +1 -2
  294. snappy/snap/nsagetools.py +107 -53
  295. snappy/snap/peripheral/__init__.py +1 -1
  296. snappy/snap/peripheral/dual_cellulation.py +15 -7
  297. snappy/snap/peripheral/link.py +20 -16
  298. snappy/snap/peripheral/peripheral.py +22 -14
  299. snappy/snap/peripheral/surface.py +47 -50
  300. snappy/snap/peripheral/test.py +8 -8
  301. snappy/snap/polished_reps.py +65 -40
  302. snappy/snap/shapes.py +41 -22
  303. snappy/snap/slice_obs_HKL.py +64 -25
  304. snappy/snap/t3mlite/arrow.py +88 -51
  305. snappy/snap/t3mlite/corner.py +5 -6
  306. snappy/snap/t3mlite/edge.py +32 -21
  307. snappy/snap/t3mlite/face.py +7 -9
  308. snappy/snap/t3mlite/files.py +31 -23
  309. snappy/snap/t3mlite/homology.py +14 -10
  310. snappy/snap/t3mlite/linalg.py +158 -56
  311. snappy/snap/t3mlite/mcomplex.py +739 -291
  312. snappy/snap/t3mlite/perm4.py +236 -84
  313. snappy/snap/t3mlite/setup.py +9 -10
  314. snappy/snap/t3mlite/simplex.py +65 -48
  315. snappy/snap/t3mlite/spun.py +42 -30
  316. snappy/snap/t3mlite/surface.py +45 -45
  317. snappy/snap/t3mlite/test.py +3 -0
  318. snappy/snap/t3mlite/test_vs_regina.py +17 -13
  319. snappy/snap/t3mlite/tetrahedron.py +25 -24
  320. snappy/snap/t3mlite/vertex.py +8 -13
  321. snappy/snap/test.py +45 -52
  322. snappy/snap/utilities.py +66 -65
  323. snappy/test.py +155 -158
  324. snappy/test_cases.py +263 -0
  325. snappy/testing.py +131 -0
  326. snappy/tiling/__init__.py +2 -0
  327. snappy/tiling/canonical_key_dict.py +59 -0
  328. snappy/tiling/dict_based_set.py +79 -0
  329. snappy/tiling/floor.py +49 -0
  330. snappy/tiling/hyperboloid_dict.py +54 -0
  331. snappy/tiling/iter_utils.py +78 -0
  332. snappy/tiling/lifted_tetrahedron.py +22 -0
  333. snappy/tiling/lifted_tetrahedron_set.py +54 -0
  334. snappy/tiling/real_hash_dict.py +164 -0
  335. snappy/tiling/test.py +23 -0
  336. snappy/tiling/tile.py +215 -0
  337. snappy/tiling/triangle.py +33 -0
  338. snappy/tkterminal.py +313 -203
  339. snappy/twister/main.py +1 -8
  340. snappy/twister/twister_core.cpython-38-darwin.so +0 -0
  341. snappy/upper_halfspace/__init__.py +146 -0
  342. snappy/upper_halfspace/ideal_point.py +26 -0
  343. snappy/verify/__init__.py +4 -8
  344. snappy/verify/{verifyCanonical.py → canonical.py} +114 -97
  345. snappy/verify/complex_volume/__init__.py +3 -2
  346. snappy/verify/complex_volume/adjust_torsion.py +13 -11
  347. snappy/verify/complex_volume/closed.py +29 -24
  348. snappy/verify/complex_volume/compute_ptolemys.py +8 -6
  349. snappy/verify/complex_volume/cusped.py +10 -9
  350. snappy/verify/complex_volume/extended_bloch.py +14 -12
  351. snappy/verify/{cuspTranslations.py → cusp_translations.py} +15 -14
  352. snappy/verify/edge_equations.py +80 -0
  353. snappy/verify/exceptions.py +23 -56
  354. snappy/verify/{verifyHyperbolicity.py → hyperbolicity.py} +19 -15
  355. snappy/verify/interval_newton_shapes_engine.py +51 -211
  356. snappy/verify/interval_tree.py +27 -25
  357. snappy/verify/krawczyk_shapes_engine.py +47 -50
  358. snappy/verify/maximal_cusp_area_matrix/__init__.py +17 -86
  359. snappy/verify/maximal_cusp_area_matrix/cusp_tiling_engine.py +58 -48
  360. snappy/verify/maximal_cusp_area_matrix/cusp_translate_engine.py +53 -57
  361. snappy/verify/{realAlgebra.py → real_algebra.py} +26 -20
  362. snappy/verify/shapes.py +10 -7
  363. snappy/verify/short_slopes.py +41 -42
  364. snappy/verify/{squareExtensions.py → square_extensions.py} +96 -92
  365. snappy/verify/test.py +59 -57
  366. snappy/verify/upper_halfspace/extended_matrix.py +5 -5
  367. snappy/verify/upper_halfspace/finite_point.py +44 -31
  368. snappy/verify/upper_halfspace/ideal_point.py +69 -57
  369. snappy/verify/volume.py +15 -12
  370. snappy/version.py +2 -3
  371. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/METADATA +14 -12
  372. snappy-3.2.dist-info/RECORD +503 -0
  373. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/WHEEL +1 -1
  374. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/entry_points.txt +0 -1
  375. {snappy-3.0.3.dist-info → snappy-3.2.dist-info}/top_level.txt +10 -1
  376. snappy/doc/_sources/verify_canon.rst.txt +0 -90
  377. snappy/doc/_static/classic.css +0 -266
  378. snappy/doc/_static/jquery-3.5.1.js +0 -10872
  379. snappy/doc/_static/sidebar.js +0 -159
  380. snappy/doc/_static/underscore-1.13.1.js +0 -2042
  381. snappy/doc/_static/underscore.js +0 -6
  382. snappy/doc/verify_canon.html +0 -283
  383. snappy/ppm_to_png.py +0 -243
  384. snappy/togl/__init__.py +0 -3
  385. snappy/togl/darwin-tk8.6/Togl2.1/LICENSE +0 -28
  386. snappy/togl/darwin-tk8.6/Togl2.1/libTogl2.1.dylib +0 -0
  387. snappy/togl/darwin-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  388. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  389. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/libTogl2.1.so +0 -0
  390. snappy/togl/linux2-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -5
  391. snappy/togl/win32VC-tk8.6/Togl2.1/LICENSE +0 -28
  392. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.dll +0 -0
  393. snappy/togl/win32VC-tk8.6/Togl2.1/Togl21.lib +0 -0
  394. snappy/togl/win32VC-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  395. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/LICENSE +0 -28
  396. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.dll +0 -0
  397. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/Togl21.lib +0 -0
  398. snappy/togl/win32VC-x86_64-tk8.6/Togl2.1/pkgIndex.tcl +0 -6
  399. snappy/verify/cuspCrossSection.py +0 -1413
  400. snappy/verify/mathHelpers.py +0 -64
  401. snappy-3.0.3.dist-info/RECORD +0 -360
@@ -4,22 +4,24 @@
4
4
  *
5
5
  * Sphinx JavaScript utilities for the full-text search.
6
6
  *
7
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
7
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
8
8
  * :license: BSD, see LICENSE for details.
9
9
  *
10
10
  */
11
+ "use strict";
11
12
 
12
- if (!Scorer) {
13
- /**
14
- * Simple result scoring code.
15
- */
13
+ /**
14
+ * Simple result scoring code.
15
+ */
16
+ if (typeof Scorer === "undefined") {
16
17
  var Scorer = {
17
18
  // Implement the following function to further tweak the score for each result
18
- // The function takes a result array [filename, title, anchor, descr, score]
19
+ // The function takes a result array [docname, title, anchor, descr, score, filename]
19
20
  // and returns the new score.
20
21
  /*
21
- score: function(result) {
22
- return result[4];
22
+ score: result => {
23
+ const [docname, title, anchor, descr, score, filename] = result
24
+ return score
23
25
  },
24
26
  */
25
27
 
@@ -28,9 +30,11 @@ if (!Scorer) {
28
30
  // or matches in the last dotted part of the object name
29
31
  objPartialMatch: 6,
30
32
  // Additive scores depending on the priority of the object
31
- objPrio: {0: 15, // used to be importantResults
32
- 1: 5, // used to be objectResults
33
- 2: -5}, // used to be unimportantResults
33
+ objPrio: {
34
+ 0: 15, // used to be importantResults
35
+ 1: 5, // used to be objectResults
36
+ 2: -5, // used to be unimportantResults
37
+ },
34
38
  // Used when the priority is not in the mapping.
35
39
  objPrioDefault: 0,
36
40
 
@@ -39,456 +43,549 @@ if (!Scorer) {
39
43
  partialTitle: 7,
40
44
  // query found in terms
41
45
  term: 5,
42
- partialTerm: 2
46
+ partialTerm: 2,
43
47
  };
44
48
  }
45
49
 
46
- if (!splitQuery) {
47
- function splitQuery(query) {
48
- return query.split(/\s+/);
50
+ const _removeChildren = (element) => {
51
+ while (element && element.lastChild) element.removeChild(element.lastChild);
52
+ };
53
+
54
+ /**
55
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
56
+ */
57
+ const _escapeRegExp = (string) =>
58
+ string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
59
+
60
+ const _displayItem = (item, searchTerms, highlightTerms) => {
61
+ const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
62
+ const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
63
+ const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
64
+ const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
65
+ const contentRoot = document.documentElement.dataset.content_root;
66
+
67
+ const [docName, title, anchor, descr, score, _filename] = item;
68
+
69
+ let listItem = document.createElement("li");
70
+ let requestUrl;
71
+ let linkUrl;
72
+ if (docBuilder === "dirhtml") {
73
+ // dirhtml builder
74
+ let dirname = docName + "/";
75
+ if (dirname.match(/\/index\/$/))
76
+ dirname = dirname.substring(0, dirname.length - 6);
77
+ else if (dirname === "index/") dirname = "";
78
+ requestUrl = contentRoot + dirname;
79
+ linkUrl = requestUrl;
80
+ } else {
81
+ // normal html builders
82
+ requestUrl = contentRoot + docName + docFileSuffix;
83
+ linkUrl = docName + docLinkSuffix;
84
+ }
85
+ let linkEl = listItem.appendChild(document.createElement("a"));
86
+ linkEl.href = linkUrl + anchor;
87
+ linkEl.dataset.score = score;
88
+ linkEl.innerHTML = title;
89
+ if (descr) {
90
+ listItem.appendChild(document.createElement("span")).innerHTML =
91
+ " (" + descr + ")";
92
+ // highlight search terms in the description
93
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
94
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
49
95
  }
96
+ else if (showSearchSummary)
97
+ fetch(requestUrl)
98
+ .then((responseData) => responseData.text())
99
+ .then((data) => {
100
+ if (data)
101
+ listItem.appendChild(
102
+ Search.makeSearchSummary(data, searchTerms, anchor)
103
+ );
104
+ // highlight search terms in the summary
105
+ if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
106
+ highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
107
+ });
108
+ Search.output.appendChild(listItem);
109
+ };
110
+ const _finishSearch = (resultCount) => {
111
+ Search.stopPulse();
112
+ Search.title.innerText = _("Search Results");
113
+ if (!resultCount)
114
+ Search.status.innerText = Documentation.gettext(
115
+ "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
116
+ );
117
+ else
118
+ Search.status.innerText = _(
119
+ "Search finished, found ${resultCount} page(s) matching the search query."
120
+ ).replace('${resultCount}', resultCount);
121
+ };
122
+ const _displayNextItem = (
123
+ results,
124
+ resultCount,
125
+ searchTerms,
126
+ highlightTerms,
127
+ ) => {
128
+ // results left, load the summary and display it
129
+ // this is intended to be dynamic (don't sub resultsCount)
130
+ if (results.length) {
131
+ _displayItem(results.pop(), searchTerms, highlightTerms);
132
+ setTimeout(
133
+ () => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
134
+ 5
135
+ );
136
+ }
137
+ // search finished, update title and status message
138
+ else _finishSearch(resultCount);
139
+ };
140
+ // Helper function used by query() to order search results.
141
+ // Each input is an array of [docname, title, anchor, descr, score, filename].
142
+ // Order the results by score (in opposite order of appearance, since the
143
+ // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
144
+ const _orderResultsByScoreThenName = (a, b) => {
145
+ const leftScore = a[4];
146
+ const rightScore = b[4];
147
+ if (leftScore === rightScore) {
148
+ // same score: sort alphabetically
149
+ const leftTitle = a[1].toLowerCase();
150
+ const rightTitle = b[1].toLowerCase();
151
+ if (leftTitle === rightTitle) return 0;
152
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
153
+ }
154
+ return leftScore > rightScore ? 1 : -1;
155
+ };
156
+
157
+ /**
158
+ * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
159
+ * custom function per language.
160
+ *
161
+ * The regular expression works by splitting the string on consecutive characters
162
+ * that are not Unicode letters, numbers, underscores, or emoji characters.
163
+ * This is the same as ``\W+`` in Python, preserving the surrogate pair area.
164
+ */
165
+ if (typeof splitQuery === "undefined") {
166
+ var splitQuery = (query) => query
167
+ .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
168
+ .filter(term => term) // remove remaining empty strings
50
169
  }
51
170
 
52
171
  /**
53
172
  * Search Module
54
173
  */
55
- var Search = {
56
-
57
- _index : null,
58
- _queued_query : null,
59
- _pulse_status : -1,
60
-
61
- htmlToText : function(htmlString) {
62
- var virtualDocument = document.implementation.createHTMLDocument('virtual');
63
- var htmlElement = $(htmlString, virtualDocument);
64
- htmlElement.find('.headerlink').remove();
65
- docContent = htmlElement.find('[role=main]')[0];
66
- if(docContent === undefined) {
67
- console.warn("Content block not found. Sphinx search tries to obtain it " +
68
- "via '[role=main]'. Could you check your theme or template.");
69
- return "";
70
- }
71
- return docContent.textContent || docContent.innerText;
72
- },
174
+ const Search = {
175
+ _index: null,
176
+ _queued_query: null,
177
+ _pulse_status: -1,
178
+
179
+ htmlToText: (htmlString, anchor) => {
180
+ const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
181
+ for (const removalQuery of [".headerlink", "script", "style"]) {
182
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
183
+ }
184
+ if (anchor) {
185
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
186
+ if (anchorContent) return anchorContent.textContent;
73
187
 
74
- init : function() {
75
- var params = $.getQueryParameters();
76
- if (params.q) {
77
- var query = params.q[0];
78
- $('input[name="q"]')[0].value = query;
79
- this.performSearch(query);
80
- }
188
+ console.warn(
189
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
190
+ );
191
+ }
192
+
193
+ // if anchor not specified or not found, fall back to main content
194
+ const docContent = htmlElement.querySelector('[role="main"]');
195
+ if (docContent) return docContent.textContent;
196
+
197
+ console.warn(
198
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
199
+ );
200
+ return "";
81
201
  },
82
202
 
83
- loadIndex : function(url) {
84
- $.ajax({type: "GET", url: url, data: null,
85
- dataType: "script", cache: true,
86
- complete: function(jqxhr, textstatus) {
87
- if (textstatus != "success") {
88
- document.getElementById("searchindexloader").src = url;
89
- }
90
- }});
203
+ init: () => {
204
+ const query = new URLSearchParams(window.location.search).get("q");
205
+ document
206
+ .querySelectorAll('input[name="q"]')
207
+ .forEach((el) => (el.value = query));
208
+ if (query) Search.performSearch(query);
91
209
  },
92
210
 
93
- setIndex : function(index) {
94
- var q;
95
- this._index = index;
96
- if ((q = this._queued_query) !== null) {
97
- this._queued_query = null;
98
- Search.query(q);
211
+ loadIndex: (url) =>
212
+ (document.body.appendChild(document.createElement("script")).src = url),
213
+
214
+ setIndex: (index) => {
215
+ Search._index = index;
216
+ if (Search._queued_query !== null) {
217
+ const query = Search._queued_query;
218
+ Search._queued_query = null;
219
+ Search.query(query);
99
220
  }
100
221
  },
101
222
 
102
- hasIndex : function() {
103
- return this._index !== null;
104
- },
223
+ hasIndex: () => Search._index !== null,
105
224
 
106
- deferQuery : function(query) {
107
- this._queued_query = query;
108
- },
225
+ deferQuery: (query) => (Search._queued_query = query),
109
226
 
110
- stopPulse : function() {
111
- this._pulse_status = 0;
112
- },
227
+ stopPulse: () => (Search._pulse_status = -1),
113
228
 
114
- startPulse : function() {
115
- if (this._pulse_status >= 0)
116
- return;
117
- function pulse() {
118
- var i;
229
+ startPulse: () => {
230
+ if (Search._pulse_status >= 0) return;
231
+
232
+ const pulse = () => {
119
233
  Search._pulse_status = (Search._pulse_status + 1) % 4;
120
- var dotString = '';
121
- for (i = 0; i < Search._pulse_status; i++)
122
- dotString += '.';
123
- Search.dots.text(dotString);
124
- if (Search._pulse_status > -1)
125
- window.setTimeout(pulse, 500);
126
- }
234
+ Search.dots.innerText = ".".repeat(Search._pulse_status);
235
+ if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
236
+ };
127
237
  pulse();
128
238
  },
129
239
 
130
240
  /**
131
241
  * perform a search for something (or wait until index is loaded)
132
242
  */
133
- performSearch : function(query) {
243
+ performSearch: (query) => {
134
244
  // create the required interface elements
135
- this.out = $('#search-results');
136
- this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
137
- this.dots = $('<span></span>').appendTo(this.title);
138
- this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
139
- this.output = $('<ul class="search"/>').appendTo(this.out);
140
-
141
- $('#search-progress').text(_('Preparing search...'));
142
- this.startPulse();
245
+ const searchText = document.createElement("h2");
246
+ searchText.textContent = _("Searching");
247
+ const searchSummary = document.createElement("p");
248
+ searchSummary.classList.add("search-summary");
249
+ searchSummary.innerText = "";
250
+ const searchList = document.createElement("ul");
251
+ searchList.classList.add("search");
252
+
253
+ const out = document.getElementById("search-results");
254
+ Search.title = out.appendChild(searchText);
255
+ Search.dots = Search.title.appendChild(document.createElement("span"));
256
+ Search.status = out.appendChild(searchSummary);
257
+ Search.output = out.appendChild(searchList);
258
+
259
+ const searchProgress = document.getElementById("search-progress");
260
+ // Some themes don't use the search progress node
261
+ if (searchProgress) {
262
+ searchProgress.innerText = _("Preparing search...");
263
+ }
264
+ Search.startPulse();
143
265
 
144
266
  // index already loaded, the browser was quick!
145
- if (this.hasIndex())
146
- this.query(query);
147
- else
148
- this.deferQuery(query);
267
+ if (Search.hasIndex()) Search.query(query);
268
+ else Search.deferQuery(query);
149
269
  },
150
270
 
151
- /**
152
- * execute search (requires search index to be loaded)
153
- */
154
- query : function(query) {
155
- var i;
156
-
157
- // stem the searchterms and add them to the correct list
158
- var stemmer = new Stemmer();
159
- var searchterms = [];
160
- var excluded = [];
161
- var hlterms = [];
162
- var tmp = splitQuery(query);
163
- var objectterms = [];
164
- for (i = 0; i < tmp.length; i++) {
165
- if (tmp[i] !== "") {
166
- objectterms.push(tmp[i].toLowerCase());
167
- }
271
+ _parseQuery: (query) => {
272
+ // stem the search terms and add them to the correct list
273
+ const stemmer = new Stemmer();
274
+ const searchTerms = new Set();
275
+ const excludedTerms = new Set();
276
+ const highlightTerms = new Set();
277
+ const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
278
+ splitQuery(query.trim()).forEach((queryTerm) => {
279
+ const queryTermLower = queryTerm.toLowerCase();
280
+
281
+ // maybe skip this "word"
282
+ // stopwords array is from language_data.js
283
+ if (
284
+ stopwords.indexOf(queryTermLower) !== -1 ||
285
+ queryTerm.match(/^\d+$/)
286
+ )
287
+ return;
168
288
 
169
- if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
170
- // skip this "word"
171
- continue;
172
- }
173
289
  // stem the word
174
- var word = stemmer.stemWord(tmp[i].toLowerCase());
175
- // prevent stemmer from cutting word smaller than two chars
176
- if(word.length < 3 && tmp[i].length >= 3) {
177
- word = tmp[i];
178
- }
179
- var toAppend;
290
+ let word = stemmer.stemWord(queryTermLower);
180
291
  // select the correct list
181
- if (word[0] == '-') {
182
- toAppend = excluded;
183
- word = word.substr(1);
184
- }
292
+ if (word[0] === "-") excludedTerms.add(word.substr(1));
185
293
  else {
186
- toAppend = searchterms;
187
- hlterms.push(tmp[i].toLowerCase());
294
+ searchTerms.add(word);
295
+ highlightTerms.add(queryTermLower);
188
296
  }
189
- // only add if not already in the list
190
- if (!$u.contains(toAppend, word))
191
- toAppend.push(word);
297
+ });
298
+
299
+ if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
300
+ localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
192
301
  }
193
- var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
194
302
 
195
- // console.debug('SEARCH: searching for:');
196
- // console.info('required: ', searchterms);
197
- // console.info('excluded: ', excluded);
303
+ // console.debug("SEARCH: searching for:");
304
+ // console.info("required: ", [...searchTerms]);
305
+ // console.info("excluded: ", [...excludedTerms]);
198
306
 
199
- // prepare search
200
- var terms = this._index.terms;
201
- var titleterms = this._index.titleterms;
307
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
308
+ },
309
+
310
+ /**
311
+ * execute search (requires search index to be loaded)
312
+ */
313
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
314
+ const filenames = Search._index.filenames;
315
+ const docNames = Search._index.docnames;
316
+ const titles = Search._index.titles;
317
+ const allTitles = Search._index.alltitles;
318
+ const indexEntries = Search._index.indexentries;
319
+
320
+ // Collect multiple result groups to be sorted separately and then ordered.
321
+ // Each is an array of [docname, title, anchor, descr, score, filename].
322
+ const normalResults = [];
323
+ const nonMainIndexResults = [];
324
+
325
+ _removeChildren(document.getElementById("search-progress"));
326
+
327
+ const queryLower = query.toLowerCase().trim();
328
+ for (const [title, foundTitles] of Object.entries(allTitles)) {
329
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
330
+ for (const [file, id] of foundTitles) {
331
+ const score = Math.round(Scorer.title * queryLower.length / title.length);
332
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
333
+ normalResults.push([
334
+ docNames[file],
335
+ titles[file] !== title ? `${titles[file]} > ${title}` : title,
336
+ id !== null ? "#" + id : "",
337
+ null,
338
+ score + boost,
339
+ filenames[file],
340
+ ]);
341
+ }
342
+ }
343
+ }
202
344
 
203
- // array of [filename, title, anchor, descr, score]
204
- var results = [];
205
- $('#search-progress').empty();
345
+ // search for explicit entries in index directives
346
+ for (const [entry, foundEntries] of Object.entries(indexEntries)) {
347
+ if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
348
+ for (const [file, id, isMain] of foundEntries) {
349
+ const score = Math.round(100 * queryLower.length / entry.length);
350
+ const result = [
351
+ docNames[file],
352
+ titles[file],
353
+ id ? "#" + id : "",
354
+ null,
355
+ score,
356
+ filenames[file],
357
+ ];
358
+ if (isMain) {
359
+ normalResults.push(result);
360
+ } else {
361
+ nonMainIndexResults.push(result);
362
+ }
363
+ }
364
+ }
365
+ }
206
366
 
207
367
  // lookup as object
208
- for (i = 0; i < objectterms.length; i++) {
209
- var others = [].concat(objectterms.slice(0, i),
210
- objectterms.slice(i+1, objectterms.length));
211
- results = results.concat(this.performObjectSearch(objectterms[i], others));
212
- }
368
+ objectTerms.forEach((term) =>
369
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
370
+ );
213
371
 
214
372
  // lookup as search terms in fulltext
215
- results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
373
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
216
374
 
217
375
  // let the scorer override scores with a custom scoring function
218
376
  if (Scorer.score) {
219
- for (i = 0; i < results.length; i++)
220
- results[i][4] = Scorer.score(results[i]);
377
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
378
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
221
379
  }
222
380
 
223
- // now sort the results by score (in opposite order of appearance, since the
224
- // display function below uses pop() to retrieve items) and then
225
- // alphabetically
226
- results.sort(function(a, b) {
227
- var left = a[4];
228
- var right = b[4];
229
- if (left > right) {
230
- return 1;
231
- } else if (left < right) {
232
- return -1;
233
- } else {
234
- // same score: sort alphabetically
235
- left = a[1].toLowerCase();
236
- right = b[1].toLowerCase();
237
- return (left > right) ? -1 : ((left < right) ? 1 : 0);
381
+ // Sort each group of results by score and then alphabetically by name.
382
+ normalResults.sort(_orderResultsByScoreThenName);
383
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
384
+
385
+ // Combine the result groups in (reverse) order.
386
+ // Non-main index entries are typically arbitrary cross-references,
387
+ // so display them after other results.
388
+ let results = [...nonMainIndexResults, ...normalResults];
389
+
390
+ // remove duplicate search results
391
+ // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
392
+ let seen = new Set();
393
+ results = results.reverse().reduce((acc, result) => {
394
+ let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
395
+ if (!seen.has(resultStr)) {
396
+ acc.push(result);
397
+ seen.add(resultStr);
238
398
  }
239
- });
399
+ return acc;
400
+ }, []);
401
+
402
+ return results.reverse();
403
+ },
404
+
405
+ query: (query) => {
406
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
407
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
240
408
 
241
409
  // for debugging
242
410
  //Search.lastresults = results.slice(); // a copy
243
- //console.info('search results:', Search.lastresults);
411
+ // console.info("search results:", Search.lastresults);
244
412
 
245
413
  // print the results
246
- var resultCount = results.length;
247
- function displayNextItem() {
248
- // results left, load the summary and display it
249
- if (results.length) {
250
- var item = results.pop();
251
- var listItem = $('<li></li>');
252
- var requestUrl = "";
253
- var linkUrl = "";
254
- if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
255
- // dirhtml builder
256
- var dirname = item[0] + '/';
257
- if (dirname.match(/\/index\/$/)) {
258
- dirname = dirname.substring(0, dirname.length-6);
259
- } else if (dirname == 'index/') {
260
- dirname = '';
261
- }
262
- requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
263
- linkUrl = requestUrl;
264
-
265
- } else {
266
- // normal html builders
267
- requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
268
- linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
269
- }
270
- listItem.append($('<a/>').attr('href',
271
- linkUrl +
272
- highlightstring + item[2]).html(item[1]));
273
- if (item[3]) {
274
- listItem.append($('<span> (' + item[3] + ')</span>'));
275
- Search.output.append(listItem);
276
- setTimeout(function() {
277
- displayNextItem();
278
- }, 5);
279
- } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
280
- $.ajax({url: requestUrl,
281
- dataType: "text",
282
- complete: function(jqxhr, textstatus) {
283
- var data = jqxhr.responseText;
284
- if (data !== '' && data !== undefined) {
285
- var summary = Search.makeSearchSummary(data, searchterms, hlterms);
286
- if (summary) {
287
- listItem.append(summary);
288
- }
289
- }
290
- Search.output.append(listItem);
291
- setTimeout(function() {
292
- displayNextItem();
293
- }, 5);
294
- }});
295
- } else {
296
- // no source available, just display title
297
- Search.output.append(listItem);
298
- setTimeout(function() {
299
- displayNextItem();
300
- }, 5);
301
- }
302
- }
303
- // search finished, update title and status message
304
- else {
305
- Search.stopPulse();
306
- Search.title.text(_('Search Results'));
307
- if (!resultCount)
308
- Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
309
- else
310
- Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
311
- Search.status.fadeIn(500);
312
- }
313
- }
314
- displayNextItem();
414
+ _displayNextItem(results, results.length, searchTerms, highlightTerms);
315
415
  },
316
416
 
317
417
  /**
318
418
  * search for object names
319
419
  */
320
- performObjectSearch : function(object, otherterms) {
321
- var filenames = this._index.filenames;
322
- var docnames = this._index.docnames;
323
- var objects = this._index.objects;
324
- var objnames = this._index.objnames;
325
- var titles = this._index.titles;
326
-
327
- var i;
328
- var results = [];
329
-
330
- for (var prefix in objects) {
331
- for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) {
332
- var match = objects[prefix][iMatch];
333
- var name = match[4];
334
- var fullname = (prefix ? prefix + '.' : '') + name;
335
- var fullnameLower = fullname.toLowerCase()
336
- if (fullnameLower.indexOf(object) > -1) {
337
- var score = 0;
338
- var parts = fullnameLower.split('.');
339
- // check for different match types: exact matches of full name or
340
- // "last name" (i.e. last dotted part)
341
- if (fullnameLower == object || parts[parts.length - 1] == object) {
342
- score += Scorer.objNameMatch;
343
- // matches in last name
344
- } else if (parts[parts.length - 1].indexOf(object) > -1) {
345
- score += Scorer.objPartialMatch;
346
- }
347
- var objname = objnames[match[1]][2];
348
- var title = titles[match[0]];
349
- // If more than one term searched for, we require other words to be
350
- // found in the name/title/description
351
- if (otherterms.length > 0) {
352
- var haystack = (prefix + ' ' + name + ' ' +
353
- objname + ' ' + title).toLowerCase();
354
- var allfound = true;
355
- for (i = 0; i < otherterms.length; i++) {
356
- if (haystack.indexOf(otherterms[i]) == -1) {
357
- allfound = false;
358
- break;
359
- }
360
- }
361
- if (!allfound) {
362
- continue;
363
- }
364
- }
365
- var descr = objname + _(', in ') + title;
366
-
367
- var anchor = match[3];
368
- if (anchor === '')
369
- anchor = fullname;
370
- else if (anchor == '-')
371
- anchor = objnames[match[1]][1] + '-' + fullname;
372
- // add custom score for some objects according to scorer
373
- if (Scorer.objPrio.hasOwnProperty(match[2])) {
374
- score += Scorer.objPrio[match[2]];
375
- } else {
376
- score += Scorer.objPrioDefault;
377
- }
378
- results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
379
- }
420
+ performObjectSearch: (object, objectTerms) => {
421
+ const filenames = Search._index.filenames;
422
+ const docNames = Search._index.docnames;
423
+ const objects = Search._index.objects;
424
+ const objNames = Search._index.objnames;
425
+ const titles = Search._index.titles;
426
+
427
+ const results = [];
428
+
429
+ const objectSearchCallback = (prefix, match) => {
430
+ const name = match[4]
431
+ const fullname = (prefix ? prefix + "." : "") + name;
432
+ const fullnameLower = fullname.toLowerCase();
433
+ if (fullnameLower.indexOf(object) < 0) return;
434
+
435
+ let score = 0;
436
+ const parts = fullnameLower.split(".");
437
+
438
+ // check for different match types: exact matches of full name or
439
+ // "last name" (i.e. last dotted part)
440
+ if (fullnameLower === object || parts.slice(-1)[0] === object)
441
+ score += Scorer.objNameMatch;
442
+ else if (parts.slice(-1)[0].indexOf(object) > -1)
443
+ score += Scorer.objPartialMatch; // matches in last name
444
+
445
+ const objName = objNames[match[1]][2];
446
+ const title = titles[match[0]];
447
+
448
+ // If more than one term searched for, we require other words to be
449
+ // found in the name/title/description
450
+ const otherTerms = new Set(objectTerms);
451
+ otherTerms.delete(object);
452
+ if (otherTerms.size > 0) {
453
+ const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
454
+ if (
455
+ [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
456
+ )
457
+ return;
380
458
  }
381
- }
382
459
 
460
+ let anchor = match[3];
461
+ if (anchor === "") anchor = fullname;
462
+ else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
463
+
464
+ const descr = objName + _(", in ") + title;
465
+
466
+ // add custom score for some objects according to scorer
467
+ if (Scorer.objPrio.hasOwnProperty(match[2]))
468
+ score += Scorer.objPrio[match[2]];
469
+ else score += Scorer.objPrioDefault;
470
+
471
+ results.push([
472
+ docNames[match[0]],
473
+ fullname,
474
+ "#" + anchor,
475
+ descr,
476
+ score,
477
+ filenames[match[0]],
478
+ ]);
479
+ };
480
+ Object.keys(objects).forEach((prefix) =>
481
+ objects[prefix].forEach((array) =>
482
+ objectSearchCallback(prefix, array)
483
+ )
484
+ );
383
485
  return results;
384
486
  },
385
487
 
386
- /**
387
- * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
388
- */
389
- escapeRegExp : function(string) {
390
- return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
391
- },
392
-
393
488
  /**
394
489
  * search for full-text terms in the index
395
490
  */
396
- performTermsSearch : function(searchterms, excluded, terms, titleterms) {
397
- var docnames = this._index.docnames;
398
- var filenames = this._index.filenames;
399
- var titles = this._index.titles;
491
+ performTermsSearch: (searchTerms, excludedTerms) => {
492
+ // prepare search
493
+ const terms = Search._index.terms;
494
+ const titleTerms = Search._index.titleterms;
495
+ const filenames = Search._index.filenames;
496
+ const docNames = Search._index.docnames;
497
+ const titles = Search._index.titles;
400
498
 
401
- var i, j, file;
402
- var fileMap = {};
403
- var scoreMap = {};
404
- var results = [];
499
+ const scoreMap = new Map();
500
+ const fileMap = new Map();
405
501
 
406
502
  // perform the search on the required terms
407
- for (i = 0; i < searchterms.length; i++) {
408
- var word = searchterms[i];
409
- var files = [];
410
- var _o = [
411
- {files: terms[word], score: Scorer.term},
412
- {files: titleterms[word], score: Scorer.title}
503
+ searchTerms.forEach((word) => {
504
+ const files = [];
505
+ const arr = [
506
+ { files: terms[word], score: Scorer.term },
507
+ { files: titleTerms[word], score: Scorer.title },
413
508
  ];
414
509
  // add support for partial matches
415
510
  if (word.length > 2) {
416
- var word_regex = this.escapeRegExp(word);
417
- for (var w in terms) {
418
- if (w.match(word_regex) && !terms[word]) {
419
- _o.push({files: terms[w], score: Scorer.partialTerm})
420
- }
511
+ const escapedWord = _escapeRegExp(word);
512
+ if (!terms.hasOwnProperty(word)) {
513
+ Object.keys(terms).forEach((term) => {
514
+ if (term.match(escapedWord))
515
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
516
+ });
421
517
  }
422
- for (var w in titleterms) {
423
- if (w.match(word_regex) && !titleterms[word]) {
424
- _o.push({files: titleterms[w], score: Scorer.partialTitle})
425
- }
518
+ if (!titleTerms.hasOwnProperty(word)) {
519
+ Object.keys(titleTerms).forEach((term) => {
520
+ if (term.match(escapedWord))
521
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
522
+ });
426
523
  }
427
524
  }
428
525
 
429
526
  // no match but word was a required one
430
- if ($u.every(_o, function(o){return o.files === undefined;})) {
431
- break;
432
- }
527
+ if (arr.every((record) => record.files === undefined)) return;
528
+
433
529
  // found search word in contents
434
- $u.each(_o, function(o) {
435
- var _files = o.files;
436
- if (_files === undefined)
437
- return
438
-
439
- if (_files.length === undefined)
440
- _files = [_files];
441
- files = files.concat(_files);
442
-
443
- // set score for the word in each file to Scorer.term
444
- for (j = 0; j < _files.length; j++) {
445
- file = _files[j];
446
- if (!(file in scoreMap))
447
- scoreMap[file] = {};
448
- scoreMap[file][word] = o.score;
449
- }
530
+ arr.forEach((record) => {
531
+ if (record.files === undefined) return;
532
+
533
+ let recordFiles = record.files;
534
+ if (recordFiles.length === undefined) recordFiles = [recordFiles];
535
+ files.push(...recordFiles);
536
+
537
+ // set score for the word in each file
538
+ recordFiles.forEach((file) => {
539
+ if (!scoreMap.has(file)) scoreMap.set(file, {});
540
+ scoreMap.get(file)[word] = record.score;
541
+ });
450
542
  });
451
543
 
452
544
  // create the mapping
453
- for (j = 0; j < files.length; j++) {
454
- file = files[j];
455
- if (file in fileMap && fileMap[file].indexOf(word) === -1)
456
- fileMap[file].push(word);
457
- else
458
- fileMap[file] = [word];
459
- }
460
- }
545
+ files.forEach((file) => {
546
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
547
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
548
+ });
549
+ });
461
550
 
462
551
  // now check if the files don't contain excluded terms
463
- for (file in fileMap) {
464
- var valid = true;
465
-
552
+ const results = [];
553
+ for (const [file, wordList] of fileMap) {
466
554
  // check if all requirements are matched
467
- var filteredTermCount = // as search terms with length < 3 are discarded: ignore
468
- searchterms.filter(function(term){return term.length > 2}).length
555
+
556
+ // as search terms with length < 3 are discarded
557
+ const filteredTermCount = [...searchTerms].filter(
558
+ (term) => term.length > 2
559
+ ).length;
469
560
  if (
470
- fileMap[file].length != searchterms.length &&
471
- fileMap[file].length != filteredTermCount
472
- ) continue;
561
+ wordList.length !== searchTerms.size &&
562
+ wordList.length !== filteredTermCount
563
+ )
564
+ continue;
473
565
 
474
566
  // ensure that none of the excluded terms is in the search result
475
- for (i = 0; i < excluded.length; i++) {
476
- if (terms[excluded[i]] == file ||
477
- titleterms[excluded[i]] == file ||
478
- $u.contains(terms[excluded[i]] || [], file) ||
479
- $u.contains(titleterms[excluded[i]] || [], file)) {
480
- valid = false;
481
- break;
482
- }
483
- }
567
+ if (
568
+ [...excludedTerms].some(
569
+ (term) =>
570
+ terms[term] === file ||
571
+ titleTerms[term] === file ||
572
+ (terms[term] || []).includes(file) ||
573
+ (titleTerms[term] || []).includes(file)
574
+ )
575
+ )
576
+ break;
484
577
 
485
- // if we have still a valid result we can add it to the result list
486
- if (valid) {
487
- // select one (max) score for the file.
488
- // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
489
- var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
490
- results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
491
- }
578
+ // select one (max) score for the file.
579
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
580
+ // add result to the result list
581
+ results.push([
582
+ docNames[file],
583
+ titles[file],
584
+ "",
585
+ null,
586
+ score,
587
+ filenames[file],
588
+ ]);
492
589
  }
493
590
  return results;
494
591
  },
@@ -496,34 +593,28 @@ var Search = {
496
593
  /**
497
594
  * helper function to return a node containing the
498
595
  * search summary for a given text. keywords is a list
499
- * of stemmed words, hlwords is the list of normal, unstemmed
500
- * words. the first one is used to find the occurrence, the
501
- * latter for highlighting it.
596
+ * of stemmed words.
502
597
  */
503
- makeSearchSummary : function(htmlText, keywords, hlwords) {
504
- var text = Search.htmlToText(htmlText);
505
- if (text == "") {
506
- return null;
507
- }
508
- var textLower = text.toLowerCase();
509
- var start = 0;
510
- $.each(keywords, function() {
511
- var i = textLower.indexOf(this.toLowerCase());
512
- if (i > -1)
513
- start = i;
514
- });
515
- start = Math.max(start - 120, 0);
516
- var excerpt = ((start > 0) ? '...' : '') +
517
- $.trim(text.substr(start, 240)) +
518
- ((start + 240 - text.length) ? '...' : '');
519
- var rv = $('<p class="context"></p>').text(excerpt);
520
- $.each(hlwords, function() {
521
- rv = rv.highlightText(this, 'highlighted');
522
- });
523
- return rv;
524
- }
598
+ makeSearchSummary: (htmlText, keywords, anchor) => {
599
+ const text = Search.htmlToText(htmlText, anchor);
600
+ if (text === "") return null;
601
+
602
+ const textLower = text.toLowerCase();
603
+ const actualStartPosition = [...keywords]
604
+ .map((k) => textLower.indexOf(k.toLowerCase()))
605
+ .filter((i) => i > -1)
606
+ .slice(-1)[0];
607
+ const startWithContext = Math.max(actualStartPosition - 120, 0);
608
+
609
+ const top = startWithContext === 0 ? "" : "...";
610
+ const tail = startWithContext + 240 < text.length ? "..." : "";
611
+
612
+ let summary = document.createElement("p");
613
+ summary.classList.add("context");
614
+ summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
615
+
616
+ return summary;
617
+ },
525
618
  };
526
619
 
527
- $(document).ready(function() {
528
- Search.init();
529
- });
620
+ _ready(Search.init);