Add API docs processing script (conversion from HTML to markdown)

This commit is contained in:
Dominik Jain 2025-09-25 22:13:09 +02:00 committed by Dominik Jain
parent 5ab14ffb9e
commit 068817709e
5 changed files with 680 additions and 0 deletions

2
prepare-api-docs/.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# SCM syntax highlighting
pixi.lock linguist-language=YAML linguist-generated=true

4
prepare-api-docs/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
# pixi environments
.pixi
*.egg-info

536
prepare-api-docs/pixi.lock generated Normal file
View File

@ -0,0 +1,536 @@
version: 6
environments:
default:
channels:
- url: https://conda.anaconda.org/conda-forge/
indexes:
- https://pypi.org/simple
packages:
win-64:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py311h3485c13_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/markdownify-1.1.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.3-h725018a_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pixi-pycharm-0.0.9-win_hba80fca_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py311hf893f09_0.conda
- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda
- pypi: https://files.pythonhosted.org/packages/ad/d5/62a0e693230bace8e9a767d6d187a4d9421a7c6ee4b48551f8ff7bd1629a/sensai_utils-1.5.0-py3-none-any.whl
packages:
- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.13.5-pyha770c72_0.conda
sha256: d2124c0ea13527c7f54582269b3ae19541141a3740d6d779e7aa95aa82eaf561
md5: de0fd9702fd4c1186e930b8c35af6b6b
depends:
- python >=3.10
- soupsieve >=1.2
- typing-extensions
license: MIT
license_family: MIT
purls:
- pkg:pypi/beautifulsoup4?source=compressed-mapping
size: 88278
timestamp: 1756094375546
- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.1.0-py311h3e6a449_4.conda
sha256: d524edc172239fec70ad946e3b2fa1b9d7eea145ad80e9e66da25a4d815770ea
md5: 21d3a7fa95d27938158009cd08e461f2
depends:
- python >=3.11,<3.12.0a0
- python_abi 3.11.* *_cp311
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
constrains:
- libbrotlicommon 1.1.0 hfd05255_4
license: MIT
license_family: MIT
purls:
- pkg:pypi/brotli?source=hash-mapping
size: 323289
timestamp: 1756600106141
- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda
sha256: d882712855624641f48aa9dc3f5feea2ed6b4e6004585d3616386a18186fe692
md5: 1077e9333c41ff0be8edd1a5ec0ddace
depends:
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
license: bzip2-1.0.6
license_family: BSD
purls: []
size: 55977
timestamp: 1757437738856
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-h4c7d964_0.conda
sha256: 3b82f62baad3fd33827b01b0426e8203a2786c8f452f633740868296bcbe8485
md5: c9e0c0f82f6e63323827db462b40ede8
depends:
- __win
license: ISC
purls: []
size: 154489
timestamp: 1754210967212
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda
sha256: a1ad5b0a2a242f439608f22a538d2175cac4444b7b3f4e2b8c090ac337aaea40
md5: 11f59985f49df4620890f3e746ed7102
depends:
- python >=3.9
license: ISC
purls:
- pkg:pypi/certifi?source=compressed-mapping
size: 158692
timestamp: 1754231530168
- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py311h3485c13_0.conda
sha256: 12f5d72b95dbd417367895a92c35922b24bb016d1497f24f3a243224ec6cb81b
md5: 573fd072e80c1a334e19a1f95024d94d
depends:
- pycparser
- python >=3.11,<3.12.0a0
- python_abi 3.11.* *_cp311
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
license: MIT
license_family: MIT
purls:
- pkg:pypi/cffi?source=compressed-mapping
size: 298353
timestamp: 1758716437777
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda
sha256: 838d5a011f0e7422be6427becba3de743c78f3874ad2743c341accbba9bb2624
md5: 7e7d5ef1b9ed630e4a1c358d6bc62284
depends:
- python >=3.9
license: MIT
license_family: MIT
purls:
- pkg:pypi/charset-normalizer?source=hash-mapping
size: 51033
timestamp: 1754767444665
- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda
sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3
md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9
depends:
- python >=3.10
- hyperframe >=6.1,<7
- hpack >=4.1,<5
- python
license: MIT
license_family: MIT
purls:
- pkg:pypi/h2?source=compressed-mapping
size: 95967
timestamp: 1756364871835
- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda
sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba
md5: 0a802cb9888dd14eeefc611f05c40b6e
depends:
- python >=3.9
license: MIT
license_family: MIT
purls:
- pkg:pypi/hpack?source=hash-mapping
size: 30731
timestamp: 1737618390337
- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda
sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8
md5: 8e6923fc12f1fe8f8c4e5c9f343256ac
depends:
- python >=3.9
license: MIT
license_family: MIT
purls:
- pkg:pypi/hyperframe?source=hash-mapping
size: 17397
timestamp: 1737618427549
- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda
sha256: d7a472c9fd479e2e8dcb83fb8d433fce971ea369d704ece380e876f9c3494e87
md5: 39a4f67be3286c86d696df570b1201b7
depends:
- python >=3.9
license: BSD-3-Clause
license_family: BSD
purls:
- pkg:pypi/idna?source=hash-mapping
size: 49765
timestamp: 1733211921194
- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.1-hac47afa_0.conda
sha256: 8432ca842bdf8073ccecf016ccc9140c41c7114dc4ec77ca754551c01f780845
md5: 3608ffde260281fa641e70d6e34b1b96
depends:
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
constrains:
- expat 2.7.1.*
license: MIT
license_family: MIT
purls: []
size: 141322
timestamp: 1752719767870
- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.6-h537db12_1.conda
sha256: d3b0b8812eab553d3464bbd68204f007f1ebadf96ce30eb0cbc5159f72e353f5
md5: 85d8fa5e55ed8f93f874b3b23ed54ec6
depends:
- ucrt >=10.0.20348.0
- vc >=14.2,<15
- vc14_runtime >=14.29.30139
license: MIT
license_family: MIT
purls: []
size: 44978
timestamp: 1743435053850
- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda
sha256: 55764956eb9179b98de7cc0e55696f2eff8f7b83fc3ebff5e696ca358bca28cc
md5: c15148b2e18da456f5108ccb5e411446
depends:
- ucrt >=10.0.20348.0
- vc >=14.2,<15
- vc14_runtime >=14.29.30139
constrains:
- xz 5.8.1.*
license: 0BSD
purls: []
size: 104935
timestamp: 1749230611612
- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.50.4-hf5d6505_0.conda
sha256: 5dc4f07b2d6270ac0c874caec53c6984caaaa84bc0d3eb593b0edf3dc8492efa
md5: ccb20d946040f86f0c05b644d5eadeca
depends:
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
license: blessing
purls: []
size: 1288499
timestamp: 1753948889360
- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda
sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402
md5: 41fbfac52c601159df6c01f875de31b9
depends:
- ucrt >=10.0.20348.0
- vc >=14.2,<15
- vc14_runtime >=14.29.30139
constrains:
- zlib 1.3.1 *_2
license: Zlib
license_family: Other
purls: []
size: 55476
timestamp: 1727963768015
- conda: https://conda.anaconda.org/conda-forge/noarch/markdownify-1.1.0-pyhd8ed1ab_1.conda
sha256: 127f040a4ec203d0e9af708600113fcb7641948f0f0f790c6906738397efa947
md5: 4792499afa7a0fdfcff1533cab5564b3
depends:
- beautifulsoup4 >=4.9,<5
- python >=3.8
- six >=1.15,<2
license: MIT
license_family: MIT
purls:
- pkg:pypi/markdownify?source=hash-mapping
size: 19359
timestamp: 1756304996346
- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.5.3-h725018a_1.conda
sha256: 72dc204b0d59a7262bc77ca0e86cba11cbc6706cb9b4d6656fe7fab9593347c9
md5: c84884e2c1f899de9a895a1f0b7c9cd8
depends:
- ca-certificates
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
license: Apache-2.0
license_family: Apache
purls: []
size: 9276051
timestamp: 1758599639304
- conda: https://conda.anaconda.org/conda-forge/noarch/pixi-pycharm-0.0.9-win_hba80fca_0.conda
sha256: 22c6fedb771249e8b9723a916a3dc558b74681d3d8c2f118667cba81851f2002
md5: de239ce0ba6c1b8d4bdd791650d8067c
depends:
- __win
- python >=3.8
license: BSD-3-Clause
purls: []
size: 6687
timestamp: 1758810287418
- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda
sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6
md5: 12c566707c80111f9799308d9e265aef
depends:
- python >=3.9
- python
license: BSD-3-Clause
license_family: BSD
purls:
- pkg:pypi/pycparser?source=hash-mapping
size: 110100
timestamp: 1733195786147
- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda
sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca
md5: e2fd202833c4a981ce8a65974fe4abd1
depends:
- __win
- python >=3.9
- win_inet_pton
license: BSD-3-Clause
license_family: BSD
purls:
- pkg:pypi/pysocks?source=hash-mapping
size: 21784
timestamp: 1733217448189
- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.11.13-h3f84c4b_0_cpython.conda
sha256: 723dbca1384f30bd2070f77dd83eefd0e8d7e4dda96ac3332fbf8fe5573a8abb
md5: bedbb6f7bb654839719cd528f9b298ad
depends:
- bzip2 >=1.0.8,<2.0a0
- libexpat >=2.7.0,<3.0a0
- libffi >=3.4.6,<3.5.0a0
- liblzma >=5.8.1,<6.0a0
- libsqlite >=3.50.0,<4.0a0
- libzlib >=1.3.1,<2.0a0
- openssl >=3.5.0,<4.0a0
- tk >=8.6.13,<8.7.0a0
- tzdata
- ucrt >=10.0.20348.0
- vc >=14.2,<15
- vc14_runtime >=14.29.30139
constrains:
- python_abi 3.11.* *_cp311
license: Python-2.0
purls: []
size: 18242669
timestamp: 1749048351218
- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.11-8_cp311.conda
build_number: 8
sha256: fddf123692aa4b1fc48f0471e346400d9852d96eeed77dbfdd746fa50a8ff894
md5: 8fcb6b0e2161850556231336dae58358
constrains:
- python 3.11.* *_cpython
license: BSD-3-Clause
license_family: BSD
purls: []
size: 7003
timestamp: 1752805919375
- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda
sha256: 8dc54e94721e9ab545d7234aa5192b74102263d3e704e6d0c8aa7008f2da2a7b
md5: db0c6b99149880c8ba515cf4abe93ee4
depends:
- certifi >=2017.4.17
- charset-normalizer >=2,<4
- idna >=2.5,<4
- python >=3.9
- urllib3 >=1.21.1,<3
constrains:
- chardet >=3.0.2,<6
license: Apache-2.0
license_family: APACHE
purls:
- pkg:pypi/requests?source=hash-mapping
size: 59263
timestamp: 1755614348400
- pypi: https://files.pythonhosted.org/packages/ad/d5/62a0e693230bace8e9a767d6d187a4d9421a7c6ee4b48551f8ff7bd1629a/sensai_utils-1.5.0-py3-none-any.whl
name: sensai-utils
version: 1.5.0
sha256: c23c51d23d353e7a9b77c70aa8ba7f2d0a8fe4e67ee5bc1ef41c69dba5e4befb
requires_dist:
- typing-extensions>=4.6
- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda
sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d
md5: 3339e3b65d58accf4ca4fb8748ab16b3
depends:
- python >=3.9
- python
license: MIT
license_family: MIT
purls:
- pkg:pypi/six?source=hash-mapping
size: 18455
timestamp: 1753199211006
- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8-pyhd8ed1ab_0.conda
sha256: c978576cf9366ba576349b93be1cfd9311c00537622a2f9e14ba2b90c97cae9c
md5: 18c019ccf43769d211f2cf78e9ad46c2
depends:
- python >=3.10
license: MIT
license_family: MIT
purls:
- pkg:pypi/soupsieve?source=hash-mapping
size: 37803
timestamp: 1756330614547
- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_2.conda
sha256: e3614b0eb4abcc70d98eae159db59d9b4059ed743ef402081151a948dce95896
md5: ebd0e761de9aa879a51d22cc721bd095
depends:
- ucrt >=10.0.20348.0
- vc >=14.2,<15
- vc14_runtime >=14.29.30139
license: TCL
license_family: BSD
purls: []
size: 3466348
timestamp: 1748388121356
- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda
sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c
md5: edd329d7d3a4ab45dcf905899a7a6115
depends:
- typing_extensions ==4.15.0 pyhcf101f3_0
license: PSF-2.0
license_family: PSF
purls: []
size: 91383
timestamp: 1756220668932
- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda
sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731
md5: 0caa1af407ecff61170c9437a808404d
depends:
- python >=3.10
- python
license: PSF-2.0
license_family: PSF
purls:
- pkg:pypi/typing-extensions?source=hash-mapping
size: 51692
timestamp: 1756220668932
- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda
sha256: 5aaa366385d716557e365f0a4e9c3fca43ba196872abbbe3d56bb610d131e192
md5: 4222072737ccff51314b5ece9c7d6f5a
license: LicenseRef-Public-Domain
purls: []
size: 122968
timestamp: 1742727099393
- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda
sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5
md5: 71b24316859acd00bdb8b38f5e2ce328
constrains:
- vc14_runtime >=14.29.30037
- vs2015_runtime >=14.29.30037
license: LicenseRef-MicrosoftWindowsSDK10
purls: []
size: 694692
timestamp: 1756385147981
- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda
sha256: 4fb9789154bd666ca74e428d973df81087a697dbb987775bc3198d2215f240f8
md5: 436c165519e140cb08d246a4472a9d6a
depends:
- brotli-python >=1.0.9
- h2 >=4,<5
- pysocks >=1.5.6,<2.0,!=1.5.7
- python >=3.9
- zstandard >=0.18.0
license: MIT
license_family: MIT
purls:
- pkg:pypi/urllib3?source=hash-mapping
size: 101735
timestamp: 1750271478254
- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda
sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b
md5: 28f4ca1e0337d0f27afb8602663c5723
depends:
- vc14_runtime >=14.44.35208
track_features:
- vc14
license: BSD-3-Clause
license_family: BSD
purls: []
size: 18249
timestamp: 1753739241465
- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda
sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f
md5: 603e41da40a765fd47995faa021da946
depends:
- ucrt >=10.0.20348.0
- vcomp14 14.44.35208 h818238b_31
constrains:
- vs2015_runtime 14.44.35208.* *_31
license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime
license_family: Proprietary
purls: []
size: 682424
timestamp: 1753739239305
- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda
sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4
md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3
depends:
- ucrt >=10.0.20348.0
constrains:
- vs2015_runtime 14.44.35208.* *_31
license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime
license_family: Proprietary
purls: []
size: 113963
timestamp: 1753739198723
- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda
sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f
md5: 46e441ba871f524e2b067929da3051c2
depends:
- __win
- python >=3.9
license: LicenseRef-Public-Domain
purls:
- pkg:pypi/win-inet-pton?source=hash-mapping
size: 9555
timestamp: 1733130678956
- conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.25.0-py311hf893f09_0.conda
sha256: 3b66d3cb738a9993e8432d1a03402d207128166c4ef0c928e712958e51aff325
md5: d26077d20b4bba54f4c718ed1313805f
depends:
- python
- cffi >=1.11
- zstd >=1.5.7,<1.5.8.0a0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- ucrt >=10.0.20348.0
- vc >=14.3,<15
- vc14_runtime >=14.44.35208
- ucrt >=10.0.20348.0
- zstd >=1.5.7,<1.6.0a0
- python_abi 3.11.* *_cp311
license: BSD-3-Clause
license_family: BSD
purls:
- pkg:pypi/zstandard?source=hash-mapping
size: 375866
timestamp: 1757930134099
- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-hbeecb71_2.conda
sha256: bc64864377d809b904e877a98d0584f43836c9f2ef27d3d2a1421fa6eae7ca04
md5: 21f56217d6125fb30c3c3f10c786d751
depends:
- libzlib >=1.3.1,<2.0a0
- ucrt >=10.0.20348.0
- vc >=14.2,<15
- vc14_runtime >=14.29.30139
license: BSD-3-Clause
license_family: BSD
purls: []
size: 354697
timestamp: 1742433568506

