Commit 2123a11c authored by gaojiuli's avatar gaojiuli

init

parent e6ac1409
...@@ -5,7 +5,4 @@ Convert HTML to Markdown. ...@@ -5,7 +5,4 @@ Convert HTML to Markdown.
from tomd import Tomd from tomd import Tomd
Tomd('<h1>title</h1>').markdown Tomd('<h1>title</h1>').markdown
Tomd('<h1>title</h1>','h1').markdown
Tomd('https://github.com').markdown
Tomd('https://github.com','.title .content').markdown
``` ```
from tomd import Tomd from tomd import Tomd
string = """ string = """
<div class="markdown_body"><p>XData</p> <div class="article fmt article__content" data-id="1190000009562674" data-license="cc">
<p>Github: <a href="https://github.com/gaojiuli/xdata" rel="nofollow">https://github.com/gaojiuli/xdata</a></p>
<p>一款非常实用的数据验证工具, 通常用于请求数据的验证.</p> <h2 id="articleHeader0">写在前面</h2>
<h2>Features</h2> <p>JavaScript 深入系列共计 15 篇已经正式完结,这是一个旨在帮助大家,其实也是帮助自己捋顺 JavaScript 底层知识的系列。重点讲解了如原型、作用域、执行上下文、变量对象、this、闭包、按值传递、call、apply、bind、new、继承等 JS 语言中的比较难懂的概念。</p>
<ul> <p>JavaScript 深入系列自 4 月 6 日发布第一篇文章,到 5 月 12 日发布最后一篇,感谢各位朋友的收藏、点赞,鼓励、指正。</p>
<li>验证数据一步到位</li> <p>顺便宣传一下该博客的 Github 仓库:<a href="https://github.com/mqyqingfeng/Blog" target="_blank">https://github.com/mqyqingfeng/Blog</a>,欢迎 star,鼓励一下作者。</p>
<li>容易扩展,容易自定义数据类型以及验证方式</li> <p>而此篇,作为深入系列的总结篇,除了汇总各篇文章,作为目录篇之外,还希望跟大家聊聊,我为什么要写这个系列?</p>
<li>无第三方依赖</li> <h2 id="articleHeader1">我为什么要写深入系列?</h2>
</ul> <p>讲一个对我学技术的态度很有影响的一件事情。</p>
<h2>Required</h2> <p>曾经团队邀请过 Nodejs 领域一个非常著名的大神来分享,这里便不说是谁了。当知道是他后,简直是粉丝的心情。但是课讲得确实一般,也许是第一次讲,准备不是很充足吧,以至于我都觉得我能讲得比他好,但是有两次,让我觉得这是真正的大神。一次就是,当有同事问到今年有什么流行的前端框架吗?这些框架有怎样的适用场景?该如何抉择?我以为大神一定会回答当时正火的 React、以及小鲜肉 Vue 之类,然后老生常谈的比较一番,但是他回答道:“I dont't care!因为这些并不重要,真正重要的是底层,当你了解了底层,你就能很轻松的明白这些框架的原理,当你明白了原理,这些框架又有什么意思呢?”</p>
<ul> <p>虽然这段话因为过去太久,已经不记得确切的表述,但是给了我非常深刻的印象,自己一路学习过来,新的东西不停的冒出,但是学的再多感觉自己也只是学了一堆 API,如果仅仅是为了解决工作上的问题,或许已经足够,但是内心经常还会冒出一种不安定感,这种不安定感或许来自于对 JavaScript 未知部分的恐惧,或许来自于解决问题却不明所以的尴尬,或许来自于屡次学习语言难点却不得门道的失败……代码写的越久,这种感觉就越是鲜明。</p>
<li>python &gt;= 3.5</li> <p>当然了,大家也不要过分解读底层,各种计算机语言追究到底层都是编译原理之类,如果是有这方面的兴趣,固然可以,但是如果本质上还是为了解决上层问题,倒不必一定要深究到这个层面。用 JavaScript 了解这门语言本身的使用和原理,用 jQuery 看看 jQuery 的源码实现,用 React 技术栈,写写 React、Redux 简单的模拟实现,诸如此类,都是对底层的一种追求。</p>
</ul> <p>这样讲的话,底层这个词,更像是一个方向,一种学习的态度吧。</p>
<h2>Installation</h2> <p>为了更加深入的了解 JavaScript 这门语言,我将之前记录的一些要学习的关键词作为课题进行研究,后来研究的差不多了,才决定动笔写下这个系列。尽管这个系列很多地方上依然不够所谓的“深入”,但就跟学习这些内容之前的我相比,已然多了份安定感,解决一些问题时也多了份得心应手,也希望大家能从这个系列中有所收获。</p>
<p><code>pip install xdata</code></p> <p>然而即便已经写了 15 篇,也只是漫长路途的开始,在我 Github 博客仓库的描述中有写到,我预计写 4 个系列,JavaScript 深入系列,JavaScript 专题系列,ES6 系列,React 系列,其实从“深入系列”到“专题系列”再到“ React 系列”,就是原来写着上层的我决定从语言层面开始一步一步走回上层的记录,而现在,我也只是迈出了第一步。</p>
<h2>Usage</h2> <h2 id="articleHeader2">重新修订</h2>
<h3>ValidatedData</h3> <p>在发布完最后一篇后,我花了一周时间,根据大家的评论和留言,并且参照阮一峰老师的<a href="https://github.com/ruanyf/document-style-guide" target="_blank">《中文技术文档的写作规范》</a>对所有的文章进行了一次修订。</p>
<pre><code class="hljs python"><span class="hljs-keyword">from</span> xdata <span class="hljs-keyword">import</span> * <p>说起来,改的最多的就是给英文单词两边加个空格……</p>
<p>此外,大家有疑问或指正或鼓励或感谢,尽管留言回复哈 []~( ̄▽ ̄)~* 。</p>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserSchema</span><span class="hljs-params">(Schema)</span>:</span> <h2 id="articleHeader3">全目录</h2>
telephone = Str(length=<span class="hljs-number">11</span>, required=<span class="hljs-keyword">True</span>) <ol>
password = Str(min_length=<span class="hljs-number">8</span>,max_length=<span class="hljs-number">16</span>, required=<span class="hljs-keyword">True</span>) <li><p><a href="https://segmentfault.com/a/1190000008959943">JavaScirpt深入之从原型到原型链</a></p></li>
<li><p><a href="https://segmentfault.com/a/1190000008972987" target="_blank">JavaScript深入之词法作用域和动态作用域</a></p></li>
request_data = { <li><p><a href="https://segmentfault.com/a/1190000009006005">JavaScript深入之执行上下文栈</a></p></li>
<span class="hljs-string">'telephone'</span>:<span class="hljs-string">'18180050000'</span>, <li><p><a href="https://segmentfault.com/a/1190000009018898" target="_blank">JavaScript深入之变量对象</a></p></li>
<span class="hljs-string">'password'</span>:<span class="hljs-string">'idonotknow'</span> <li><p><a href="https://segmentfault.com/a/1190000009035308">JavaScript深入之作用域链</a></p></li>
} <li><p><a href="https://segmentfault.com/a/1190000009048715" target="_blank">JavaScript深入之从ECMAScript规范解读this</a></p></li>
<li><p><a href="https://segmentfault.com/a/1190000009063218">JavaScript深入之执行上下文</a></p></li>
schema = UserSchema(request_data) <li><p><a href="https://segmentfault.com/a/1190000009215716" target="_blank">JavaScript深入之闭包</a></p></li>
<span class="hljs-keyword">if</span> schema.valid: <li><p><a href="https://segmentfault.com/a/1190000009229025">JavaScript深入之参数按值传递</a></p></li>
print(schema.validated_data) <span class="hljs-comment"># {'telephone': '18180050000', 'password': 'idonotknow'}</span> <li><p><a href="https://segmentfault.com/a/1190000009257663" target="_blank">JavaScript深入之call和apply的模拟实现</a></p></li>
<li><p><a href="https://segmentfault.com/a/1190000009271416">JavaScript深入之bind的模拟实现</a></p></li>
</code></pre> <li><p><a href="https://segmentfault.com/a/1190000009286643" target="_blank">JavaScript深入之new的模拟实现</a></p></li>
<h3>Errors</h3> <li><p><a href="https://segmentfault.com/a/1190000009328344">JavaScript深入之类数组对象与arguments</a></p></li>
<pre><code class="hljs python"><span class="hljs-keyword">from</span> xdata <span class="hljs-keyword">import</span> * <li><p><a href="https://segmentfault.com/a/1190000009359984" target="_blank">JavaScript深入之创建对象的多种方式以及优缺点</a></p></li>
<li><p><a href="https://segmentfault.com/a/1190000009389979">JavaScript深入之继承的多种方式以及优缺点</a></p></li>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserSchema</span><span class="hljs-params">(Schema)</span>:</span> </ol>
telephone = Str(length=<span class="hljs-number">11</span>, required=<span class="hljs-keyword">True</span>) <h2 id="articleHeader4">作者推荐</h2>
password = Str(min_length=<span class="hljs-number">8</span>, max_length=<span class="hljs-number">16</span>, required=<span class="hljs-keyword">True</span>) <p>在我研究一些课题的时候,有时感觉自己深受启发,颇有醍醐灌顶的感觉,我也希望这个系列的读者能感受到跟作者当初学习这些内容时的一样兴奋的感觉,所以强烈推荐以下三篇:</p>
<ol>
<li><p><a href="https://segmentfault.com/a/1190000009048715" target="_blank">JavaScript深入之从ECMAScript规范解读this</a></p></li>
request_data = {} <li><p><a href="https://segmentfault.com/a/1190000009257663">JavaScript深入之call和apply的模拟实现</a></p></li>
<li><p><a href="https://segmentfault.com/a/1190000009286643" target="_blank">JavaScript深入之new的模拟实现</a></p></li>
schema = UserSchema(request_data) </ol>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> schema.valid: <h2 id="articleHeader5">真的完结?</h2>
print(schema.errors) <span class="hljs-comment"># {'telephone': 'telephone is required', 'password': 'password is required'}</span> <p>JavaScript 底层知识哪有这么一点呐!在不断学习的过程中,还会冒出一些新的课题适合划分到深入系列,如果是这样的话,就会偶尔发布一篇,当然了,如果冒出太多的话,不保证再来一个深入系列第二季,哈哈。</p>
</code></pre> <h2 id="articleHeader6">下期预告</h2>
<h3>DataTypes</h3> <p>一周之内,会发布新的系列即 JavaScript 专题系列,这个系列主要研究日常开发中一些功能点的实现,比如防抖、节流、去重、拷贝、最值、扁平、柯里、递归、乱序、排序等,特点是抄袭 underscore 和 jQuery 的实现方式,而这次预计写二十篇左右。</p>
<pre><code class="hljs lisp">from xdata import * <p>感谢大家的阅读和支持,我是冴羽,JavaScript 专题系列再见啦![]~( ̄▽ ̄)~**</p>
DataType(<span class="hljs-name">required=True</span>,default='<span class="hljs-number">11</span>',choices=[]) </div>
Str(<span class="hljs-name">length=11</span>, max_length=12,min_length=10,regex=<span class="hljs-string">""</span>)
Int(<span class="hljs-name">max=10000</span>,min=12)
Bool(<span class="hljs-name">max=10000</span>,min=12)
Decimal(<span class="hljs-name">left=5</span>,right=2)
DateTime(<span class="hljs-name">max_datetime=</span>'<span class="hljs-number">2001</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span> <span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>', min_datetime='<span class="hljs-number">2000</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span> <span class="hljs-number">00</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>')
Date(<span class="hljs-name">max_date=</span>'<span class="hljs-number">2001</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span>', min_date='<span class="hljs-number">2000</span><span class="hljs-number">-01</span><span class="hljs-number">-01</span>')
Time(<span class="hljs-name">max_time=</span>'<span class="hljs-number">06</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>', min_time='<span class="hljs-number">05</span>:<span class="hljs-number">00</span>:<span class="hljs-number">00</span>')
</code></pre>
<h2>Test</h2>
<p><code>coverage run --source=xdata -m pytest &amp;&amp; coverage report</code></p>
<p>Github: <a href="https://github.com/gaojiuli/xdata" rel="nofollow">https://github.com/gaojiuli/xdata</a></p>
<p>欢迎有兴趣的朋友一起参与进来</p>
</div>
""" """
# Tomd(string)
Tomd(string) print(Tomd(string).markdown)
print(Tomd('<h1>title</h1>').markdown)
...@@ -7,18 +7,20 @@ MARKDOWN = { ...@@ -7,18 +7,20 @@ MARKDOWN = {
'h4': ('\n#### ', '\n'), 'h4': ('\n#### ', '\n'),
'h5': ('\n##### ', '\n'), 'h5': ('\n##### ', '\n'),
'h6': ('\n###### ', '\n'), 'h6': ('\n###### ', '\n'),
'p': ('\n', '\n'),
'p_with_out_class': ('\n', '\n'),
'code': ('`', '`'), 'code': ('`', '`'),
'ul': ('\n', '\n'), 'ul': ('', ''),
'ol': ('\n', '\n'), 'ol': ('', ''),
'li': ('*. ', ''), 'li': ('*. ', ''),
'blockquote': ('> ', '\n'), 'blockquote': ('> ', '\n'),
'em': ('**', '**'), 'em': ('**', '**'),
'a': ('[](', ')'), 'a': ('[](', ')'),
'img': ('![](', ')'), 'img': ('![](', ')'),
'block_code': ('\n```\n', '\n```\n'), 'block_code': ('\n```\n', '\n```\n'),
'span': ('', '') 'span': ('', ''),
'p': ('\n', '\n'),
'p_with_out_class': ('\n', '\n'),
'inline_p': ('', ''),
'inline_p_with_out_class': ('', '')
} }
BlOCK_ELEMENTS = { BlOCK_ELEMENTS = {
...@@ -29,23 +31,31 @@ BlOCK_ELEMENTS = { ...@@ -29,23 +31,31 @@ BlOCK_ELEMENTS = {
'h5': '<h5.*?>(.*?)</h5>', 'h5': '<h5.*?>(.*?)</h5>',
'h6': '<h6.*?>(.*?)</h6>', 'h6': '<h6.*?>(.*?)</h6>',
'p': '<p\s.*?>(.*?)</p>', 'p': '<p\s.*?>(.*?)</p>',
'p_with_out_class': '<p>(.*?)</p>', 'p_with_out_class': '<p>(.*?)</p>', # conflict with <pre>
'blockquote': '<blockquote.*?>(.*?)</blockquote>', 'blockquote': '<blockquote.*?>(.*?)</blockquote>',
'ul': '<ul.*?>(.*?)</ul>', 'ul': '<ul.*?>(.*?)</ul>',
'ol': '<ol.*?>(.*?)</ol>',
'block_code': '<pre.*?><code.*?>(.*?)</code></pre>', 'block_code': '<pre.*?><code.*?>(.*?)</code></pre>',
} }
INLINE_ELEMENTS = { INLINE_ELEMENTS = {
'inline_p': '<p\s.*?>(.*?)</p>',
'inline_p_with_out_class': '<p>(.*?)</p>',
'code': '<code.*?>(.*?)</code>', 'code': '<code.*?>(.*?)</code>',
'span': '<span.*?>(.*?)</span>', 'span': '<span.*?>(.*?)</span>',
'ul': '<ul.*?>(.*?)</ul>',
'ol': '<ol.*?>(.*?)</ol>', 'ol': '<ol.*?>(.*?)</ol>',
'li': '<li.*?>(.*?)</li>', 'li': '<li.*?>(.*?)</li>',
'img': '<img.*?>(.*?)</img>', 'img': '<img.*?>(.*?)</img>',
'a': '<a.*?>(.*?)</a>', 'a': '<a.*?>(.*?)</a>',
'em': '<em.*?>(.*?)</em>', 'em': '<em.*?>(.*?)</em>'
# 'pre': '<pre.*><code.*>(.*)</code></pre>',
} }
## pos < max_pos
DELETE_ELEMENTS = ['<span.*?>', '</span>', '<div.*?>', '</div>']
class Element: class Element:
def __init__(self, pos, content, tag): def __init__(self, pos, content, tag):
...@@ -75,16 +85,16 @@ class Tomd: ...@@ -75,16 +85,16 @@ class Tomd:
self._elements = [] self._elements = []
self._markdown = None self._markdown = None
self.parse_block() self.parse_block()
print(self._markdown) for index, element in enumerate(DELETE_ELEMENTS):
for element in self._elements: self._markdown = re.sub(element, '', self._markdown)
if len(element._result) > 1000:
print(element.__dict__)
def parse_block(self): def parse_block(self):
for tag, pattern in BlOCK_ELEMENTS.items(): for tag, pattern in BlOCK_ELEMENTS.items():
for m in re.finditer(pattern, self.html, re.I | re.S | re.M): for m in re.finditer(pattern, self.html, re.I | re.S | re.M):
element = Element(pos=m.start(), content=''.join(m.groups()), tag=tag) element = Element(pos=m.start(), content=''.join(m.groups()), tag=tag)
self._elements.append(element) self._elements.append(element)
self._elements.sort(key=lambda element: element.pos) self._elements.sort(key=lambda element: element.pos)
self._markdown = ''.join([str(e) for e in self._elements]) self._markdown = ''.join([str(e) for e in self._elements])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment