summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile87
-rw-r--r--README.md37
-rw-r--r--src/inlines.c4
-rw-r--r--wrapper.rb14
4 files changed, 84 insertions, 58 deletions
diff --git a/Makefile b/Makefile
index 3842941..1297fc8 100644
--- a/Makefile
+++ b/Makefile
@@ -29,49 +29,54 @@ debug:
cmake .. -DCMAKE_BUILD_TYPE=Debug; \
cmake --build .
-tarball:
+tarball: spec.html
rm -rf $(PKGDIR); \
mkdir -p $(PKGDIR)/man/man1; \
cp -r src $(PKGDIR)/; \
+ cp spec.html $(PKGDIR); \
cp CMakeLists.txt $(PKGDIR); \
+ perl -ne '$$p++ if /^### JavaScript/; print if (!$$p)' Makefile > $(PKGDIR)/Makefile; \
cp man/man1/cmark.1 $(PKGDIR)/man/man1/; \
cp README.md LICENSE spec.txt runtests.pl $(PKGDIR)/; \
- tar cvzf cmark-$(SPECVERSION).tar.gz $(PKGDIR)
+ tar czf cmark-$(SPECVERSION).tar.gz $(PKGDIR); \
+ rm -rf $(PKGDIR)
clean:
rm -rf $(BUILDDIR)
$(PROG): all
+$(SRCDIR)/case_fold_switch.inc: $(DATADIR)/CaseFolding-3.2.0.txt
+ perl mkcasefold.pl < $< > $@
+
man/man1/cmark.1: man/cmark.1.md
pandoc $< -o $@ -s -t man
-README.html: README.md template.html
- pandoc --template template.html -S -s -t html5 -o $@ $<
-
-spec: test spec.html
+test: $(SPEC)
+ perl runtests.pl $< $(PROG)
-spec.md: $(SPEC)
- perl spec2md.pl < $< > $@
+testlib: $(SPEC)
+ perl runtests.pl $< ./wrapper.py
-spec.html: spec.md template.html
- pandoc --no-highlight --number-sections --template template.html -s --toc -S $< | \
- perl -pe 's/a href="@([^"]*)"/a id="\1" href="#\1" class="definition"/g' | \
- perl -pe 's/␣/<span class="space"> <\/span>/g' \
- > $@
+leakcheck: $(PROG)
+ cat leakcheck.md | valgrind --leak-check=full --dsymutil=yes $(PROG)
+fuzztest:
+ { for i in `seq 1 10`; do \
+ cat /dev/urandom | head -c $(FUZZCHARS) | iconv -f latin1 -t utf-8 | tee fuzz-$$i.txt | \
+ /usr/bin/env time -p $(PROG) >/dev/null && rm fuzz-$$i.txt ; \
+ done } 2>&1 | grep 'user\|abnormally'
-spec.pdf: spec.md template.tex specfilter.hs
- pandoc -s $< --template template.tex \
- --filter ./specfilter.hs -o $@ --latex-engine=xelatex --toc \
- --number-sections -V documentclass=report -V tocdepth=2 \
- -V classoption=twosides
+operf: $(PROG)
+ operf $(PROG) <$(BENCHINP) >/dev/null
-test: $(SPEC)
- perl runtests.pl $< $(PROG)
+distclean: clean
+ -rm -f js/commonmark.js
+ -rm -rf *.dSYM
+ -rm -f README.html
+ -rm -f spec.md fuzz.txt spec.html
-testlib: $(SPEC)
- perl runtests.pl $< ./wrapper.py
+### JavaScript ###
js/commonmark.js: js/lib/index.js ${JSMODULES}
browserify --standalone commonmark $< -o $@
@@ -85,35 +90,33 @@ jshint:
benchjs:
node js/bench.js ${BENCHINP}
-$(SRCDIR)/case_fold_switch.inc: $(DATADIR)/CaseFolding-3.2.0.txt
- perl mkcasefold.pl < $< > $@
+npm:
+ cd js; npm publish
dingus: js/commonmark.js
echo "Starting dingus server at http://localhost:9000" && python -m SimpleHTTPServer 9000
-leakcheck: $(PROG)
- cat leakcheck.md | valgrind --leak-check=full --dsymutil=yes $(PROG)
+### Spec ###
-operf: $(PROG)
- operf $(PROG) <$(BENCHINP) >/dev/null
+spec.md: $(SPEC)
+ perl spec2md.pl < $< > $@
-fuzztest:
- { for i in `seq 1 10`; do \
- cat /dev/urandom | head -c $(FUZZCHARS) | iconv -f latin1 -t utf-8 | tee fuzz-$$i.txt | \
- /usr/bin/env time -p $(PROG) >/dev/null && rm fuzz-$$i.txt ; \
- done } 2>&1 | grep 'user\|abnormally'
+spec.html: spec.md template.html
+ pandoc --no-highlight --number-sections --template template.html -s --toc -S $< | \
+ perl -pe 's/a href="@([^"]*)"/a id="\1" href="#\1" class="definition"/g' | \
+ perl -pe 's/␣/<span class="space"> <\/span>/g' \
+ > $@
+
+spec.pdf: spec.md template.tex specfilter.hs
+ pandoc -s $< --template template.tex \
+ --filter ./specfilter.hs -o $@ --latex-engine=xelatex --toc \
+ --number-sections -V documentclass=report -V tocdepth=2 \
+ -V classoption=twosides
+
+### Website ###
update-site: spec.html js/commonmark.js
make -C $(SITE) update
upload-site: spec.html
make -C $(SITE) upload
-
-npm:
- cd js; npm publish
-
-distclean: clean
- -rm -f js/commonmark.js
- -rm -rf *.dSYM
- -rm -f README.html
- -rm -f spec.md fuzz.txt spec.html
diff --git a/README.md b/README.md
index ff75eb7..501d6bc 100644
--- a/README.md
+++ b/README.md
@@ -10,14 +10,14 @@ implementations in C and JavaScript.
The implementations
-------------------
-The C implementation provides both a library and a standalone program
-`cmark` that converts CommonMark to HTML. It is written in standard C99
-and has no library dependencies. The parser is very fast, on par with
-[sundown](https://github.com/vmg/sundown). Some benchmarks (on
-an ancient Thinkpad running Intel Core 2 Duo at 2GHz, measured using
-`time` and parsing a ~500K book, the English version of [*Pro
-Git*](https://github.com/progit/progit/tree/master/en) by
-Scott Chacon and Ben Straub):
+The C implementation provides both a shared library (`libcmark`) and a
+standalone program `cmark` that converts CommonMark to HTML. It is
+written in standard C99 and has no library dependencies. The parser is
+very fast, on par with [sundown](https://github.com/vmg/sundown). Some
+benchmarks (on an ancient Thinkpad running Intel Core 2 Duo at 2GHz,
+measured using `time` and parsing a ~500K book, the English version of
+[*Pro Git*](https://github.com/progit/progit/tree/master/en) by Scott
+Chacon and Ben Straub):
|Implementation | Time | Factor|
|---------------|-------|--------|
@@ -30,6 +30,8 @@ Scott Chacon and Ben Straub):
| **cmark** | 0.020s| 1.1|
| sundown | 0.018s| 1.0|
+It is easy to use `libcmark` in python or ruby code: see `wrapper.py`
+and `wrapper.rb` in the repository for simple examples.
The JavaScript implementation is a single JavaScript file, with
no dependencies, that can be linked to in an HTML page. Here
@@ -79,13 +81,24 @@ To run tests:
make test
-or:
+(Or `perl runtests.pl spec.txt build/src/cmark` or, in the cmake
+build directory, `ctest -V`.)
- perl runtests.pl spec.txt build/src/cmark
+To test the shared library via a python wrapper:
-or (in the cmake build directory):
+ make testlib
- ctest -V
+To run a "fuzz test" against ten long randomly generated inputs:
+
+ make fuzztest
+
+To run a test for memory leaks using valgrind:
+
+ make leakcheck
+
+To make a release tarball:
+
+ make tarball
Installing (JavaScript)
-----------------------
diff --git a/src/inlines.c b/src/inlines.c
index ecea199..6a4e70c 100644
--- a/src/inlines.c
+++ b/src/inlines.c
@@ -683,7 +683,6 @@ static node_inl* handle_close_bracket(subject* subj, node_inl **last)
chunk urlchunk, titlechunk;
unsigned char *url, *title;
delimiter_stack *opener;
- delimiter_stack *closer_above;
delimiter_stack *tempstack;
node_inl *link_text;
node_inl *inl;
@@ -787,13 +786,10 @@ match:
// inside links.)
if (!is_image) {
opener = subj->delimiters;
- closer_above = NULL;
while (opener != NULL) {
tempstack = opener->previous;
if (opener->delim_char == '[') {
remove_delimiter(subj, opener);
- } else {
- closer_above = opener;
}
opener = tempstack;
}
diff --git a/wrapper.rb b/wrapper.rb
new file mode 100644
index 0000000..3ec2186
--- /dev/null
+++ b/wrapper.rb
@@ -0,0 +1,14 @@
+require 'ffi'
+
+module CMark
+ extend FFI::Library
+ ffi_lib ['libcmark', 'cmark']
+ attach_function :cmark_markdown_to_html, [:string, :int], :string
+end
+
+def markdown_to_html(s)
+ CMark::cmark_markdown_to_html(s, s.length)
+end
+
+print markdown_to_html(STDIN.read());
+