View File

@ -0,0 +1,19 @@
[project]
authors = ["Dominik Jain <dominik.jain@outlook.com>"]
channels = ["conda-forge"]
description = "Add a short description here"
name = "prepare-api-docs"
platforms = ["win-64"]
version = "0.1.0"
[tasks]
[dependencies]
python = "3.11.*"
pixi-pycharm = ">=0.0.9,<0.0.10"
beautifulsoup4 = ">=4.13.5,<5"
markdownify = ">=1.1.0,<2"
requests = ">=2.32.5,<3"
[pypi-dependencies]
sensai-utils = ">=1.5.0, <2"

View File

@ -0,0 +1,119 @@
import os
from pathlib import Path
import requests
from bs4 import BeautifulSoup
from markdownify import MarkdownConverter
from sensai.util import logging
log = logging.getLogger(__name__)
class PenpotAPIContentMarkdownConverter(MarkdownConverter):
"""
Markdown converter for Penpot API docs, specifically for the .col-content element
"""
def process_tag(self, node, parent_tags=None):
soup = BeautifulSoup(str(node), "html.parser")
# skip breadcrumbs
if "class" in node.attrs and "tsd-breadcrumb" in node.attrs["class"]:
return ""
# convert h3 and h4 to plain text
if node.name in ["h5", "h4"]:
return soup.get_text()
text = soup.get_text()
# convert tags for "Readonly" and "Optional" designations
if node.name == "code" and "class" in node.attrs and "tsd-tag" in node.attrs["class"]:
return ""
# skip buttons (e.g. "Copy")
if node.name == "button":
return ""
# skip links to definitions in <li> elements
if node.name == "li" and text.startswith("Defined in"):
return ""
# for links, just return the text
if node.name == "a":
return text
# skip inheritance information
if node.name == "p" and text.startswith("Inherited from"):
return ""
# remove index with links
if "class" in node.attrs and "tsd-index-content" in node.attrs["class"]:
return ""
# convert <pre> blocks to markdown code blocks
if node.name == "pre":
return f"\n```\n{text.strip()}\n```\n\n"
# convert tsd-signature elements to code blocks, converting <br> to newlines
if "class" in node.attrs and "tsd-signature" in node.attrs["class"]:
for br in soup.find_all("br"):
br.replace_with("\n")
return f"\n```\n{soup.get_text()}\n```\n\n"
# other cases: use the default processing
return super().process_tag(node, parent_tags=parent_tags)
class PenpotAPIDocsProcessor:
def __init__(self):
self.md_converter = PenpotAPIContentMarkdownConverter()
self.base_url = "https://penpot-plugins-api-doc.pages.dev"
self.pages = {}
def run(self, target_dir: str):
os.makedirs(target_dir, exist_ok=True)
# find links
modules_page = self._fetch("modules")
soup = BeautifulSoup(modules_page, "html.parser")
content = soup.find(attrs={"class": "col-content"})
links = content.find_all("a", href=True)
# process each link, converting interface and type pages to markdown
for link in links:
href = link['href']
if href.startswith("interfaces/") or href.startswith("types/"):
page_name = href.split("/")[-1].replace(".html", "")
log.info("Processing page: %s", page_name)
page_md = self._process_page(href)
# save to md file
md_path = os.path.abspath(os.path.join(target_dir, f"{page_name}.md"))
log.info("Writing %s", md_path)
with open(md_path, "w", encoding="utf-8") as f:
f.write(page_md)
def _fetch(self, rel_url: str) -> str:
response = requests.get(f"{self.base_url}/{rel_url}")
if response.status_code != 200:
raise Exception(f"Failed to retrieve page: {response.status_code}")
html_content = response.text
return html_content
def _process_page(self, rel_url: str):
html_content = self._fetch(rel_url)
soup = BeautifulSoup(html_content, "html.parser")
content = soup.find(attrs={"class": "col-content"})
markdown = self.md_converter.convert(str(content))
return markdown
def main():
target_dir = Path(__file__).parent.parent / "mcp-server" / "data" / "api"
PenpotAPIDocsProcessor().run(target_dir=str(target_dir))
if __name__ == '__main__':
logging.run_main(main)