init
This commit is contained in:
commit
b049bf5ea0
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
__pycache__/
|
||||
*.egg-info/
|
||||
build/
|
||||
dist/
|
||||
*.pyc
|
||||
*.swp
|
||||
*~
|
24
LICENSE
Normal file
24
LICENSE
Normal file
@ -0,0 +1,24 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org/>
|
83
README.md
Normal file
83
README.md
Normal file
@ -0,0 +1,83 @@
|
||||
# markdown-alerts
|
||||
|
||||
Python-Markdown Admonition alternative extension with a shortened syntax. Depends [Python-Markdown](https://pypi.org/project/Markdown/).
|
||||
|
||||
This extension supports one-line and multi-line text. The end of the remark block is an empty line.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
:::info This is an one-line admonition!
|
||||
|
||||
:::info This is a
|
||||
multi-line
|
||||
admonition!
|
||||
|
||||
:::info
|
||||
It works too!
|
||||
|
||||
This paragraph is not an admonition's part.
|
||||
```
|
||||
|
||||
There can be an arbitrary number of spaces between the admonition start character `:::` and the admonition type designation.
|
||||
|
||||
Supported admonition types:
|
||||
|
||||
```
|
||||
:::info
|
||||
:::note
|
||||
:::tip
|
||||
:::success
|
||||
:::warning
|
||||
:::danger
|
||||
```
|
||||
|
||||
## Installation and usage
|
||||
|
||||
Installation:
|
||||
|
||||
```
|
||||
pip install markdown-alerts
|
||||
```
|
||||
|
||||
Usage:
|
||||
|
||||
```python
|
||||
from markdown import Markdown
|
||||
|
||||
html = Markdown(extensions=['markdown_alerts'])
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
By default, the extension installs the following CSS classes for div blocks. For example for `:::note`:
|
||||
|
||||
```html
|
||||
<div class="alert note">
|
||||
<p>This is note!</p>
|
||||
</div>
|
||||
```
|
||||
|
||||
You can override these classes by adding your own configuration. Example for **Bootstrap 5**:
|
||||
|
||||
```python
|
||||
ext_configs = {
|
||||
'markdown_alerts': {
|
||||
'info': 'alert alert-info',
|
||||
'note': 'alert alert-primary',
|
||||
'tip': 'alert alert-success',
|
||||
'success': 'alert alert-success',
|
||||
'warning': 'alert alert-warning',
|
||||
'danger': 'alert alert-danger'
|
||||
}
|
||||
}
|
||||
|
||||
html = Markdown(
|
||||
extensions=['markdown_alerts'],
|
||||
extension_configs=ext_configs
|
||||
)
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This software is provided under The Unlicense. See [LICENSE](LICENSE) for details.
|
79
markdown_alerts.py
Normal file
79
markdown_alerts.py
Normal file
@ -0,0 +1,79 @@
|
||||
"""Python-Markdown Admonition alternative extension
|
||||
with a shortened syntax.
|
||||
"""
|
||||
|
||||
__version__ = '0.1'
|
||||
|
||||
import re
|
||||
import xml.etree.ElementTree as etree
|
||||
|
||||
from markdown.extensions import Extension
|
||||
from markdown.blockprocessors import BlockProcessor
|
||||
|
||||
|
||||
# Patterns
|
||||
alerts = {
|
||||
'info': r'::: *info',
|
||||
'note': r'::: *note',
|
||||
'tip': r'::: *tip',
|
||||
'success': r'::: *success',
|
||||
'warning': r'::: *warning',
|
||||
'danger': r'::: *danger'
|
||||
}
|
||||
|
||||
default_config = {
|
||||
'info' : ['alert info', 'CSS class for Info block.'],
|
||||
'note' : ['alert note', 'CSS class for Note block.'],
|
||||
'tip' : ['alert tip', 'CSS class for Tip block.'],
|
||||
'success' : ['alert success', 'CSS class for Success block.'],
|
||||
'warning' : ['alert warning', 'CSS class for Warning block.'],
|
||||
'danger' : ['alert danger', 'CSS class for Danger block.'],
|
||||
}
|
||||
|
||||
class AlertsBlockProcessor(BlockProcessor):
|
||||
|
||||
def __init__(self, parser, alert, alert_css_class):
|
||||
self.parser = parser
|
||||
self.tab_length = parser.md.tab_length
|
||||
self.alert = alert
|
||||
self.alert_css_class = alert_css_class
|
||||
|
||||
def test(self, parent, block):
|
||||
return re.match(alerts[self.alert], block)
|
||||
|
||||
def run(self, parent, blocks):
|
||||
original_block = blocks[0]
|
||||
blocks[0] = re.sub(alerts[self.alert], '', blocks[0])
|
||||
|
||||
for block_num, block in enumerate(blocks):
|
||||
if re.search(r' *\n?$', block):
|
||||
e = etree.SubElement(parent, 'div')
|
||||
e.set('class', self.alert_css_class)
|
||||
self.parser.parseBlocks(e, blocks[0:block_num + 1])
|
||||
for i in range(0, block_num + 1):
|
||||
blocks.pop(0)
|
||||
return True
|
||||
blocks[0] = original_block
|
||||
return False
|
||||
|
||||
class AlertsExtension(Extension):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
self.config = default_config
|
||||
super(AlertsExtension, self).__init__(**kwargs)
|
||||
|
||||
def extendMarkdown(self, md):
|
||||
priority = 105
|
||||
for alert in alerts.keys():
|
||||
priority += 10
|
||||
md.parser.blockprocessors.register(
|
||||
AlertsBlockProcessor(md.parser, alert, self.getConfig(alert)),
|
||||
alert + '-alert',
|
||||
priority
|
||||
)
|
||||
|
||||
def makeExtension(**kwargs):
|
||||
return AlertsExtension(**kwargs)
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
23
setup.py
Normal file
23
setup.py
Normal file
@ -0,0 +1,23 @@
|
||||
from setuptools import setup
|
||||
|
||||
|
||||
with open('README.md', 'r') as description:
|
||||
long_description = description.read()
|
||||
|
||||
setup(
|
||||
name='markdown-alerts',
|
||||
version='0.1',
|
||||
author='gd',
|
||||
description='Python-Markdown Admonition alternative.',
|
||||
long_description=long_description,
|
||||
long_description_content_type='text/markdown',
|
||||
url='https://gitea.gch.icu/gd/markdown-alerts/',
|
||||
classifiers=[
|
||||
"Programming Language :: Python :: 3.9",
|
||||
"License :: OSI Approved :: The Unlicense (Unlicense)",
|
||||
"Operating System :: OS Independent",
|
||||
],
|
||||
python_requires='>=3.6',
|
||||
py_modules=['markdown_alerts'],
|
||||
install_requires = ['markdown>=3.0'],
|
||||
)
|
Loading…
Reference in New Issue
Block a user