Compare commits
2 Commits
cce8bf0f76
...
48a803f8f3
| Author | SHA1 | Date | |
|---|---|---|---|
| 48a803f8f3 | |||
| 6819c23a89 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -119,3 +119,4 @@ README.txt
|
||||
|
||||
# idea ide
|
||||
/.idea
|
||||
*.lnk
|
||||
|
||||
487
addons21/fastmd/md/音标.md
Normal file
487
addons21/fastmd/md/音标.md
Normal file
@ -0,0 +1,487 @@
|
||||
# 单元音
|
||||
## [ɑ:]
|
||||
### tags
|
||||
- 长元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- car
|
||||
- glass
|
||||
|
||||
## [ʌ]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- bus
|
||||
- mother
|
||||
|
||||
## [ɔ:]
|
||||
### tags
|
||||
- 长元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- ball
|
||||
- horse
|
||||
|
||||
## [ɒ]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- dog
|
||||
- wash
|
||||
|
||||
## [ɜ:]
|
||||
### tags
|
||||
- 长元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- bird
|
||||
- nurse
|
||||
|
||||
## [ə]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- tiger
|
||||
- sofa
|
||||
## [i:]
|
||||
### tags
|
||||
- 长元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- bee
|
||||
- sea
|
||||
|
||||
## [ɪ]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- pig
|
||||
- kid
|
||||
|
||||
## [u:]
|
||||
### tags
|
||||
- 长元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- school
|
||||
- shoe
|
||||
|
||||
## [ʊ]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- book
|
||||
- foot
|
||||
|
||||
## [æ]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- cat
|
||||
- bag
|
||||
|
||||
## [e]
|
||||
### tags
|
||||
- 短元音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- bed
|
||||
- head
|
||||
|
||||
# 双元音
|
||||
## [aɪ]
|
||||
### tags
|
||||
- [ɪ]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- eye
|
||||
- rice
|
||||
## [eɪ]
|
||||
### tags
|
||||
- [ɪ]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- cake
|
||||
- rain
|
||||
## [ɔɪ]
|
||||
### tags
|
||||
- [ɪ]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- boy
|
||||
- toy
|
||||
## [ɪə]
|
||||
### tags
|
||||
- [ə]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- ear
|
||||
- hear
|
||||
## [eə]
|
||||
### tags
|
||||
- [ə]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- pear
|
||||
- bear
|
||||
## [ʊə]
|
||||
### tags
|
||||
- [ə]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- tour
|
||||
- poor
|
||||
## [aʊ]
|
||||
### tags
|
||||
- [ʊ]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- cow
|
||||
- house
|
||||
## [əʊ]
|
||||
### tags
|
||||
- [ʊ]结尾
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- coat
|
||||
- snow
|
||||
|
||||
# 爆破音
|
||||
## [p]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- park
|
||||
- sleep
|
||||
|
||||
## [b]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- baby
|
||||
- rubber
|
||||
|
||||
## [t]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- tea
|
||||
- boat
|
||||
|
||||
## [d]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- door
|
||||
- red
|
||||
|
||||
## [k]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- cap
|
||||
- milk
|
||||
|
||||
## [g]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- go
|
||||
- egg
|
||||
|
||||
# 摩擦音
|
||||
## [f]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- fish
|
||||
- phone
|
||||
|
||||
## [v]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- river
|
||||
- five
|
||||
|
||||
## [s]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- sun
|
||||
- ice
|
||||
|
||||
## [z]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- zoo
|
||||
- nose
|
||||
|
||||
## [ʃ]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- sheep
|
||||
- shirt
|
||||
|
||||
## [ʒ]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- television
|
||||
- measure
|
||||
|
||||
## [θ]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- tooth
|
||||
- three
|
||||
|
||||
## [ð]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- they
|
||||
- father
|
||||
|
||||
## [h]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- hair
|
||||
- who
|
||||
|
||||
## [r]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- rose
|
||||
- write
|
||||
|
||||
# 破擦音
|
||||
## [tʃ]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- chair
|
||||
- watch
|
||||
|
||||
## [dʒ]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- jeep
|
||||
- cage
|
||||
|
||||
## [tr]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- tree
|
||||
- train
|
||||
|
||||
## [dr]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- dress
|
||||
- draw
|
||||
|
||||
## [ts]
|
||||
### tags
|
||||
- 清辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- chair
|
||||
- warch
|
||||
|
||||
## [tz]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- hands
|
||||
- cards
|
||||
|
||||
# 发鼻音
|
||||
## [m]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- map
|
||||
- summer
|
||||
|
||||
## [n]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- night
|
||||
- pen
|
||||
|
||||
## [ŋ]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- bank
|
||||
- sing
|
||||
|
||||
# 舌侧音
|
||||
## [I]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- leg
|
||||
- table
|
||||
|
||||
# 半元音
|
||||
## [w]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- water
|
||||
- white
|
||||
|
||||
## [j]
|
||||
### tags
|
||||
- 浊辅音
|
||||
### imgs
|
||||
- 
|
||||
- 
|
||||
### words
|
||||
- yes
|
||||
- yellow
|
||||
150
addons21/fastmd/src/anki.ipynb
Normal file
150
addons21/fastmd/src/anki.ipynb
Normal file
@ -0,0 +1,150 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "cf4f95a8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from service import *"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "d77ecb1b",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"a filename was not supplied (nor was the CookieJar instance initialised with one) failed load cookie_file\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'result': ['Git', '句素', '示例牌组', '系统默认', '英语', '音标'], 'error': None}"
|
||||
]
|
||||
},
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"s = Session()\n",
|
||||
"anki = AnkiClient(s)\n",
|
||||
"anki.make_version()\n",
|
||||
"anki.deckNames()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 68,
|
||||
"id": "d13272f8",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'result': ['Basic', '单词卡', '句素卡', '选择卡', '音标'], 'error': None}"
|
||||
]
|
||||
},
|
||||
"execution_count": 68,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"anki.modelNames()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 69,
|
||||
"id": "b118fa48",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'result': ['word',\n",
|
||||
" 'pronounce',\n",
|
||||
" 'audio',\n",
|
||||
" 'eg.',\n",
|
||||
" 'Header',\n",
|
||||
" 'sentences',\n",
|
||||
" 'synonym',\n",
|
||||
" 'part_of_speech',\n",
|
||||
" 'meanEng',\n",
|
||||
" 'meanEngLong',\n",
|
||||
" 'picture'],\n",
|
||||
" 'error': None}"
|
||||
]
|
||||
},
|
||||
"execution_count": 69,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"anki.modelFieldNames(\"单词卡\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 65,
|
||||
"id": "3a15fe88",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'result': 1692201363325, 'error': None}"
|
||||
]
|
||||
},
|
||||
"execution_count": 65,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"note = {\n",
|
||||
" \"word\":'[ʌ]'\n",
|
||||
"}\n",
|
||||
"param = {\n",
|
||||
" \"deckName\": \"音标\",\n",
|
||||
" \"modelName\": \"单词卡\",\n",
|
||||
" \"options\": { \"allowDuplicate\": False },\n",
|
||||
" \"fields\": note,\n",
|
||||
" \"tags\": ['单元音', '短元音']\n",
|
||||
"}\n",
|
||||
"anki.addNote(param)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.12"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
3
addons21/fastmd/src/md/__init__.py
Normal file
3
addons21/fastmd/src/md/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
from .anki_tree import *
|
||||
from .anki_renderer import *
|
||||
__all__ = ['AnkiRenderer']
|
||||
173
addons21/fastmd/src/md/anki_renderer.py
Normal file
173
addons21/fastmd/src/md/anki_renderer.py
Normal file
@ -0,0 +1,173 @@
|
||||
from typing import Dict, Any
|
||||
from mistune import BaseRenderer, BlockState
|
||||
from .anki_tree import AnkiData
|
||||
# 自定义渲染器来提取标题
|
||||
class AnkiRenderer(BaseRenderer):
|
||||
"""A renderer to re-format Markdown text."""
|
||||
NAME = 'anki'
|
||||
def __init__(self):
|
||||
BaseRenderer.__init__(self)
|
||||
self.anki = AnkiData()
|
||||
def __call__(self, tokens, state: BlockState):
|
||||
self.tokens = tokens
|
||||
self.state = state
|
||||
out = self.render_tokens(tokens, state)
|
||||
# special handle for line breaks
|
||||
out += '\n\n'.join(self.render_referrences(state)) + '\n'
|
||||
return out
|
||||
|
||||
def render_referrences(self, state: BlockState):
|
||||
ref_links = state.env['ref_links']
|
||||
for key in ref_links:
|
||||
attrs = ref_links[key]
|
||||
text = '[' + attrs['label'] + ']: ' + attrs['url']
|
||||
title = attrs.get('title')
|
||||
if title:
|
||||
text += ' "' + title + '"'
|
||||
yield text
|
||||
|
||||
def render_children(self, token, state: BlockState):
|
||||
children = token['children']
|
||||
return self.render_tokens(children, state)
|
||||
|
||||
def text(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return token['raw']
|
||||
|
||||
def emphasis(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return '*' + self.render_children(token, state) + '*'
|
||||
|
||||
def strong(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return '**' + self.render_children(token, state) + '**'
|
||||
|
||||
def link(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
label = token.get('label')
|
||||
text = self.render_children(token, state)
|
||||
out = '[' + text + ']'
|
||||
if label:
|
||||
return out + '[' + label + ']'
|
||||
|
||||
attrs = token['attrs']
|
||||
url = attrs['url']
|
||||
title = attrs.get('title')
|
||||
if text == url and not title:
|
||||
return '<' + text + '>'
|
||||
elif 'mailto:' + text == url and not title:
|
||||
return '<' + text + '>'
|
||||
|
||||
out += '('
|
||||
if '(' in url or ')' in url:
|
||||
out += '<' + url + '>'
|
||||
else:
|
||||
out += url
|
||||
if title:
|
||||
out += ' "' + title + '"'
|
||||
return out + ')'
|
||||
|
||||
def image(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return '!' + self.link(token, state)
|
||||
|
||||
def codespan(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return '`' + token['raw'] + '`'
|
||||
|
||||
def linebreak(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return ' \n'
|
||||
|
||||
def softbreak(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return '\n'
|
||||
|
||||
def blank_line(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return ''
|
||||
|
||||
def inline_html(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return token['raw']
|
||||
|
||||
def paragraph(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
text = self.render_children(token, state)
|
||||
return text + '\n\n'
|
||||
|
||||
def heading(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
level = token['attrs']['level']
|
||||
marker = '#' * level
|
||||
text = self.render_children(token, state)
|
||||
self.anki.enterScope(text , level)
|
||||
return marker + ' ' + text + '\n\n'
|
||||
|
||||
def thematic_break(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return '***\n\n'
|
||||
|
||||
def block_text(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return self.render_children(token, state) + '\n'
|
||||
|
||||
def block_code(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
attrs = token.get('attrs', {})
|
||||
info = attrs.get('info', '')
|
||||
code = token['raw']
|
||||
if code and code[-1] != '\n':
|
||||
code += '\n'
|
||||
|
||||
marker = token.get('marker')
|
||||
if not marker:
|
||||
marker = _get_fenced_marker(code)
|
||||
return marker + info + '\n' + code + marker + '\n\n'
|
||||
|
||||
def block_quote(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
text = indent(self.render_children(token, state), '> ')
|
||||
return text + '\n\n'
|
||||
|
||||
def block_html(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return token['raw'] + '\n\n'
|
||||
|
||||
def block_error(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
return ''
|
||||
def _render_list_item(self, renderer, parent, item, state):
|
||||
leading = parent['leading']
|
||||
text = ''
|
||||
for tok in item['children']:
|
||||
if tok['type'] == 'list':
|
||||
tok['parent'] = parent
|
||||
elif tok['type'] == 'blank_line':
|
||||
continue
|
||||
text += renderer.render_token(tok, state)
|
||||
|
||||
lines = text.splitlines()
|
||||
text = (lines[0] if lines else '') + '\n'
|
||||
self.anki.appendAttr(lines[0] if lines else '')
|
||||
prefix = ' ' * len(leading)
|
||||
for line in lines[1:]:
|
||||
if line:
|
||||
text += prefix + line + '\n'
|
||||
else:
|
||||
text += '\n'
|
||||
return leading + text
|
||||
def _render_ordered_list(self, renderer, token, state):
|
||||
attrs = token['attrs']
|
||||
start = attrs.get('start', 1)
|
||||
for item in token['children']:
|
||||
leading = str(start) + token['bullet'] + ' '
|
||||
parent = {
|
||||
'leading': leading,
|
||||
'tight': token['tight'],
|
||||
}
|
||||
yield self._render_list_item(renderer, parent, item, state)
|
||||
start += 1
|
||||
def _render_unordered_list(self, renderer, token, state):
|
||||
parent = {
|
||||
'leading': token['bullet'] + ' ',
|
||||
'tight': token['tight'],
|
||||
}
|
||||
for item in token['children']:
|
||||
yield self._render_list_item(renderer, parent, item, state)
|
||||
def list(self, token: Dict[str, Any], state: BlockState) -> str:
|
||||
attrs = token['attrs']
|
||||
if attrs['ordered']:
|
||||
children = self._render_ordered_list(renderer, token, state)
|
||||
else:
|
||||
children = self._render_unordered_list(renderer, token, state)
|
||||
|
||||
text = ''.join(children)
|
||||
parent = token.get('parent')
|
||||
if parent:
|
||||
if parent['tight']:
|
||||
return text
|
||||
return text + '\n'
|
||||
return text + '\n'
|
||||
45
addons21/fastmd/src/md/anki_tree.py
Normal file
45
addons21/fastmd/src/md/anki_tree.py
Normal file
@ -0,0 +1,45 @@
|
||||
class AnkiTree:
|
||||
def __init__(self, name, level, parent = None):
|
||||
self.childList = []
|
||||
self.attrList = []
|
||||
self.name = name
|
||||
self.level = level
|
||||
self.parent = parent
|
||||
pass
|
||||
def push(self, name, level):
|
||||
child = AnkiTree(name, level, self)
|
||||
self.childList.append(child)
|
||||
return child
|
||||
def appendAttr(self, attr):
|
||||
self.attrList.append(attr)
|
||||
class AnkiData:
|
||||
def __init__(self):
|
||||
self.tree = AnkiTree("root", 0)
|
||||
self.node = self.tree
|
||||
pass
|
||||
def parse(self, tree, parent):
|
||||
tags = []
|
||||
tags.append(parent.name)
|
||||
note = {"name":tree.name , "tags":tags}
|
||||
for child in tree.childList:
|
||||
if child.name not in note:
|
||||
note[child.name] = []
|
||||
for attr in child.attrList:
|
||||
note[child.name].append(attr)
|
||||
return note
|
||||
def __call__(self):
|
||||
tree = self.tree
|
||||
note_list = []
|
||||
for child in tree.childList:
|
||||
for child2 in child.childList:
|
||||
note = self.parse(child2, child)
|
||||
note_list.append(note)
|
||||
return note_list
|
||||
def enterScope(self, name, level):
|
||||
while self.node:
|
||||
if self.node.level < level:
|
||||
self.node = self.node.push(name, level)
|
||||
return
|
||||
self.node = self.node.parent
|
||||
def appendAttr(self, attr):
|
||||
self.node.appendAttr(attr)
|
||||
3
addons21/fastmd/src/service/__init__.py
Normal file
3
addons21/fastmd/src/service/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
from .http import *
|
||||
from .anki_client import *
|
||||
__all__ = ['AnkiClient', 'Session', 'Http']
|
||||
23
addons21/fastmd/src/service/anki_client.py
Normal file
23
addons21/fastmd/src/service/anki_client.py
Normal file
@ -0,0 +1,23 @@
|
||||
from .http import *
|
||||
class AnkiClient(Http):
|
||||
def __init__(self, session):
|
||||
Http.__init__(self, session)
|
||||
self.url = 'http://127.0.0.1:8765'
|
||||
self.version = None
|
||||
def api(self, data):
|
||||
if self.version:
|
||||
data["version"] = self.version
|
||||
data = json.dumps(data)
|
||||
res = self._post(self.url, data)
|
||||
return json.loads(res)
|
||||
def make_version(self):
|
||||
self.version = self.api({"action":"version"})
|
||||
return self.version
|
||||
def deckNames(self):
|
||||
return self.api({"action":"deckNames"})
|
||||
def modelNames(self):
|
||||
return self.api({"action":"modelNames"})
|
||||
def modelFieldNames(self, modelName):
|
||||
return self.api({"action":"modelFieldNames", "params" :{"modelName" : modelName}})
|
||||
def addNote(self, note):
|
||||
return self.api({"action":"addNote", "params" : {"note": note}})
|
||||
35
addons21/fastmd/src/service/http.py
Normal file
35
addons21/fastmd/src/service/http.py
Normal file
@ -0,0 +1,35 @@
|
||||
import json, requests
|
||||
import http.cookiejar as cookielib
|
||||
#from utils import singleton
|
||||
class Session(requests.Session):
|
||||
def __init__(self,headers={},cookie_file=None):
|
||||
requests.Session.__init__(self)
|
||||
self.cookies = cookielib.LWPCookieJar(filename=cookie_file)
|
||||
try:self.cookies.load(ignore_discard=True)
|
||||
except Exception as e:print(e,"failed load cookie_file")
|
||||
self.headers=headers
|
||||
self.auth = ('user', 'pass')
|
||||
self._type='str'
|
||||
def save(self):
|
||||
self.cookies.save()
|
||||
class Http():
|
||||
def __init__(self , session):
|
||||
self.session = session
|
||||
def _get(self, url, data = None):
|
||||
r = self.session.get(url, params = data)
|
||||
self._error(r.status_code,url)
|
||||
return self._res_data(r,self.session._type)
|
||||
|
||||
def _post(self, url, data):
|
||||
r = self.session.post(url, data = data)
|
||||
self._error(r.status_code, url)
|
||||
return self._res_data(r, self.session._type)
|
||||
|
||||
def _error(self, code, url):
|
||||
if code==200:return
|
||||
elif code==403:raise RuntimeError('403 - Forbidden '+url)
|
||||
elif code==404:raise RuntimeError('404 - Not Found '+url)
|
||||
|
||||
def _res_data(self, res, _type):
|
||||
if _type=='json':return json.loads(res.content)
|
||||
return res.content
|
||||
89
addons21/fastmd/src/音标.ipynb
Normal file
89
addons21/fastmd/src/音标.ipynb
Normal file
@ -0,0 +1,89 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d9ed21dd",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import mistune\n",
|
||||
"from md import *\n",
|
||||
"with open(\"./md/音标.md\",\"r\", encoding='utf-8')as f:\n",
|
||||
" data = f.read()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "c39beca4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# 创建解析器并解析Markdown\n",
|
||||
"renderer = AnkiRenderer()\n",
|
||||
"md = mistune.create_markdown(renderer=renderer)\n",
|
||||
"text = md(data)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "dc4eff8d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"note_list = renderer.anki()\n",
|
||||
"import json\n",
|
||||
"with open('data.json', 'w', encoding=\"utf8\") as f:\n",
|
||||
" json.dump(note_list, f)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "d75276bc",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'name': '[ʌ]',\n",
|
||||
" 'tags': ['单元音', '短元音'],\n",
|
||||
" 'imgs': ['',\n",
|
||||
" ''],\n",
|
||||
" 'words': ['bus', 'mother']}"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"note_list[1]"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.12"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@ -391,8 +391,7 @@ class TabContent(QScrollArea):
|
||||
name = fld['name']
|
||||
if maps:
|
||||
for j, each in enumerate(maps):
|
||||
if each.get('fld_ord', -1) == ord or each.get(
|
||||
'fld_name', '') == name:
|
||||
if each.get('fld_name', '') == name:
|
||||
each['fld_name'] = name
|
||||
each['fld_ord'] = ord
|
||||
self.add_dict_layout(j, **each)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user