From cd23b30e5fafdc93a39fa705635b4e3cd362817e Mon Sep 17 00:00:00 2001 From: Frank Smit Date: Mon, 8 Jun 2015 16:26:41 +0200 Subject: [PATCH] Reorganize. --- benchmark/benchmark.py | 131 ++++++++++++--------- build_ffi.py | 22 ++-- misaka/api.py | 4 +- {src => misaka}/extra.c | 0 {src => misaka}/extra.h | 0 {src => misaka}/hoedown/autolink.c | 0 {src => misaka}/hoedown/autolink.h | 0 {src => misaka}/hoedown/buffer.c | 0 {src => misaka}/hoedown/buffer.h | 0 {src => misaka}/hoedown/document.c | 0 {src => misaka}/hoedown/document.h | 0 {src => misaka}/hoedown/escape.c | 0 {src => misaka}/hoedown/escape.h | 0 {src => misaka}/hoedown/html.c | 0 {src => misaka}/hoedown/html.h | 0 {src => misaka}/hoedown/html_blocks.c | 0 {src => misaka}/hoedown/html_smartypants.c | 0 {src => misaka}/hoedown/stack.c | 0 {src => misaka}/hoedown/stack.h | 0 {src => misaka}/hoedown/version.c | 0 {src => misaka}/hoedown/version.h | 0 21 files changed, 86 insertions(+), 71 deletions(-) rename {src => misaka}/extra.c (100%) rename {src => misaka}/extra.h (100%) rename {src => misaka}/hoedown/autolink.c (100%) rename {src => misaka}/hoedown/autolink.h (100%) rename {src => misaka}/hoedown/buffer.c (100%) rename {src => misaka}/hoedown/buffer.h (100%) rename {src => misaka}/hoedown/document.c (100%) rename {src => misaka}/hoedown/document.h (100%) rename {src => misaka}/hoedown/escape.c (100%) rename {src => misaka}/hoedown/escape.h (100%) rename {src => misaka}/hoedown/html.c (100%) rename {src => misaka}/hoedown/html.h (100%) rename {src => misaka}/hoedown/html_blocks.c (100%) rename {src => misaka}/hoedown/html_smartypants.c (100%) rename {src => misaka}/hoedown/stack.c (100%) rename {src => misaka}/hoedown/stack.h (100%) rename {src => misaka}/hoedown/version.c (100%) rename {src => misaka}/hoedown/version.h (100%) diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py index 0c64484..904e483 100644 --- a/benchmark/benchmark.py +++ b/benchmark/benchmark.py @@ -1,87 +1,102 @@ +# coding: utf-8 +# Source: https://github.com/lepture/mistune/blob/master/tests/bench.py + +import os import time -import os.path as path +import functools -modules = {} -names = ('misaka', 'markdown', 'markdown2', 'cMarkdown', 'discount') -for name in names: - try: - modules[name] = __import__(name) - except ImportError: - pass +class benchmark(object): + suites = [] - -rndr = modules['misaka'].HtmlRenderer() -m = modules['misaka'].Markdown(rndr) - - -class Benchmark(object): def __init__(self, name): self._name = name def __call__(self, func): - def wrapper(*args, **kwargs): + @functools.wraps(func) + def wrapper(text, loops=1000): start = time.clock() - func(*args, **kwargs) + while loops: + func(text) + loops -= 1 end = time.clock() return end - start - wrapper.__name__ = func.__name__ + # register + benchmark.suites.append((self._name, wrapper)) return wrapper + @classmethod + def bench(cls, text, loops=1000): + print('Parsing the Markdown Syntax document %d times...' % loops) + for name, func in cls.suites: + try: + total = func(text, loops=loops) + print('{0}: {1}'.format(name, total)) + except ImportError: + print('{0} is not available'.format(name)) -@Benchmark('Misaka') + +@benchmark('mistune') +def benchmark_mistune(text): + import mistune + mistune.markdown(text) + + +@benchmark('misaka') def benchmark_misaka(text): - modules['misaka'].html(text) + import misaka as m + # mistune has all these features + extensions = ( + m.EXT_NO_INTRA_EMPHASIS | m.EXT_FENCED_CODE | m.EXT_AUTOLINK | + m.EXT_TABLES | m.EXT_STRIKETHROUGH + ) + # md = m.Markdown(m.HtmlRenderer(), extensions=extensions) + # md.render(text) + + m.html(text, extensions) -@Benchmark('Misaka (classes)') -def benchmark_misaka_classes(text): - m.render(text) +# @benchmark('markdown2') +# def benchmark_markdown2(text): +# import markdown2 +# extras = ['code-friendly', 'fenced-code-blocks', 'footnotes'] +# markdown2.markdown(text, extras=extras) -@Benchmark('markdown2') -def benchmark_markdown2(text): - modules['markdown2'].markdown(text) +# @benchmark('markdown') +# def benchmark_markdown(text): +# import markdown +# markdown.markdown(text, ['extra']) -@Benchmark('Markdown') -def benchmark_markdown(text): - modules['markdown'].markdown(text) +# @benchmark('cMarkdown') +# def benchmark_cMarkdown(text): +# import cMarkdown +# cMarkdown.markdown(text) -@Benchmark('cMarkdown') -def benchmark_cMarkdown(text): - modules['cMarkdown'].markdown(text) +# @benchmark('discount') +# def benchmark_discount(text): +# import discount +# discount.Markdown(text).get_html_content() -@Benchmark('discount') -def benchmark_discount(text): - modules['discount'].Markdown(text).get_html_content() +@benchmark('hoep') +def benchmark_hoep(text): + import hoep as m + # mistune has all these features + extensions = ( + m.EXT_NO_INTRA_EMPHASIS | m.EXT_FENCED_CODE | m.EXT_AUTOLINK | + m.EXT_TABLES | m.EXT_STRIKETHROUGH | m.EXT_FOOTNOTES + ) + md = m.Hoep(extensions=extensions) + md.render(text.decode('utf-8')) if __name__ == '__main__': - with open(path.join(path.dirname(__file__), 'markdown-syntax.md'), 'r') as fd: - text = fd.read() + root = os.path.dirname(__file__) + filepath = os.path.join(root, 'markdown-syntax.md') + with open(filepath, 'r') as f: + text = f.read() - loops = 10000 - totals = [] - methods = [ - ('Misaka', benchmark_misaka), - ('Misaka (classes)', benchmark_misaka_classes), - ('Markdown', benchmark_markdown), - ('Markdown2', benchmark_markdown2), - ('cMarkdown', benchmark_cMarkdown), - ('Discount', benchmark_discount) - ] - - print('Parsing the Markdown Syntax document %d times...' % loops) - - for i, method in enumerate(methods): - name = method[1].__name__.split('_', 2)[1] - if name not in modules: - print('%s is not available' % method[0]) - continue - total = 0 - for nth in range(0, loops): - total += method[1](text) - print('%s: %gs' % (method[0], total)) + benchmark.bench(text) diff --git a/build_ffi.py b/build_ffi.py index a76a2ca..8cda2cb 100644 --- a/build_ffi.py +++ b/build_ffi.py @@ -57,18 +57,18 @@ ffi.set_source( #include "hoedown/html.h" """, sources=( - 'src/extra.c', - 'src/hoedown/version.c', - 'src/hoedown/stack.c', - 'src/hoedown/html_smartypants.c', - 'src/hoedown/html_blocks.c', - 'src/hoedown/html.c', - 'src/hoedown/escape.c', - 'src/hoedown/document.c', - 'src/hoedown/buffer.c', - 'src/hoedown/autolink.c', + 'misaka/extra.c', + 'misaka/hoedown/version.c', + 'misaka/hoedown/stack.c', + 'misaka/hoedown/html_smartypants.c', + 'misaka/hoedown/html_blocks.c', + 'misaka/hoedown/html.c', + 'misaka/hoedown/escape.c', + 'misaka/hoedown/document.c', + 'misaka/hoedown/buffer.c', + 'misaka/hoedown/autolink.c', ), - include_dirs=('src',)) + include_dirs=('misaka',)) # NOTE: The constants are refined here, because CFFI diff --git a/misaka/api.py b/misaka/api.py index df12d62..18b1c91 100644 --- a/misaka/api.py +++ b/misaka/api.py @@ -19,8 +19,8 @@ MAX_NESTING = 16 def html(text, extensions=0, render_flags=0): ib = lib.hoedown_buffer_new(IUNIT) ob = lib.hoedown_buffer_new(OUNIT) - renderer = lib.hoedown_html_renderer_new(0, 0) - document = lib.hoedown_document_new(renderer, 0, 16); + renderer = lib.hoedown_html_renderer_new(render_flags, 0) + document = lib.hoedown_document_new(renderer, extensions, 16); lib.hoedown_buffer_puts(ib, text.encode('utf-8')) lib.hoedown_document_render(document, ob, ib.data, ib.size); diff --git a/src/extra.c b/misaka/extra.c similarity index 100% rename from src/extra.c rename to misaka/extra.c diff --git a/src/extra.h b/misaka/extra.h similarity index 100% rename from src/extra.h rename to misaka/extra.h diff --git a/src/hoedown/autolink.c b/misaka/hoedown/autolink.c similarity index 100% rename from src/hoedown/autolink.c rename to misaka/hoedown/autolink.c diff --git a/src/hoedown/autolink.h b/misaka/hoedown/autolink.h similarity index 100% rename from src/hoedown/autolink.h rename to misaka/hoedown/autolink.h diff --git a/src/hoedown/buffer.c b/misaka/hoedown/buffer.c similarity index 100% rename from src/hoedown/buffer.c rename to misaka/hoedown/buffer.c diff --git a/src/hoedown/buffer.h b/misaka/hoedown/buffer.h similarity index 100% rename from src/hoedown/buffer.h rename to misaka/hoedown/buffer.h diff --git a/src/hoedown/document.c b/misaka/hoedown/document.c similarity index 100% rename from src/hoedown/document.c rename to misaka/hoedown/document.c diff --git a/src/hoedown/document.h b/misaka/hoedown/document.h similarity index 100% rename from src/hoedown/document.h rename to misaka/hoedown/document.h diff --git a/src/hoedown/escape.c b/misaka/hoedown/escape.c similarity index 100% rename from src/hoedown/escape.c rename to misaka/hoedown/escape.c diff --git a/src/hoedown/escape.h b/misaka/hoedown/escape.h similarity index 100% rename from src/hoedown/escape.h rename to misaka/hoedown/escape.h diff --git a/src/hoedown/html.c b/misaka/hoedown/html.c similarity index 100% rename from src/hoedown/html.c rename to misaka/hoedown/html.c diff --git a/src/hoedown/html.h b/misaka/hoedown/html.h similarity index 100% rename from src/hoedown/html.h rename to misaka/hoedown/html.h diff --git a/src/hoedown/html_blocks.c b/misaka/hoedown/html_blocks.c similarity index 100% rename from src/hoedown/html_blocks.c rename to misaka/hoedown/html_blocks.c diff --git a/src/hoedown/html_smartypants.c b/misaka/hoedown/html_smartypants.c similarity index 100% rename from src/hoedown/html_smartypants.c rename to misaka/hoedown/html_smartypants.c diff --git a/src/hoedown/stack.c b/misaka/hoedown/stack.c similarity index 100% rename from src/hoedown/stack.c rename to misaka/hoedown/stack.c diff --git a/src/hoedown/stack.h b/misaka/hoedown/stack.h similarity index 100% rename from src/hoedown/stack.h rename to misaka/hoedown/stack.h diff --git a/src/hoedown/version.c b/misaka/hoedown/version.c similarity index 100% rename from src/hoedown/version.c rename to misaka/hoedown/version.c diff --git a/src/hoedown/version.h b/misaka/hoedown/version.h similarity index 100% rename from src/hoedown/version.h rename to misaka/hoedown/version.h