63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
from typing import Callable
|
|
|
|
SourceMappingFunction = Callable[[str], str]
|
|
|
|
class UrlMappingRegister:
|
|
def __init__(self) -> None:
|
|
self.startsWith_patterns: dict[str, SourceMappingFunction] = {}
|
|
|
|
def startsWith(self, start: str) -> Callable[[SourceMappingFunction], SourceMappingFunction]:
|
|
def register(start_name: str, func: SourceMappingFunction) -> SourceMappingFunction:
|
|
self.startsWith_patterns[start_name] = func
|
|
return func
|
|
return lambda func: register(start, func)
|
|
|
|
def url_from_mapping(self, source: str) -> str:
|
|
source = source.lstrip('.').lstrip('/')
|
|
for pattern in self.startsWith_patterns:
|
|
func = self.startsWith_patterns[pattern]
|
|
if source.startswith(pattern):
|
|
try:
|
|
return func(source)
|
|
except Exception as e:
|
|
return ''
|
|
|
|
urlmapping = UrlMappingRegister()
|
|
|
|
# 样例: docs/kirigaya.cn/129.md
|
|
# 目标: https://kirigaya.cn/blog/article?seq=129
|
|
@urlmapping.startsWith('docs/kirigaya.cn')
|
|
def kirigaya_cn(source: str) -> str:
|
|
markdown_name = source.replace('docs/kirigaya.cn/', '')
|
|
article_id = int(markdown_name.split('.')[0])
|
|
template = f'https://kirigaya.cn/blog/article?seq={article_id}'
|
|
return template
|
|
|
|
|
|
# 样例: docs/digital-document/guide/quick-start.md
|
|
# 目标: https://sterben.nitcloud.cn/zh/guide/quick-start.html
|
|
@urlmapping.startsWith('docs/digital-document')
|
|
def digital_document(source: str) -> str:
|
|
router = source.replace('docs/digital-document', 'https://sterben.nitcloud.cn/zh')
|
|
if router.endswith('.md'):
|
|
router = router.replace('.md', '.html')
|
|
return router
|
|
|
|
|
|
# 样例: docs/digital-issue/issue-2/issue.md
|
|
# 目标: https://github.com/Digital-EDA/Digital-IDE/issues/2
|
|
@urlmapping.startsWith('docs/digital-issue')
|
|
def digital_document(source: str) -> str:
|
|
parts = source.split('/')
|
|
issue_id = parts[2].split('-')[-1]
|
|
router = f'https://github.com/Digital-EDA/Digital-IDE/issues/{issue_id}'
|
|
return router
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print(kirigaya_cn('docs/kirigaya.cn/129.md'))
|
|
print(kirigaya_cn('docs/kirigaya.cn/21.md'))
|
|
|
|
print(digital_document('docs/digital-document/guide/quick-start.md'))
|
|
print(digital_document('docs/digital-document/guide/pm-project-building.md'))
|
|
|