anki web & md
This commit is contained in:
		
							parent
							
								
									6819c23a89
								
							
						
					
					
						commit
						48a803f8f3
					
				
							
								
								
									
										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 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user