Author | SHA1 | Message | Date |
---|---|---|---|
sekimura | 16f3fba530 | discount-1.5.5 | 14 years ago |
@ -1,90 +0,0 @@ | |||||
CC=@CC@ -I. -L. | |||||
AR=@AR@ | |||||
RANLIB=@RANLIB@ | |||||
BINDIR=@exedir@ | |||||
MANDIR=@mandir@ | |||||
LIBDIR=@libdir@ | |||||
INCDIR=@prefix@/include | |||||
PGMS=markdown | |||||
SAMPLE_PGMS=mkd2html makepage | |||||
@THEME@SAMPLE_PGMS+= theme | |||||
MKDLIB=libmarkdown.a | |||||
OBJS=mkdio.o markdown.o dumptree.o generate.o \ | |||||
resource.o docheader.o version.o toc.o Csio.o xmlpage.o @AMALLOC@ | |||||
all: $(PGMS) $(SAMPLE_PGMS) | |||||
install: $(PGMS) | |||||
@INSTALL_PROGRAM@ $(PGMS) $(BINDIR) | |||||
@INSTALL_DATA@ $(MKDLIB) $(LIBDIR) | |||||
@INSTALL_DATA@ mkdio.h $(INCDIR) | |||||
install.everything: install install.samples install.man | |||||
install.samples: $(SAMPLE_PGMS) install | |||||
@INSTALL_PROGRAM@ $(SAMPLE_PGMS) $(BINDIR) | |||||
@INSTALL_DIR@ $(MANDIR)/man1 | |||||
@INSTALL_DATA@ theme.1 $(MANDIR)/man1 | |||||
install.man: | |||||
@INSTALL_DIR@ $(MANDIR)/man3 | |||||
@INSTALL_DATA@ mkd-functions.3 markdown.3 $(MANDIR)/man3 | |||||
for x in mkd_text mkd_in mkd_string; do \ | |||||
( echo '.\"' ; echo ".so man3/markdown.3" ) > $(MANDIR)/man3/$$x.3;\ | |||||
done | |||||
for x in mkd_compile mkd_style mkd_generatehtml mkd_cleanup mkd_doc_title mkd_doc_author mkd_doc_date; do \ | |||||
( echo '.\"' ; echo ".so man3/mkd-functions.3" ) > $(MANDIR)/man3/$$x.3; \ | |||||
done | |||||
@INSTALL_DIR@ $(MANDIR)/man7 | |||||
@INSTALL_DATA@ markdown.7 mkd-extensions.7 $(MANDIR)/man7 | |||||
@INSTALL_DIR@ $(MANDIR)/man1 | |||||
@INSTALL_DATA@ markdown.1 $(MANDIR)/man1 | |||||
install.everything: install install.man | |||||
version.o: version.c VERSION | |||||
$(CC) -DVERSION=\"`cat VERSION`\" -c version.c | |||||
markdown: main.o $(MKDLIB) | |||||
$(CC) -o markdown main.o -lmarkdown @LIBS@ | |||||
# example programs | |||||
@THEME@theme: theme.o $(MKDLIB) | |||||
@THEME@ $(CC) -o theme theme.o -lmarkdown @LIBS@ | |||||
mkd2html: mkd2html.o $(MKDLIB) | |||||
$(CC) -o mkd2html mkd2html.o -lmarkdown @LIBS@ | |||||
makepage: makepage.c $(MKDLIB) | |||||
$(CC) -o makepage makepage.c -lmarkdown @LIBS@ | |||||
main.o: main.c mkdio.h config.h | |||||
$(CC) -I. -c main.c | |||||
$(MKDLIB): $(OBJS) | |||||
$(AR) crv $(MKDLIB) $(OBJS) | |||||
$(RANLIB) $(MKDLIB) | |||||
test: $(PGMS) echo | |||||
@for x in tests/*.t; do \ | |||||
sh $$x || exit 1; \ | |||||
done | |||||
echo: echo.c | |||||
$(CC) -o echo echo.c | |||||
clean: | |||||
rm -f $(PGMS) $(SAMPLE_PGMS) *.o $(MKDLIB) | |||||
distclean spotless: clean | |||||
rm -f @GENERATED_FILES@ @CONFIGURE_FILES@ | |||||
markdown.o: markdown.c config.h cstring.h markdown.h | |||||
generate.o: generate.c config.h cstring.h markdown.h | |||||
dumptree.o: dumptree.c cstring.h markdown.h | |||||
mkdio.o: mkdio.c mkdio.h cstring.h config.h | |||||
xmlpage.o: xmlpage.c mkdio.h cstring.h config.h | |||||
toc.o: toc.c mkdio.h cstring.h config.h |
@ -1 +0,0 @@ | |||||
1.3.4 |
@ -1,49 +0,0 @@ | |||||
./echo "code blocks" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' format for code block html ....... ' | |||||
SEP=' | |||||
this is | |||||
code | |||||
' | |||||
count=`echo "$SEP" | ./markdown | wc -l` | |||||
if [ $count -eq 3 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' unclosed single backtick ......... ' | |||||
if ./echo '`hi there' | ./markdown | grep '`' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' unclosed double backtick ......... ' | |||||
if ./echo '``hi there' | ./markdown | grep '``' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' remove space around code ......... ' | |||||
if ./echo '`` hi there ``' | ./markdown | grep '<code>hi there<\/code>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,67 +0,0 @@ | |||||
./echo "markdown 1.0 compatability" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
LINKY='[this] is a test | |||||
[this]: /this' | |||||
./echo -n ' implicit reference links ......... ' | |||||
RES=`./echo "$LINKY" | ./markdown` | |||||
count=`./echo "$RES" | grep -i '<a' | wc -l` | |||||
if [ "$count" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' implicit reference links (-f1.0) . ' | |||||
RES=`./echo "$LINKY" | ./markdown -f1.0` | |||||
count=`./echo "$RES" | grep -i '<a' | wc -l` | |||||
if [ "$count" -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
WSP=' ' | |||||
WHITESPACE=" | |||||
white space$WSP | |||||
and more" | |||||
./echo -n ' trailing whitespace .............. ' | |||||
RES=`echo "$WHITESPACE" | ./markdown` | |||||
count=`echo "$RES" | grep -i ' $' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "failed" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' trailing whitespace (-f1.0) ...... ' | |||||
RES=`echo "$WHITESPACE" | ./markdown -f1.0` | |||||
count=`echo "$RES" | grep -i ' $' | wc -l` | |||||
if [ $count -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "failed ($count)" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,82 +0,0 @@ | |||||
./echo "definition lists" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
SEP=' | |||||
=this= | |||||
is an ugly | |||||
=test= | |||||
eh? | |||||
' | |||||
RES=`./echo "$SEP" | ./markdown` | |||||
if ./markdown -V | grep DL_TAG >/dev/null; then | |||||
./echo -n ' =tag= generates definition lists . ' | |||||
count=`./echo "$RES" | grep -i '<dl>' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' two item list has two labels ..... ' | |||||
count=`./echo "$RES" | grep -i '<dt>' | wc -l` | |||||
if [ $count -eq 2 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' two item list has two entries..... ' | |||||
count=`./echo "$RES" | grep -i '<dd>' | wc -l` | |||||
if [ $count -eq 2 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' one item with two =tags= ......... ' | |||||
SRC=" | |||||
=this= | |||||
=is= | |||||
A test, eh?" | |||||
RES=`./echo "$SRC" | ./markdown` | |||||
count1=`./echo "$RES" | grep -i '<dt>' | wc -l` | |||||
count2=`./echo "$RES" | grep -i '<dd>' | wc -l` | |||||
if [ \( "${count1:-0}" -eq 2 \) -a \( "${count2:-0}" -eq 1 \) ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
else | |||||
./echo -n ' =tag= does nothing ............... ' | |||||
count=`./echo "$RES" | grep -i '<dl>' | wc -l` | |||||
if [ $count -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
fi | |||||
exit $rc |
@ -1,81 +0,0 @@ | |||||
./echo "emphasis" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
MARKDOWN_VERSION=`./markdown -V` | |||||
./echo -n ' *hi* -> <em>hi</em> .............. ' | |||||
if ./echo '*hi*' | ./markdown | grep -i '<em>hi</em>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' * -> * ........................... ' | |||||
if ./echo 'A * A' | ./markdown | grep -i 'A \* A' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' ***A**B* ......................... ' | |||||
if ./echo '***A**B*' | ./markdown | grep -i '<em><strong>A</strong>B</em>' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' ***A*B** ......................... ' | |||||
if ./echo '***A*B**' | ./markdown | grep -i '<strong><em>A</em>B</strong>' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' **A*B*** ......................... ' | |||||
if ./echo '**A*B***' | ./markdown | grep -i '<strong>A<em>B</em></strong>' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' *A**B*** ......................... ' | |||||
if ./echo '*A**B***' | ./markdown | grep -i '<em>A<strong>B</strong></em>' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
if ./markdown -V | grep RELAXED >/dev/null; then | |||||
./echo -n ' _A_B with -frelax ................ ' | |||||
if ./echo '_A_B' | ./markdown -frelax | grep -i 'A_B' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' _A_B with -fstrict ............... ' | |||||
if ./echo '_A_B' | ./markdown -fstrict | grep -i 'A</em>B' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
fi | |||||
exit $rc |
@ -1,43 +0,0 @@ | |||||
./echo "paragraph flow" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' header followed by paragraph ..... ' | |||||
SEP='###Hello, sailor### | |||||
And how are you today?' | |||||
RES=`./echo "$SEP" | ./markdown` | |||||
hcount=`./echo "$RES" | grep -i '<h3>' | wc -l` | |||||
pcount=`./echo "$RES" | grep -i '<p>' | wc -l` | |||||
if [ "$hcount" -eq 1 -a "$pcount" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' two lists punctuated with a HR ... ' | |||||
SEP='* A | |||||
* * * | |||||
* B | |||||
* C' | |||||
RES=`./echo "$SEP" | ./markdown` | |||||
hrcount=`./echo "$RES" | grep -i '<hr' | wc -l` | |||||
ulcount=`./echo "$RES" | grep -i '<ul>' | wc -l` | |||||
if [ "$hrcount" -eq 1 -a "$ulcount" -eq 2 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,33 +0,0 @@ | |||||
./echo "footnotes" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' a line with multiple []s ......... ' | |||||
SZ=`./echo '[a][] [b][]:' | ./markdown | wc -l` | |||||
if [ "$SZ" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' a valid footnote ................. ' | |||||
FMT=' | |||||
[alink][] | |||||
[alink]: link me' | |||||
SZ=`./echo "$FMT" | ./markdown | grep '<a href' | wc -l` | |||||
if [ "$SZ" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,118 +0,0 @@ | |||||
./echo "html blocks" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' self-closing block tags (hr) ..... ' | |||||
SEP=' | |||||
<hr> | |||||
text | |||||
' | |||||
count=`./echo "$SEP" | ./markdown | grep '<p>' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' self-closing block tags (hr/) .... ' | |||||
SEP=' | |||||
<hr/> | |||||
text | |||||
' | |||||
count=`./echo "$SEP" | ./markdown | grep '<p>' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' self-closing block tags (br) ..... ' | |||||
SEP=' | |||||
<br> | |||||
text | |||||
' | |||||
count=`./echo "$SEP" | ./markdown | grep '<p>' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' html comments .................... ' | |||||
SEP=' | |||||
<!-- | |||||
**hi** | |||||
--> | |||||
' | |||||
count=`./echo "$SEP" | ./markdown | grep 'strong' | wc -l` | |||||
if [ $count -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' no smartypants inside tags (#1) .. ' | |||||
count=`./echo '<img src="linky">' | ./markdown | tr -dc '"' | wc -c` | |||||
if [ $count -eq 2 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' no smartypants inside tags (#2) .. ' | |||||
count=`./echo '<img src="linky" alt=":)" />' | ./markdown | tr -dc '"' | wc -c` | |||||
if [ $count -eq 4 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' block html with -fnohtml ......... ' | |||||
RSLT=`./echo "<b>hi!</b>" | ./markdown -fnohtml` | |||||
if ./echo "$RSLT" | grep '<b>' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' allow html with -fhtml ........... ' | |||||
RSLT=`./echo "<b>hi!</b>" | ./markdown -fhtml` | |||||
if ./echo "$RSLT" | grep '<b>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,149 +0,0 @@ | |||||
./echo "embedded links" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' url contains & ................... ' | |||||
if ./echo '[hehehe](u&rl)' | ./markdown | grep -i '&' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' quote link title with () ......... ' | |||||
if ./echo '[hehehe](url (link title))' | ./markdown | grep -i 'title="link title"' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' url contains + ................... ' | |||||
if ./echo '[hehehe](u+rl)' | ./markdown | grep -i '+' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' url contains " ................... ' | |||||
if ./echo '[hehehe](u"rl)' | ./markdown | grep -i '%22' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' url contains < ................... ' | |||||
if ./echo '[hehehe](u<rl)' | ./markdown | grep -i '<' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' label contains < ................. ' | |||||
if ./echo '![he<he<he](url)' | ./markdown | grep -i '<' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' label contains < ................. ' | |||||
if ./echo '![he<he<he](url)' | ./markdown | grep -i '<' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' sloppy context link .............. ' | |||||
if ./echo '[heh]( url "how about it?" )' | ./markdown | grep -i '</a>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' footnote urls formed properly .... ' | |||||
TEST='[hehehe]: hohoho "ha ha" | |||||
[hehehe][] | |||||
' | |||||
if ./echo "$TEST" | ./markdown | grep -i '�' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' linky-like []s work .............. ' | |||||
if ./echo '[foo]' | ./markdown | fgrep '[foo]' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' pseudo-protocol "id:" ............ ' | |||||
if ./echo '[foo](id:bar)' | ./markdown | fgrep 'a id' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' pseudo-protocol "class:" ......... ' | |||||
if ./echo '[foo](class:bar)' | ./markdown | fgrep 'span class' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' nested [][]s ..................... ' | |||||
count=`./echo '[[z](y)](x)' | ./markdown | tr '>' '\n' | grep -i '<a href' | wc -l` | |||||
if [ "$count" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' empty [][] tags .................. ' | |||||
V=" | |||||
[![][1]][2] | |||||
[1]: image1 | |||||
[2]: image2" | |||||
count=`echo "$V" | ./markdown | fgrep '[]' | wc -l` | |||||
if [ "$count" -lt 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,15 +0,0 @@ | |||||
./echo "embedded images" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' image with size extension ........ ' | |||||
if ./echo '![picture](pic =200x200)' | ./markdown | grep -i 'width=' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,147 +0,0 @@ | |||||
./echo "lists" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' two separated items (1) .......... ' | |||||
SEP=' * A | |||||
* B' | |||||
RES=`./echo "$SEP" | ./markdown` | |||||
count=`./echo "$RES" | grep -i '<ul>' | wc -l` | |||||
if [ "$count" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' two separated items (2) .......... ' | |||||
count=`./echo "$RES" | grep -i '<p>' | wc -l` | |||||
case `expr $count` in | |||||
2) ./echo "ok" ;; | |||||
1) ./echo "FAILED (known bug)" ;; | |||||
*) ./echo "FAILED ($count)" | |||||
rc=1 ;; | |||||
esac | |||||
./echo -n ' two adjacent items ............... ' | |||||
SEP=' * A | |||||
* B' | |||||
count=`./echo "$SEP" | ./markdown | grep -i '<p>' | wc -l` | |||||
if [ "$count" -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' two adjacent items, then space ... ' | |||||
SEP=' * A | |||||
* B | |||||
space, the final frontier' | |||||
count=`./echo "$SEP" | ./markdown | grep -i '<p>' | wc -l` | |||||
if [ "$count" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' nested lists (1) ................. ' | |||||
SUB=' | |||||
1. Sub (list) | |||||
2. Two (items) | |||||
3. Here' | |||||
SEP=' | |||||
* 1. Sub (list) | |||||
2. Two (items) | |||||
3. Here' | |||||
count1=`./echo "$SUB" | ./markdown | grep -i '<p>' | wc -l` | |||||
count=`./echo "$SEP" | ./markdown | grep -i '<p>' | wc -l` | |||||
if [ "$count" -eq "$count1" ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' nested lists (2) ................. ' | |||||
SUB=' | |||||
>A (list) | |||||
> | |||||
>1. Sub (list) | |||||
>2. Two (items) | |||||
>3. Here' | |||||
SEP=' | |||||
* A (list) | |||||
1. Sub (list) | |||||
2. Two (items) | |||||
3. Here | |||||
Here | |||||
* B (list)' | |||||
count1=`./echo "$SUB" | ./markdown | grep -i '<p>' | wc -l` | |||||
count=`./echo "$SEP" | ./markdown | grep -i '<p>' | wc -l` | |||||
if [ "$count" -gt $count1 ] ; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' blockquote inside list ........... ' | |||||
SEP=' | |||||
* A (list) | |||||
> quote | |||||
> me | |||||
dont quote me' | |||||
if ./echo "$SEP" | ./markdown | grep 'blockquote' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' empty list ....................... ' | |||||
SEP=' | |||||
- | |||||
- | |||||
' | |||||
if ./echo "$SEP" | ./markdown | grep '<li>' > /dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,25 +0,0 @@ | |||||
./echo "deeply nested lists" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' thrice-nested lists .............. ' | |||||
LIST=' | |||||
* top-level list ( list 1) | |||||
+ second-level list (list 2) | |||||
* first item third-level list (list 3) | |||||
+ * second item, third-level list, first item. (list 4) | |||||
* second item, third-level list, second item. | |||||
* top-level list again.' | |||||
count=`./echo "$LIST" | ./markdown | grep -i '<ul>' | wc -l` | |||||
if [ "$count" -eq 4 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,46 +0,0 @@ | |||||
./echo "misc" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' single paragraph ................. ' | |||||
RES=`./echo AAA | ./markdown` | |||||
count=`./echo "$RES" | grep -i '<p>' | wc -l` | |||||
if [ "$count" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' < -> < ........................ ' | |||||
if ./echo '<' | ./markdown | grep -i '<' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' `>` -> <code>></code> ......... ' | |||||
if ./echo '`>`' | ./markdown | grep -i '<code>></code>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' `` ` `` -> <code>`</code> ........ ' | |||||
if ./echo '`` ` ``' | ./markdown | grep '<code>`</code>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,96 +0,0 @@ | |||||
./echo "pandoc headers" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
if ./markdown -V | grep HEADER > /dev/null; then | |||||
./echo -n ' valid header ..................... ' | |||||
TEXT='% title | |||||
% author(s) | |||||
% date | |||||
' | |||||
count=`./echo "$TEXT" | ./markdown | grep title | wc -l` | |||||
if [ "$count" -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' valid header with -F0x0100........ ' | |||||
TEXT='% title | |||||
% author(s) | |||||
% date | |||||
' | |||||
count=`./echo "$TEXT" | ./markdown -F0x0100 | grep title | wc -l` | |||||
if [ "$count" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' invalid header ................... ' | |||||
TEXT='% title | |||||
% author(s) | |||||
a pony!' | |||||
count=`./echo "$TEXT" | ./markdown | grep title | wc -l` | |||||
if [ "$count" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' offset header .................... ' | |||||
TEXT=' | |||||
% title | |||||
% author(s) | |||||
% date | |||||
content' | |||||
count=`./echo "$TEXT" | ./markdown | grep title | wc -l` | |||||
if [ "$count" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' indented header .................. ' | |||||
TEXT=' % title | |||||
% author(s) | |||||
% date | |||||
content' | |||||
count=`./echo "$TEXT" | ./markdown | grep title | wc -l` | |||||
if [ "$count" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
else | |||||
./echo -n ' ignore headers ................... ' | |||||
TEXT='% title | |||||
% author(s) | |||||
% date | |||||
' | |||||
count=`./echo "$TEXT" | ./markdown | grep title | wc -l` | |||||
if [ "$count" -gt 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
fi | |||||
exit $rc |
@ -1,32 +0,0 @@ | |||||
./echo "paragraph blocking" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' paragraph followed by code ....... ' | |||||
SEP="a | |||||
b" | |||||
RES=`./echo "$SEP" | ./markdown` | |||||
pcount=`./echo "$RES" | grep -i '<p>' | wc -l` | |||||
ccount=`./echo "$RES" | grep -i '<code>' | wc -l` | |||||
if [ "$ccount" -eq 1 -a "$pcount" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' single-line paragraph ............ ' | |||||
if ./echo "a" | ./markdown | grep '<p>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,85 +0,0 @@ | |||||
./echo "markup peculiarities" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' list followed by header .......... ' | |||||
SRC=" | |||||
- AAA | |||||
- BBB | |||||
-" | |||||
count=`./echo "$SRC" | ./markdown | sed -e '1,/<\/ul>/d' | wc -l` | |||||
if [ "$count" -gt 1 ]; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' ul with mixed item prefixes ...... ' | |||||
SRC=" | |||||
- A | |||||
1. B | |||||
" | |||||
RES=`echo "$SRC" | ./markdown` | |||||
ulc=`./echo "$RES" | grep '<ul>' | wc -l` | |||||
olc=`./echo "$RES" | grep '<ol>' | wc -l` | |||||
if [ $ulc -eq 1 -a $olc -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' ol with mixed item prefixes ...... ' | |||||
SRC=" | |||||
1. A | |||||
- B | |||||
" | |||||
RES=`echo "$SRC" | ./markdown` | |||||
ulc=`./echo "$RES" | grep '<ul>' | wc -l` | |||||
olc=`./echo "$RES" | grep '<ol>' | wc -l` | |||||
if [ $olc -eq 1 -a $ulc -eq 0 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' forcing a <br/> .................. ' | |||||
SRC="this " | |||||
count=`echo "$SRC" | ./markdown | grep '<br/>' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' trimming single spaces ........... ' | |||||
SRC="this " | |||||
count=`echo "$SRC" | ./markdown | grep 'this ' | wc -l` | |||||
if [ $count -eq 1 ]; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
exit $rc |
@ -1,76 +0,0 @@ | |||||
./echo "pseudo-protocols" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' [](id:) links .................... ' | |||||
ASK=`./echo '[foo](id:bar)' | ./markdown` | |||||
if ./echo "$ASK" | grep '<a id="bar">foo</a>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' [](id:) links with MKD_NO_EXT .... ' | |||||
ASK=`./echo '[foo](id:bar)' | MARKDOWN_FLAGS=0x0040 ./markdown` | |||||
if ./echo "$ASK" | grep '<a id="bar">foo</a>' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' [](class:) links ................. ' | |||||
ASK=`./echo '[foo](class:bar)' | ./markdown` | |||||
if ./echo "$ASK" | grep '<span class="bar">foo</span>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' [](class:) links with MKD_NO_EXT . ' | |||||
ASK=`./echo '[foo](class:bar)' | MARKDOWN_FLAGS=0x0040 ./markdown` | |||||
if ./echo "$ASK" | grep '<span class="bar">foo</span>' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' [](raw:) links ................... ' | |||||
ASK=`./echo '[foo](raw:bar)' | ./markdown` | |||||
count1=`./echo "$ASK" | grep foo | wc -l` | |||||
count2=`./echo "$ASK" | grep bar | wc -l` | |||||
if [ "$count1" -eq 0 -a "$count2" -eq 1 ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' [](raw:) links with MKD_NO_EXT ... ' | |||||
ASK=`./echo '[foo](raw:bar)' | MARKDOWN_FLAGS=0x0040 ./markdown` | |||||
count1=`./echo "$ASK" | grep 'raw:bar' | wc -l` | |||||
count2=`./echo "$ASK" | grep 'a href' | wc -l` | |||||
if [ \( "$count1" -gt 0 \) -a \( "$count2" -gt 0 \) ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,18 +0,0 @@ | |||||
./echo "footnotes inside reparse sections" | |||||
rc=0 | |||||
RES="[![foo][]](bar) | |||||
[foo]: bar2" | |||||
./echo -n ' footnote inside [] section ....... ' | |||||
if ./echo "$RES" | ./markdown | fgrep bar2 >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
exit $rc |
@ -1,140 +0,0 @@ | |||||
./echo "smarty pants" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
MARKDOWN_FLAGS=0x0; export MARKDOWN_FLAGS | |||||
./echo -n ' (c) -> © .................... ' | |||||
if ./echo '(c)' | ./markdown | grep '©' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' (r) -> ® ..................... ' | |||||
if ./echo '(r)' | ./markdown | grep '®' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' (tm) -> ™ .................. ' | |||||
if ./echo '(tm)' | ./markdown | grep '™' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' ... -> … .................. ' | |||||
if ./echo '...' | ./markdown | grep '…' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' -- -> — .................... ' | |||||
if ./echo '--' | ./markdown | grep '—' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' - -> – ..................... ' | |||||
if ./echo 'regular - ' | ./markdown | grep '–' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' A-B -> A-B ....................... ' | |||||
if ./echo 'A-B' | ./markdown | grep '–' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' "fancy" -> “fancy” ... ' | |||||
if ./echo '"fancy"' | ./markdown | grep '“fancy”' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' '"'fancy'"' -> ‘fancy’ ... ' | |||||
if ./echo "'fancy'" | ./markdown | grep '‘fancy’' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n " don<b>'t -> don<b>’t ....... " | |||||
if ./echo "don<b>'t" | ./markdown | grep 'don<b>’t' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n " don't -> don’t ............. " | |||||
if ./echo "don't" | ./markdown | grep 'don’t' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n " it's -> it’s ............... " | |||||
if ./echo "it's" | ./markdown | grep 'it’s' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
if ./markdown -V | grep SUPERSCRIPT >/dev/null; then | |||||
./echo -n " A^B -> A<sup>B</sup> (-frelax) ... " | |||||
if ./echo "A^B" | ./markdown -frelax | grep '<sup>B</sup>' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n " A^B != A<sup>B</sup> (-fstrict) .. " | |||||
if ./echo "A^B" | ./markdown -fstrict | grep '<sup>B</sup>' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n " A^B in link title ................ " | |||||
if ./echo "[link](here 'A^B')" | ./markdown -frelax | grep '<sup>B</sup>' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
fi | |||||
exit $rc |
@ -1,29 +0,0 @@ | |||||
rc=0 | |||||
unset MARKDOWN_FLAGS | |||||
unset MKD_TABSTOP | |||||
eval `./markdown -V | tr ' ' '\n' | grep TAB` | |||||
if [ "${TAB:-4}" -eq 8 ]; then | |||||
./echo "dealing with tabstop derangement" | |||||
LIST=' | |||||
* A | |||||
* B | |||||
* C' | |||||
count1=`./echo "$LIST" | ./markdown | grep -i '<ul>' | wc -l` | |||||
count2=`./echo "$LIST" | MARKDOWN_FLAGS=0x0200 ./markdown | grep -i '<ul>' | wc -l` | |||||
./echo -n ' MARKDOWN_FLAGS breaks tabstops ... ' | |||||
if [ "$count1" -ne "$count2" ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
fi | |||||
exit $rc |
@ -1,44 +0,0 @@ | |||||
./echo "xml output with MKD_CDATA" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
./echo -n ' xml output from markdown() ....... ' | |||||
if ./echo '"hello,sailor"' | ./markdown -fcdata | grep '&' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' html output from markdown() ...... ' | |||||
if ./echo '"hello,sailor"' | ./markdown -fnocdata | grep '&' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
./echo -n ' xml output from mkd_text() ....... ' | |||||
if ./markdown -fcdata -t'"hello,sailor"' | grep '&' >/dev/null; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
rc=1 | |||||
fi | |||||
./echo -n ' html output from mkd_text() ...... ' | |||||
if ./markdown -fnocdata -t'"hello,sailor"' | grep '&' >/dev/null; then | |||||
./echo "FAILED" | |||||
rc=1 | |||||
else | |||||
./echo "ok" | |||||
fi | |||||
exit $rc |
@ -0,0 +1,33 @@ | |||||
Discount is primarily my work, but it has only reached the point | |||||
where it is via contributions, critiques, and bug reports from a | |||||
host of other people, some of which are listed before. If your | |||||
name isn't on this list, please remind me | |||||
-david parsons (orc@pell.chi.il.us) | |||||
Josh Wood -- Plan9 support. | |||||
Mike Schiraldi -- Reddit style automatic links, MANY MANY MANY | |||||
bug reports about boundary conditions and | |||||
places where I didn't get it right. | |||||
Jjgod Jiang -- Table of contents support. | |||||
Petite Abeille -- Many bug reports about places where I didn't | |||||
get it right. | |||||
Tim Channon -- inspiration for the `mkd_xhtmlpage()` function | |||||
Christian Herenz-- Many bug reports regarding my implementation of | |||||
`[]()` and `![]()` | |||||
A.S.Bradbury -- Portability bug reports for 64 bit systems. | |||||
Joyent -- Loan of a solaris box so I could get discount | |||||
working under solaris. | |||||
Ryan Tomayko -- Portability requests (and the rdiscount ruby | |||||
binding.) | |||||
yidabu -- feedback on the documentation, bug reports | |||||
against utf-8 support. | |||||
Pierre Joye -- bug reports, php discount binding. | |||||
Masayoshi Sekimura- perl discount binding. | |||||
Jeremy Hinegardner- bug reports about list handling. | |||||
Andrew White -- bug reports about the format of generated urls. | |||||
Steve Huff -- bug reports about Makefile portability (for Fink) | |||||
Ignacio Burgue?o-- bug reports about `>%class%` | |||||
Henrik Nyh -- bug reports about embedded html handling. | |||||
@ -0,0 +1,96 @@ | |||||
CC=@CC@ -I. -L. | |||||
AR=@AR@ | |||||
RANLIB=@RANLIB@ | |||||
BINDIR=@exedir@ | |||||
MANDIR=@mandir@ | |||||
LIBDIR=@libdir@ | |||||
INCDIR=@prefix@/include | |||||
PGMS=markdown | |||||
SAMPLE_PGMS=mkd2html makepage | |||||
@THEME@SAMPLE_PGMS+= theme | |||||
MKDLIB=libmarkdown.a | |||||
OBJS=mkdio.o markdown.o dumptree.o generate.o \ | |||||
resource.o docheader.o version.o toc.o css.o \ | |||||
xml.o Csio.o xmlpage.o @AMALLOC@ | |||||
all: $(PGMS) $(SAMPLE_PGMS) | |||||
install: $(PGMS) | |||||
@INSTALL_PROGRAM@ $(PGMS) $(DESTDIR)/$(BINDIR) | |||||
@INSTALL_DATA@ $(MKDLIB) $(DESTDIR)/$(LIBDIR) | |||||
@INSTALL_DATA@ mkdio.h $(DESTDIR)/$(INCDIR) | |||||
install.everything: install install.samples install.man | |||||
install.samples: $(SAMPLE_PGMS) install | |||||
@INSTALL_PROGRAM@ $(SAMPLE_PGMS) $(DESTDIR)/$(BINDIR) | |||||
@INSTALL_DIR@ $(DESTDIR)/$(MANDIR)/man1 | |||||
@INSTALL_DATA@ theme.1 $(DESTDIR)/$(MANDIR)/man1 | |||||
install.man: | |||||
@INSTALL_DIR@ $(DESTDIR)/$(MANDIR)/man3 | |||||
@INSTALL_DATA@ mkd-functions.3 markdown.3 mkd-line.3 $(DESTDIR)/$(MANDIR)/man3 | |||||
for x in mkd_line mkd_generateline; do \ | |||||
( echo '.\"' ; echo ".so man3/mkd-line.3" ) > $(DESTDIR)/$(MANDIR)/man3/$$x.3;\ | |||||
done | |||||
for x in mkd_in mkd_string; do \ | |||||
( echo '.\"' ; echo ".so man3/markdown.3" ) > $(DESTDIR)/$(MANDIR)/man3/$$x.3;\ | |||||
done | |||||
for x in mkd_compile mkd_css mkd_generatecss mkd_generatehtml mkd_cleanup mkd_doc_title mkd_doc_author mkd_doc_date; do \ | |||||
( echo '.\"' ; echo ".so man3/mkd-functions.3" ) > $(DESTDIR)/$(MANDIR)/man3/$$x.3; \ | |||||
done | |||||
@INSTALL_DIR@ $(DESTDIR)/$(MANDIR)/man7 | |||||
@INSTALL_DATA@ markdown.7 mkd-extensions.7 $(DESTDIR)/$(MANDIR)/man7 | |||||
@INSTALL_DIR@ $(DESTDIR)/$(MANDIR)/man1 | |||||
@INSTALL_DATA@ markdown.1 $(DESTDIR)/$(MANDIR)/man1 | |||||
install.everything: install install.man | |||||
version.o: version.c VERSION | |||||
$(CC) -DVERSION=\"`cat VERSION`\" -c version.c | |||||
markdown: main.o $(MKDLIB) | |||||
$(CC) -o markdown main.o -lmarkdown @LIBS@ | |||||
# example programs | |||||
@THEME@theme: theme.o $(MKDLIB) mkdio.h | |||||
@THEME@ $(CC) -o theme theme.o -lmarkdown @LIBS@ | |||||
mkd2html: mkd2html.o $(MKDLIB) mkdio.h | |||||
$(CC) -o mkd2html mkd2html.o -lmarkdown @LIBS@ | |||||
makepage: makepage.c $(MKDLIB) mkdio.h | |||||
$(CC) -o makepage makepage.c -lmarkdown @LIBS@ | |||||
main.o: main.c mkdio.h config.h | |||||
$(CC) -I. -c main.c | |||||
$(MKDLIB): $(OBJS) | |||||
$(AR) crv $(MKDLIB) $(OBJS) | |||||
$(RANLIB) $(MKDLIB) | |||||
test: $(PGMS) echo cols | |||||
@for x in tests/*.t; do \ | |||||
sh $$x || exit 1; \ | |||||
done | |||||
cols: tools/cols.c | |||||
$(CC) -o cols tools/cols.c | |||||
echo: tools/echo.c | |||||
$(CC) -o echo tools/echo.c | |||||
clean: | |||||
rm -f $(PGMS) $(SAMPLE_PGMS) *.o $(MKDLIB) | |||||
distclean spotless: clean | |||||
rm -f @GENERATED_FILES@ @CONFIGURE_FILES@ | |||||
markdown.o: markdown.c config.h cstring.h markdown.h | |||||
generate.o: generate.c config.h cstring.h markdown.h | |||||
dumptree.o: dumptree.c cstring.h markdown.h | |||||
mkdio.o: mkdio.c mkdio.h cstring.h config.h | |||||
xmlpage.o: xmlpage.c mkdio.h cstring.h config.h | |||||
toc.o: toc.c mkdio.h cstring.h config.h |
@ -0,0 +1,40 @@ | |||||
% Discount on Plan 9 | |||||
% Josh Wood | |||||
% 2009-06-12 | |||||
# *Discount* Markdown compiler on Plan 9 | |||||
## Build | |||||
% CONFIG='--enable-all-features' mk config | |||||
% mk install | |||||
% markdown -V | |||||
markdown: discount X.Y.Z DL_TAG HEADER DEBUG SUPERSCRIPT RELAXED DIV | |||||
`--enable-all-features` may be replaced by zero or more of: | |||||
--enable-dl-tag Use the DL tag extension | |||||
--enable-pandoc-header Use pandoc-style header blocks | |||||
--enable-superscript A^B becomes A<sup>B</sup> | |||||
--enable-amalloc Enable memory allocation debugging | |||||
--relaxed-emphasis underscores aren't special in the middle of words | |||||
--with-tabstops=N Set tabstops to N characters (default is 4) | |||||
--enable-div Enable >%id% divisions | |||||
--enable-alpha-list Enable (a)/(b)/(c) lists | |||||
--enable-all-features Turn on all stable optional features | |||||
## Notes | |||||
The supplied mkfile merely drives Discount's own configure script and | |||||
then APE's *psh* environment to build the Discount source, then copies | |||||
the result(s) to locations appropriate for system-wide use on Plan 9. | |||||
There are a few other *mk*(1) targets: | |||||
`install.libs`: Discount includes a C library and header. | |||||
Installation is optional. Plan 9 binaries are statically linked. | |||||
`install.man`: Add manual pages for markdown(1) and (6). | |||||
`install.progs`: Extra programs. *makepage* writes complete XHTML | |||||
documents, rather than fragments. *mkd2html* is similar, but produces | |||||
HTML. |
@ -0,0 +1,169 @@ | |||||
.TH MARKDOWN 1 | |||||
.SH NAME | |||||
markdown \- convert Markdown text to HTML | |||||
.SH SYNOPSIS | |||||
.B markdown | |||||
[ | |||||
.B -dTV | |||||
] | |||||
[ | |||||
.BI -b " url-base | |||||
] | |||||
[ | |||||
.BI -F " bitmap | |||||
] | |||||
[ | |||||
.BI -f " flags | |||||
] | |||||
[ | |||||
.BI -o " ofile | |||||
] | |||||
[ | |||||
.BI -s " text | |||||
] | |||||
[ | |||||
.BI -t " text | |||||
] | |||||
[ | |||||
.I file | |||||
] | |||||
.SH DESCRIPTION | |||||
The | |||||
.I markdown | |||||
utility reads the | |||||
.IR Markdown (6)-formatted | |||||
.I file | |||||
(or standard input) and writes its | |||||
.SM HTML | |||||
fragment representation on standard output. | |||||
.PP | |||||
The options are: | |||||
.TF dfdoptions | |||||
.TP | |||||
.BI -b " url-base | |||||
Links in source begining with | |||||
.B / | |||||
will be prefixed with | |||||
.I url-base | |||||
in the output. | |||||
.TP | |||||
.B -d | |||||
Instead of printing an | |||||
.SM HTML | |||||
fragment, print a parse tree. | |||||
.TP | |||||
.BI -F " bitmap | |||||
Set translation flags. | |||||
.I Bitmap | |||||
is a bit map of the various configuration options described in | |||||
.IR markdown (2). | |||||
.TP | |||||
.BI -f " flags | |||||
Set or clear various translation | |||||
.IR flags , | |||||
described below. | |||||
.I Flags | |||||
are in a comma-delimited list, with an optional | |||||
.B + | |||||
(set) prefix on each flag. | |||||
.TP | |||||
.BI -o " ofile | |||||
Write the generated | |||||
.SM HTML | |||||
to | |||||
.IR ofile . | |||||
.TP | |||||
.BI -s " text | |||||
Use the | |||||
.IR markdown (2) | |||||
function to format the | |||||
.I text | |||||
on standard input. | |||||
.TP | |||||
.B -T | |||||
Under | |||||
.B -f | |||||
.BR toc , | |||||
print the table of contents as an unordered list before the usual | |||||
.SM HTML | |||||
output. | |||||
.TP | |||||
.BI -t " text | |||||
Use | |||||
.IR mkd_text | |||||
(in | |||||
.IR markdown (2)) | |||||
to format | |||||
.I text | |||||
instead of processing standard input with | |||||
.IR markdown . | |||||
.TP | |||||
.B -V | |||||
Show version number and configuration. If the version includes the string | |||||
.BR DL_TAG , | |||||
.I markdown | |||||
was configured with definition list support. If the version includes the string | |||||
.BR HEADER , | |||||
.I markdown | |||||
was configured to support pandoc header blocks. | |||||
.PD | |||||
.SS TRANSLATION FLAGS | |||||
The translation flags understood by | |||||
.B -f | |||||
are: | |||||
.TF \ noheader | |||||
.TP | |||||
.B noimage | |||||
Don't allow image tags. | |||||
.TP | |||||
.B nolinks | |||||
Don't allow links. | |||||
.TP | |||||
.B nohtml | |||||
Don't allow any embedded HTML. | |||||
.TP | |||||
.B cdata | |||||
Generate valid XML output. | |||||
.TP | |||||
.B noheader | |||||
Do not process pandoc headers. | |||||
.TP | |||||
.B notables | |||||
Do not process the syntax extension for tables. | |||||
.TP | |||||
.B tabstops | |||||
Use Markdown-standard 4-space tabstops. | |||||
.TP | |||||
.B strict | |||||
Disable superscript and relaxed emphasis. | |||||
.TP | |||||
.B relax | |||||
Enable superscript and relaxed emphasis (the default). | |||||
.TP | |||||
.B toc | |||||
Enable table of contents support, generated from headings (in | |||||
.IR markdown (6)) | |||||
in the source. | |||||
.TP | |||||
.B 1.0 | |||||
Revert to Markdown 1.0 compatibility. | |||||
.PD | |||||
.PP | |||||
For example, | |||||
.B -f nolinks,quot | |||||
tells | |||||
.I markdown | |||||
not to allow | |||||
.B <a> | |||||
tags, and to expand double quotes. | |||||
.SH SOURCE | |||||
.B /sys/src/cmd/discount | |||||
.SH SEE ALSO | |||||
.IR markdown (2), | |||||
.IR markdown (6) | |||||
.PP | |||||
http://daringfireball.net/projects/markdown/, | |||||
``Markdown''. | |||||
.SH DIAGNOSTICS | |||||
.I Markdown | |||||
exits 0 on success and >0 if an error occurs. |
@ -0,0 +1,332 @@ | |||||
.TH MARKDOWN 2 | |||||
.SH NAME | |||||
mkd_in, mkd_string, markdown, mkd_compile, mkd_css, mkd_generatecss, | |||||
mkd_document, mkd_generatehtml, mkd_xhtmlpage, mkd_toc, mkd_generatetoc, | |||||
mkd_cleanup, mkd_doc_title, mkd_doc_author, mkd_doc_date, mkd_line, | |||||
mkd_generateline \- convert Markdown text to HTML | |||||
.SH SYNOPSIS | |||||
.ta \w'MMIOT* 'u | |||||
.B #include <mkdio.h> | |||||
.PP | |||||
.B | |||||
MMIOT* mkd_in(FILE *input) | |||||
.PP | |||||
.B | |||||
MMIOT* mkd_string(char *string, int size) | |||||
.PP | |||||
.B | |||||
int markdown(MMIOT *doc, FILE *output, int flags) | |||||
.PP | |||||
.B | |||||
int mkd_compile(MMIOT *document, int flags) | |||||
.PP | |||||
.B | |||||
int mkd_css(MMIOT *document, char **doc) | |||||
.PP | |||||
.B | |||||
int mkd_generatecss(MMIOT *document, FILE *output) | |||||
.PP | |||||
.B | |||||
int mkd_document(MMIOT *document, char **doc) | |||||
.PP | |||||
.B | |||||
int mkd_generatehtml(MMIOT *document, FILE *output) | |||||
.PP | |||||
.B | |||||
int mkd_xhtmlpage(MMIOT *document, int flags, FILE *output) | |||||
.PP | |||||
.B | |||||
int mkd_toc(MMIOT *document, char **doc) | |||||
.PP | |||||
.B | |||||
void mkd_generatetoc(MMIOT *document, FILE *output) | |||||
.PP | |||||
.B | |||||
void mkd_cleanup(MMIOT*); | |||||
.PP | |||||
.B | |||||
char* mkd_doc_title(MMIOT*) | |||||
.PP | |||||
.B | |||||
char* mkd_doc_author(MMIOT*) | |||||
.PP | |||||
.B | |||||
char* mkd_doc_date(MMIOT*) | |||||
.PP | |||||
.B | |||||
int mkd_line(char *string, int size, char **doc, int flags) | |||||
.PP | |||||
.B | |||||
int mkd_generateline(char *string, int size, FILE *output, int flags) | |||||
.PD | |||||
.PP | |||||
.SH DESCRIPTION | |||||
These functions convert | |||||
.IR Markdown (6) | |||||
text into | |||||
.SM HTML | |||||
markup. | |||||
.PP | |||||
.I Mkd_in | |||||
reads the text referenced by pointer to | |||||
.B FILE | |||||
.I input | |||||
and returns a pointer to an | |||||
.B MMIOT | |||||
structure of the form expected by | |||||
.I markdown | |||||
and the other converters. | |||||
.I Mkd_string | |||||
accepts one | |||||
.I string | |||||
and returns a pointer to | |||||
.BR MMIOT . | |||||
.PP | |||||
After such preparation, | |||||
.I markdown | |||||
converts | |||||
.I doc | |||||
and writes the result to | |||||
.IR output , | |||||
while | |||||
.I mkd_compile | |||||
transforms | |||||
.I document | |||||
in-place. | |||||
.PP | |||||
One or more of the following | |||||
.I flags | |||||
(combined with | |||||
.BR OR ) | |||||
control | |||||
.IR markdown 's | |||||
processing of | |||||
.IR doc : | |||||
.TF MKD_NOIMAGE | |||||
.TP | |||||
.B MKD_NOIMAGE | |||||
Do not process | |||||
.B ![] | |||||
and remove | |||||
.B <img> | |||||
tags from the output. | |||||
.TP | |||||
.B MKD_NOLINKS | |||||
Do not process | |||||
.B [] | |||||
and remove | |||||
.B <a> | |||||
tags from the output. | |||||
.TP | |||||
.B MKD_NOPANTS | |||||
Suppress Smartypants-style replacement of quotes, dashes, or ellipses. | |||||
.TP | |||||
.B MKD_STRICT | |||||
Disable superscript and relaxed emphasis processing if configured; otherwise a no-op. | |||||
.TP | |||||
.B MKD_TAGTEXT | |||||
Process as inside an | |||||
.SM HTML | |||||
tag: no | |||||
.BR <em> , | |||||
no | |||||
.BR <bold> , | |||||
no | |||||
.SM HTML | |||||
or | |||||
.B [] | |||||
expansion. | |||||
.TP | |||||
.B MKD_NO_EXT | |||||
Don't process pseudo-protocols (in | |||||
.IR markdown (6)). | |||||
.TP | |||||
.B MKD_CDATA | |||||
Generate code for | |||||
.SM XML | |||||
.B ![CDATA[...]] | |||||
element. | |||||
.TP | |||||
.B MKD_NOHEADER | |||||
Don't process Pandoc-style headers. | |||||
.TP | |||||
.B MKD_TABSTOP | |||||
When reading documents, expand tabs to 4 spaces, overriding any compile-time configuration. | |||||
.TP | |||||
.B MKD_TOC | |||||
Label headings for use with the | |||||
.I mkd_generatetoc | |||||
and | |||||
.I mkd_toc | |||||
functions. | |||||
.TP | |||||
.B MKD_1_COMPAT | |||||
MarkdownTest_1.0 compatibility. Trim trailing spaces from first line of code blocks and disable implicit reference links (in | |||||
.IR markdown (6)). | |||||
.TP | |||||
.B MKD_AUTOLINK | |||||
Greedy | |||||
.SM URL | |||||
generation. When set, any | |||||
.SM URL | |||||
is converted to a hyperlink, even those not encased in | |||||
.BR <> . | |||||
.TP | |||||
.B MKD_SAFELINK | |||||
Don't make hyperlinks from | |||||
.B [][] | |||||
links that have unknown | |||||
.SM URL | |||||
protocol types. | |||||
.TP | |||||
.B MKD_NOTABLES | |||||
Do not process the syntax extension for tables (in | |||||
.IR markdown (6)). | |||||
.TP | |||||
.B MKD_EMBED | |||||
All of | |||||
.BR MKD_NOLINKS , | |||||
.BR MKD_NOIMAGE , | |||||
and | |||||
.BR MKD_TAGTEXT . | |||||
.PD | |||||
.PP | |||||
This implementation supports | |||||
Pandoc-style | |||||
headers and inline | |||||
.SM CSS | |||||
.B <style> | |||||
blocks, but | |||||
.I markdown | |||||
does not access the data provided by these extensions. | |||||
The following functions do, and allow other manipulations. | |||||
.PP | |||||
Given a pointer to | |||||
.B MMIOT | |||||
prepared by | |||||
.I mkd_in | |||||
or | |||||
.IR mkd_string , | |||||
.I mkd_compile | |||||
compiles the | |||||
.I document | |||||
into | |||||
.BR <style> , | |||||
Pandoc, and | |||||
.SM HTML | |||||
sections. It accepts the | |||||
.I flags | |||||
described for | |||||
.IR markdown , | |||||
above. | |||||
.PP | |||||
Once compiled, the document particulars can be read and written: | |||||
.PP | |||||
.I Mkd_css | |||||
allocates a string and populates it with any | |||||
.B <style> | |||||
sections from the document. | |||||
.I Mkd_generatecss | |||||
writes any | |||||
.B <style> | |||||
sections to | |||||
.IR output . | |||||
.PP | |||||
.I Mkd_document | |||||
points | |||||
.I doc | |||||
to the | |||||
.B MMIOT | |||||
.IR document , | |||||
returning | |||||
.IR document 's | |||||
size. | |||||
.PP | |||||
.I Mkd_generatehtml | |||||
writes the rest of the | |||||
.I document | |||||
to the | |||||
.IR output . | |||||
.PP | |||||
.IR Mkd_doc_title , | |||||
.IR mkd_doc_author , | |||||
and | |||||
.I mkd_doc_date | |||||
read the contents of any Pandoc header. | |||||
.PP | |||||
.I Mkd_xhtmlpage | |||||
writes an | |||||
.SM XHTML | |||||
page representation of the document. | |||||
It accepts the | |||||
.I flags | |||||
described for | |||||
.IR markdown , | |||||
above. | |||||
.PP | |||||
.I Mkd_toc | |||||
.IR malloc s | |||||
a buffer into which it writes an outline, in the form of a | |||||
.B <ul> | |||||
element populated with | |||||
.BR <li> s | |||||
each containing a link to successive headings in the | |||||
.IR document . | |||||
It returns the size of that string. | |||||
.I Mkd_generatetoc | |||||
is similar, | |||||
but writes the outline to the | |||||
.I output | |||||
referenced by a pointer to | |||||
.BR FILE . | |||||
.PP | |||||
.I Mkd_cleanup | |||||
deletes a processed | |||||
.BR MMIOT . | |||||
.PP | |||||
The last two functions convert a single line of markdown source, for example a page title or a signature. | |||||
.I Mkd_line | |||||
allocates a buffer into which it writes an | |||||
.SM HTML | |||||
fragment representation of the | |||||
.IR string . | |||||
.I Mkd_generateline | |||||
writes the result to | |||||
.IR output . | |||||
.SH SOURCE | |||||
.B /sys/src/cmd/discount | |||||
.SH SEE ALSO | |||||
.IR markdown (1), | |||||
.IR markdown (6) | |||||
.SH DIAGNOSTICS | |||||
The | |||||
.I mkd_in | |||||
and | |||||
.I mkd_string | |||||
functions return a pointer to | |||||
.B MMIOT | |||||
on success, null on failure. | |||||
.IR Markdown , | |||||
.IR mkd_compile , | |||||
.IR mkd_style , | |||||
and | |||||
.I mkd_generatehtml | |||||
return | |||||
.B 0 | |||||
on success, | |||||
.B -1 | |||||
otherwise. | |||||
.SH BUGS | |||||
Error handling is minimal at best. | |||||
.PP | |||||
The | |||||
.B MMIOT | |||||
created by | |||||
.I mkd_string | |||||
is deleted by the | |||||
.I markdown | |||||
function. | |||||
.PP | |||||
This is an | |||||
.SM APE | |||||
library. |
@ -0,0 +1,543 @@ | |||||
.TH MARKDOWN 6 | |||||
.SH NAME | |||||
Markdown \- text formatting syntax | |||||
.SH DESCRIPTION | |||||
Markdown | |||||
is a text markup syntax for machine conversion to | |||||
the more complex | |||||
.SM HTML | |||||
or | |||||
.SM XHTML | |||||
markup languages. | |||||
It is intended to be easy to read and to write, with | |||||
emphasis on readability. | |||||
A Markdown-formatted document should be publishable as-is, | |||||
in plain text, without the formatting distracting the reader. | |||||
.PP | |||||
The biggest source of inspiration for Markdown's | |||||
syntax is the format of plain text email. The markup is comprised entirely | |||||
of punctuation characters, chosen so as to look like what they mean. | |||||
Asterisks around a word look like | |||||
.IR *emphasis* . | |||||
Markdown lists look like lists. Even | |||||
blockquotes look like quoted passages of text, assuming the reader has | |||||
used email. | |||||
.PP | |||||
.SS Block Elements | |||||
.TF W | |||||
.PD | |||||
.TP | |||||
Paragraphs and Line Breaks | |||||
A paragraph is one or more consecutive lines of text, separated | |||||
by one or more blank lines. (A blank line is any line that looks like a | |||||
blank line -- a line containing nothing but spaces or tabs is considered | |||||
blank.) Normal paragraphs should not be indented with spaces or tabs. | |||||
.IP | |||||
Lines may be freely broken for readability; Markdown | |||||
does not translate source line breaks to | |||||
.B <br /> | |||||
tags. To request generation of | |||||
.B <br /> | |||||
in the output, end a line with two or more spaces, then a newline. | |||||
.TP | |||||
Headings | |||||
Headings can be marked in two ways, called | |||||
.I setext | |||||
and | |||||
.IR atx . | |||||
.IP | |||||
Setext-style headings are | |||||
``underlined'' using equal signs (for first-level | |||||
headings) and dashes (for second-level headings). | |||||
.IP | |||||
Atx-style headings use 1-6 hash characters at the start of the line, | |||||
corresponding to | |||||
.SM HTML | |||||
.BR <h^(1-6)^> . | |||||
Optional closing hashes may follow | |||||
the heading text. | |||||
.TP | |||||
Blockquotes | |||||
Lines beginning with | |||||
.B > | |||||
are output in blockquotes. | |||||
Blockquotes can be nested | |||||
by multiple levels of | |||||
.BR >> . | |||||
Blockquotes can contain other Markdown elements, including | |||||
headings, lists, and code blocks. | |||||
.TP | |||||
Lists | |||||
Markdown supports ordered (numbered) and unordered (bulleted) lists. | |||||
List markers typically start at the left margin, but may be indented by | |||||
up to three spaces. | |||||
List markers must be followed by one or more spaces | |||||
or a tab, then the list item text. | |||||
A newline terminates each list item. | |||||
.IP | |||||
Unordered lists use asterisks, pluses, and hyphens interchangeably as | |||||
list markers. | |||||
.IP | |||||
Ordered lists use integers followed by periods as list markers. | |||||
The order of the integers is not interpreted, | |||||
but the list should begin with | |||||
.BR 1 . | |||||
.IP | |||||
If list items are separated by blank lines, Markdown will wrap each list | |||||
item in | |||||
.B <p> | |||||
tags in the | |||||
.SM HTML | |||||
output. | |||||
.IP | |||||
List items may consist of multiple paragraphs. | |||||
Each subsequent | |||||
paragraph within a list item must be indented by either 4 spaces | |||||
or one tab. | |||||
To put a blockquote within a list item, the blockquote's | |||||
.B > | |||||
marker needs to be indented. | |||||
To put a code block within a list item, the code block needs | |||||
to be indented | |||||
.I twice | |||||
-- 8 spaces or two tabs. | |||||
.TP | |||||
Code Blocks | |||||
To produce a code block, indent every line of the | |||||
block by at least 4 spaces or 1 tab. | |||||
A code block continues until it reaches a line that is not indented. | |||||
.IP | |||||
Rather than forming normal paragraphs, the lines | |||||
of a code block are interpreted literally. | |||||
Regular Markdown syntax is not processed within code blocks. | |||||
Markdown wraps a code block in both | |||||
.B <pre> | |||||
and | |||||
.B <code> | |||||
tags. | |||||
One level of indentation -- 4 | |||||
spaces or 1 tab -- is removed from each line of the code block in | |||||
the output. | |||||
.TP | |||||
Horizontal Rules | |||||
Produce a horizontal rule tag | |||||
.RB ( <hr\ /> ) | |||||
by placing three or | |||||
more hyphens, asterisks, or underscores on a line by themselves. | |||||
.SS Span Elements | |||||
.TF W | |||||
.PD | |||||
.TP | |||||
Links | |||||
Markdown supports two styles of links: | |||||
.I inline | |||||
and | |||||
.IR reference . | |||||
In both styles, the link text is delimited by square brackets | |||||
.RB ( [] ). | |||||
To create an inline link, use a set of regular parentheses immediately | |||||
after the link text's closing square bracket. | |||||
Inside the parentheses, | |||||
put the link URL, along with an optional | |||||
title for the link surrounded in double quotes. | |||||
For example: | |||||
.IP | |||||
.EX | |||||
An [example](http://example.com/ "Title") inline link. | |||||
.EE | |||||
.IP | |||||
Reference-style links use a second set of square brackets, inside | |||||
which you place a label of your choosing to identify the link: | |||||
.IP | |||||
.EX | |||||
An [example][id] reference-style link. | |||||
.EE | |||||
.IP | |||||
The label is then assigned a value on its own line, anywhere in the document: | |||||
.IP | |||||
.EX | |||||
[id]: http://example.com/ "Optional Title" | |||||
.EE | |||||
.IP | |||||
Link label names may consist of letters, numbers, spaces, and | |||||
punctuation. | |||||
Labels are not case sensitive. | |||||
An empty label bracket | |||||
set after a reference-style link implies the link label is equivalent to | |||||
the link text. | |||||
A URL value can then be assigned to the link by referencing | |||||
the link text as the label name. | |||||
.TP | |||||
Emphasis | |||||
Markdown treats asterisks | |||||
.RB ( * ) | |||||
and underscores | |||||
.RB ( _ ) | |||||
as indicators of emphasis. | |||||
Text surrounded with single asterisks or underscores | |||||
will be wrapped with an | |||||
.SM HTML | |||||
.B <em> | |||||
tag. | |||||
Double asterisks or underscores generate an | |||||
.SM HTML | |||||
.B <strong> | |||||
tag. | |||||
.TP | |||||
Code | |||||
To indicate a span of code, wrap it with backtick quotes | |||||
.RB ( ` ). | |||||
Unlike a code block, a code span indicates code within a | |||||
normal paragraph. | |||||
To include a literal backtick character within a code span, you can use | |||||
multiple backticks as the opening and closing delimiters: | |||||
.IP | |||||
.EX | |||||
``There is a literal backtick (`) here.`` | |||||
.EE | |||||
.TP | |||||
Images | |||||
Markdown image syntax is intended to resemble that | |||||
for links, allowing for two styles, once again | |||||
.I inline | |||||
and | |||||
.IR reference . | |||||
The syntax is as for each respective style of link, described above, but | |||||
prefixed with an exclamation mark character | |||||
.RB ( ! ). | |||||
Inline image syntax looks like this: | |||||
.IP | |||||
.EX | |||||
![Alt text](/path/to/img.jpg "Optional title") | |||||
.EE | |||||
.IP | |||||
That is: | |||||
An exclamation mark; | |||||
followed by a set of square brackets containing the `alt' | |||||
attribute text for the image; | |||||
followed by a set of parentheses containing the URL or path to | |||||
the image, and an optional `title' attribute enclosed in double | |||||
or single quotes. | |||||
.IP | |||||
Reference-style image syntax looks like this: | |||||
.IP | |||||
.EX | |||||
![Alt text][id] | |||||
.EE | |||||
.IP | |||||
Where | |||||
.I id | |||||
is a label used as for reference-style URL links, described above. | |||||
.SS Convenience | |||||
.TF W | |||||
.PD | |||||
.TP | |||||
Automatic Links | |||||
There is a shortcut style for creating ``automatic'' | |||||
links for URLs and email addresses. | |||||
Surround the URL | |||||
or address with angle brackets. | |||||
.TP | |||||
Backslash Escapes | |||||
Use backslash escapes to generate literal | |||||
characters which would otherwise have special meaning in Markdown's | |||||
formatting syntax. | |||||
.TP | |||||
Inline HTML | |||||
For markup that is not covered by Markdown's | |||||
syntax, simply use the | |||||
.SM HTML | |||||
directly. | |||||
The only restrictions are that block-level | |||||
.SM HTML | |||||
elements -- | |||||
.BR <div> , | |||||
.BR <table> , | |||||
.BR <pre> , | |||||
.BR <p> , | |||||
etc. -- must be separated from surrounding | |||||
content by blank lines, and the start and end tags of the block should | |||||
not be indented with tabs or spaces. Markdown formatting syntax is | |||||
not processed within block-level | |||||
.SM HTML | |||||
tags. | |||||
.IP | |||||
Span-level | |||||
.SM HTML | |||||
tags -- e.g. | |||||
.BR <span> , | |||||
.BR <cite> , | |||||
or | |||||
.B <del> | |||||
-- can be | |||||
used anywhere in a Markdown | |||||
paragraph, list item, or heading. | |||||
It is permitted to use | |||||
.SM HTML | |||||
tags instead of Markdown formatting; e.g. | |||||
.SM HTML | |||||
.B <a> | |||||
or | |||||
.B <img> | |||||
tags instead of Markdown's | |||||
link or image syntax. | |||||
Unlike block-level | |||||
.SM HTML | |||||
tags, Markdown | |||||
syntax | |||||
.I is | |||||
processed within the elements of span-level tags. | |||||
.TP | |||||
Automatic Special Character Escapes | |||||
To be displayed literally in a user agent, the characters | |||||
.B < | |||||
and | |||||
.B & | |||||
must appear as escaped entities in | |||||
.SM HTML | |||||
source, e.g. | |||||
.B < | |||||
and | |||||
.BR & . | |||||
Markdown | |||||
allows natural use of these characters, taking care of | |||||
the necessary escaping. | |||||
The ampersand part of a directly-used | |||||
.SM HTML | |||||
entity remains unchanged; otherwise it will be translated | |||||
into | |||||
.BR & . | |||||
Inside code spans and blocks, angle brackets and | |||||
ampersands are always encoded automatically. | |||||
This makes it easy to use Markdown to write about | |||||
.SM HTML | |||||
code. | |||||
.PP | |||||
.SS Smarty Pants | |||||
The | |||||
.IR markdown (1) | |||||
utility transforms a few plain text symbols into their typographically-fancier | |||||
.SM HTML | |||||
entity equivalents. | |||||
These are extensions to the standard Markdown syntax. | |||||
.TF W | |||||
.PD | |||||
.TP | |||||
Punctuation | |||||
Input single- and double-quotes are transformed | |||||
into ``curly'' quote entities in the output (e.g., | |||||
.B 'text' | |||||
becomes | |||||
.BR ‘text’ ). | |||||
Input double-dashes | |||||
.RB ( -- ) | |||||
and triple-dashes become en- and em-dashes, respectively, | |||||
while a series of three dots | |||||
.RB ( ... ) | |||||
in the input becomes an ellipsis entity | |||||
.RB ( … ) | |||||
in the | |||||
.SM HTML | |||||
output. | |||||
.TP | |||||
Symbols | |||||
Three other transformations replace the common plain-text shorthands | |||||
.BR (c) , | |||||
.BR (r) , | |||||
and | |||||
.BR (tm) | |||||
from the input with their respective | |||||
.SM HTML | |||||
entities. (As in | |||||
.B (c) | |||||
becoming | |||||
.BR © , | |||||
the Copyright symbol entity.) | |||||
.TP | |||||
Fractions | |||||
A small set of plain-text shorthands for fractions is recognized. | |||||
.B 1/4 | |||||
becomes | |||||
.BR ¼ , | |||||
for example. These fraction notations are replaced with their | |||||
.SM HTML | |||||
entity equivalents: | |||||
.BR 1/4 , | |||||
.BR 1/2 , | |||||
.BR 3/4 . | |||||
.B 1/4th | |||||
and | |||||
.B 3/4ths | |||||
are replaced with their entity and the indicated ordinal suffix letters. | |||||
.PP | |||||
Like the basic Markdown syntax, none of the ``Smarty Pants'' extensions are processed | |||||
inside code blocks or spans. | |||||
.PP | |||||
.SS Discount Extensions | |||||
.IR Markdown (1) | |||||
recognizes some extensions to the Markdown format, | |||||
many of them adopted or adapted from other Markdown | |||||
interpreters or document formatting systems. | |||||
.TF W | |||||
.PD | |||||
.TP | |||||
Pandoc Headers | |||||
If | |||||
.I markdown | |||||
was configured with | |||||
.BR --enable-pandoc-header , | |||||
the markdown source can have a 3-line Pandoc header in the format of | |||||
.IP | |||||
.EX | |||||
% Title | |||||
% Author | |||||
% Date | |||||
.EE | |||||
.IP | |||||
whose data is available to the | |||||
.IR mkd_doc_title , | |||||
.IR mkd_doc_author , | |||||
and | |||||
.I mkd_doc_date | |||||
(in | |||||
.IR markdown (2)) | |||||
functions. | |||||
.TP | |||||
Embedded Stylesheets | |||||
Stylesheets may be defined and modified in a | |||||
.B <style> | |||||
block. A style block is parsed like any other block-level | |||||
.SM HTML; | |||||
.B <style> | |||||
starting on column 1, raw | |||||
.SM HTML | |||||
(or, in this case, | |||||
.SM CSS \) | |||||
following it, and either ending with a | |||||
.B </style> | |||||
at the end of the line or at the beginning of a subsequent line. | |||||
.IP | |||||
Style blocks apply to the entire document regardless of where they are defined. | |||||
.TP | |||||
Image Dimensions | |||||
Image specification has been extended with an argument describing image dimensions: | |||||
.BI = height x width. | |||||
For an image 400 pixels high and 300 wide, the new syntax is: | |||||
.IP | |||||
.EX | |||||
![Alt text](/path/to/image.jpg =400x300 "Title") | |||||
.EE | |||||
.TP | |||||
Pseudo-Protocols | |||||
Pseudo-protocols that may replace the common | |||||
.B http: | |||||
or | |||||
.B mailto: | |||||
have been added to the link syntax described above. | |||||
.IP | |||||
.BR abbr : | |||||
Text following is used as the | |||||
.B title | |||||
attribute of an | |||||
.B abbr | |||||
tag wrapping the link text. So | |||||
.B [LT](abbr:Link Text) | |||||
gives | |||||
.B <abbr title="Link Text">LT</abbr>. | |||||
.IP | |||||
.BR id : | |||||
The link text is marked up and written to the output, wrapped with | |||||
.B <a id=text following> | |||||
and | |||||
.BR </a> . | |||||
.IP | |||||
.BR class : | |||||
The link text is marked up and written to the output, wrapped with | |||||
.B <span class=text following> | |||||
and | |||||
.BR </span> . | |||||
.IP | |||||
.BR raw : | |||||
Text following is written to the output with no further processing. | |||||
The link text is discarded. | |||||
.TP | |||||
Alphabetic Lists | |||||
If | |||||
.I markdown | |||||
was configured with | |||||
.BR --enable-alpha-list , | |||||
.IP | |||||
.EX | |||||
a. this | |||||
b. is | |||||
c. an alphabetic | |||||
d. list | |||||
.EE | |||||
.IP | |||||
yields an | |||||
.SM HTML | |||||
.B ol | |||||
ordered list. | |||||
.TP | |||||
Definition Lists | |||||
If configured with | |||||
.BR --enable-dl-tag , | |||||
markup for definition lists is enabled. A definition list item is defined as | |||||
.IP | |||||
.EX | |||||
=term= | |||||
definition | |||||
.EE | |||||
.TP | |||||
Tables | |||||
Tables are specified with a pipe | |||||
.RB ( | ) | |||||
and dash | |||||
.RB ( - ) | |||||
marking. The markdown text | |||||
.IP | |||||
.EX | |||||
header0|header1 | |||||
-------|------- | |||||
textA|textB | |||||
textC|textD | |||||
.EE | |||||
.IP | |||||
will produce an | |||||
.SM HTML | |||||
.B table | |||||
of two columns and three rows. | |||||
A header row is designated by ``underlining'' with dashes. | |||||
Declare a column's alignment by affixing a colon | |||||
.RB ( : ) | |||||
to the left or right end of the dashes underlining its header. | |||||
In the output, this | |||||
yields the corresponding value for the | |||||
.B align | |||||
attribute on each | |||||
.B td | |||||
cell in the column. | |||||
A colon at both ends of a column's header dashes indicates center alignment. | |||||
.TP | |||||
Relaxed Emphasis | |||||
If configured with | |||||
.BR --relaxed-emphasis , | |||||
the rules for emphasis are changed so that a single | |||||
.B _ | |||||
will not count as an emphasis character in the middle of a word. | |||||
This is useful for documenting some code where | |||||
.B _ | |||||
appears frequently, and would normally require a backslash escape. | |||||
.PD | |||||
.SH SEE ALSO | |||||
.IR markdown (1), | |||||
.IR markdown (2) | |||||
.PP | |||||
http://daringfireball.net/projects/markdown/syntax/, | |||||
``Markdown: Syntax''. | |||||
.PP | |||||
http://daringfireball.net/projects/smartypants/, | |||||
``Smarty Pants''. | |||||
.PP | |||||
http://michelf.com/projects/php-markdown/extra/#table, | |||||
``PHP Markdown Extra: Tables''. |
@ -0,0 +1,37 @@ | |||||
BIN=/$objtype/bin | |||||
CC='cc -D_BSD_EXTENSION' | |||||
markdown: | |||||
ape/psh -c 'cd .. && make' | |||||
none:V: markdown | |||||
test: markdown | |||||
ape/psh -c 'cd ..&& make test' | |||||
install: markdown | |||||
cp ../markdown $BIN/markdown | |||||
install.progs: install | |||||
cp ../makepage $BIN/makepage | |||||
cp ../mkd2html $BIN/mkd2html | |||||
install.libs: install | |||||
cp ../mkdio.h /sys/include/ape/mkdio.h | |||||
cp ../libmarkdown.a /$objtype/lib/ape/libmarkdown.a | |||||
install.man: install | |||||
cp markdown.1 /sys/man/1/markdown | |||||
cp markdown.2 /sys/man/2/markdown | |||||
cp markdown.6 /sys/man/6/markdown | |||||
installall:V: install.libs install.man install.progs | |||||
config: | |||||
ape/psh -c 'cd .. && ./configure.sh $CONFIG' | |||||
clean: | |||||
ape/psh -c 'cd .. && make clean' | |||||
nuke: | |||||
ape/psh -c 'cd .. && make distclean' |
@ -0,0 +1 @@ | |||||
1.5.5 |
@ -0,0 +1,76 @@ | |||||
/* markdown: a C implementation of John Gruber's Markdown markup language. | |||||
* | |||||
* Copyright (C) 2009 David L Parsons. | |||||
* The redistribution terms are provided in the COPYRIGHT file that must | |||||
* be distributed with this source code. | |||||
*/ | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include <stdarg.h> | |||||
#include <stdlib.h> | |||||
#include <time.h> | |||||
#include <ctype.h> | |||||
#include "config.h" | |||||
#include "cstring.h" | |||||
#include "markdown.h" | |||||
#include "amalloc.h" | |||||
/* | |||||
* dump out stylesheet sections. | |||||
*/ | |||||
static void | |||||
stylesheets(Paragraph *p, Cstring *f) | |||||
{ | |||||
Line* q; | |||||
for ( ; p ; p = p->next ) { | |||||
if ( p->typ == STYLE ) { | |||||
for ( q = p->text; q ; q = q->next ) | |||||
Cswrite(f, T(q->text), S(q->text)); | |||||
Csputc('\n', f); | |||||
} | |||||
if ( p->down ) | |||||
stylesheets(p->down, f); | |||||
} | |||||
} | |||||
/* dump any embedded styles to a string | |||||
*/ | |||||
int | |||||
mkd_css(Document *d, char **res) | |||||
{ | |||||
Cstring f; | |||||
if ( res && *res && d && d->compiled ) { | |||||
CREATE(f); | |||||
RESERVE(f, 100); | |||||
stylesheets(d->code, &f); | |||||
/* HACK ALERT! HACK ALERT! HACK ALERT! */ | |||||
*res = T(f); /* we know that a T(Cstring) is a character pointer */ | |||||
/* so we can simply pick it up and carry it away, */ | |||||
return S(f); /* leaving the husk of the Ctring on the stack */ | |||||
/* END HACK ALERT */ | |||||
} | |||||
return EOF; | |||||
} | |||||
/* dump any embedded styles to a file | |||||
*/ | |||||
int | |||||
mkd_generatecss(Document *d, FILE *f) | |||||
{ | |||||
char *res; | |||||
int written = EOF, size = mkd_css(d, &res); | |||||
if ( size > 0 ) | |||||
written = fwrite(res, size, 1, f); | |||||
if ( res ) | |||||
free(res); | |||||
return (written == size) ? size : EOF; | |||||
} |
@ -0,0 +1,41 @@ | |||||
.\" | |||||
.Dd January 18, 2008 | |||||
.Dt MKD_LINE 3 | |||||
.Os Mastodon | |||||
.Sh NAME | |||||
.Nm mkd_line | |||||
.Nd do Markdown translation of small items | |||||
.Sh LIBRARY | |||||
Markdown | |||||
.Pq libmarkdown , -lmarkdown | |||||
.Sh SYNOPSIS | |||||
.Fd #include <mkdio.h> | |||||
.Ft int | |||||
.Fn mkd_line "char *string" "int size" "char **doc" "int flags" | |||||
.Ft int | |||||
.Fn mkd_generateline "char *string" "int size" "FILE *output" "int flags" | |||||
.Sh DESCRIPTION | |||||
.Pp | |||||
Occasionally one might want to do markdown translations on fragments of | |||||
data, like the title of an weblog article, a date, or a simple signature | |||||
line. | |||||
.Nm mkd_line | |||||
and | |||||
.Nm mkd_generateline | |||||
allow you to do markdown translations on small blocks of text. | |||||
.Nm mkd_line | |||||
allocates a buffer, then writes the translated text into that buffer, | |||||
and | |||||
.Nm mkd_generateline | |||||
writes the output to the specified | |||||
.Ar FILE* . | |||||
.Sh SEE ALSO | |||||
.Xr markdown 1 , | |||||
.Xr markdown 3 , | |||||
.Xr markdown 7 , | |||||
.Xr mkd-extensions 7 , | |||||
.Xr mmap 2 . | |||||
.Pp | |||||
http://daringfireball.net/projects/markdown/syntax | |||||
.Sh BUGS | |||||
Error handling is minimal at best. |
@ -0,0 +1,42 @@ | |||||
./echo 'Reddit-style automatic links' | |||||
rc=0 | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try -fautolink 'single link' \ | |||||
'http://www.pell.portland.or.us/~orc/Code/discount' \ | |||||
'<p><a href="http://www.pell.portland.or.us/~orc/Code/discount">http://www.pell.portland.or.us/~orc/Code/discount</a></p>' | |||||
try -fautolink 'link surrounded by text' \ | |||||
'here http://it is?' \ | |||||
'<p>here <a href="http://it">http://it</a> is?</p>' | |||||
try -fautolink 'naked @' '@' '<p>@</p>' | |||||
try -fautolink 'parenthesised (url)' \ | |||||
'(http://here)' \ | |||||
'<p>(<a href="http://here">http://here</a>)</p>' | |||||
try -fautolink 'token with trailing @' 'orc@' '<p>orc@</p>' | |||||
exit $rc |
@ -0,0 +1,53 @@ | |||||
./echo "automatic links" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
match() { | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
if ./echo "$2" | ./markdown | grep "$3" >/dev/null; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'http url' '<http://here>' '<p><a href="http://here">http://here</a></p>' | |||||
try 'ftp url' '<ftp://here>' '<p><a href="ftp://here">ftp://here</a></p>' | |||||
match '<orc@pell.portland.or.us>' '<orc@pell.portland.or.us>' '<a href=' | |||||
match '<orc@pell.com.>' '<orc@pell.com.>' '<a href=' | |||||
try 'invalid <orc@>' '<orc@>' '<p><orc@></p>' | |||||
try 'invalid <@pell>' '<@pell>' '<p><@pell></p>' | |||||
try 'invalid <orc@pell>' '<orc@pell>' '<p><orc@pell></p>' | |||||
try 'invalid <orc@.pell>' '<orc@.pell>' '<p><orc@.pell></p>' | |||||
try 'invalid <orc@pell.>' '<orc@pell.>' '<p><orc@pell.></p>' | |||||
match '<mailto:orc@pell>' '<mailto:orc@pell>' '<a href=' | |||||
match '<mailto:orc@pell.com>' '<mailto:orc@pell.com>' '<a href=' | |||||
match '<mailto:orc@>' '<mailto:orc@>' '<a href=' | |||||
match '<mailto:@pell>' '<mailto:@pell>' '<a href=' | |||||
exit $rc |
@ -0,0 +1,35 @@ | |||||
./echo "backslash escapes" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got: $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'backslashes in []()' '[foo](http://\this\is\.a\test\(here\))' \ | |||||
'<p><a href="http://\this\is.a\test(here)">foo</a></p>' | |||||
try -fautolink 'autolink url with trailing \' \ | |||||
'http://a.com/\' \ | |||||
'<p><a href="http://a.com/\">http://a.com/\</a></p>' | |||||
exit $rc |
@ -0,0 +1,39 @@ | |||||
./echo "code blocks" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'format for code block html' \ | |||||
' this is | |||||
code' \ | |||||
'<pre><code>this is | |||||
code | |||||
</code></pre>' | |||||
try 'unclosed single backtick' '`hi there' '<p>`hi there</p>' | |||||
try 'unclosed double backtick' '``hi there' '<p>``hi there</p>' | |||||
try 'remove space around code' '`` hi there ``' '<p><code>hi there</code></p>' | |||||
exit $rc |
@ -0,0 +1,47 @@ | |||||
./echo "markdown 1.0 compatability" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
LINKY='[this] is a test | |||||
[this]: /this' | |||||
try 'implicit reference links' "$LINKY" '<p><a href="/this">this</a> is a test</p>' | |||||
try -f1.0 'implicit reference links (-f1.0)' "$LINKY" '<p>[this] is a test</p>' | |||||
WSP=' ' | |||||
WHITESPACE=" | |||||
white space$WSP | |||||
and more" | |||||
try 'trailing whitespace' "$WHITESPACE" '<pre><code>white space '' | |||||
and more | |||||
</code></pre>' | |||||
try -f1.0 'trailing whitespace (-f1.0)' "$WHITESPACE" '<pre><code>white space'' | |||||
and more | |||||
</code></pre>' | |||||
exit $rc |
@ -0,0 +1,67 @@ | |||||
./markdown -V | grep DIV >/dev/null || exit 0 | |||||
./echo "%div% blocks" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'simple >%div% block' \ | |||||
'>%this% | |||||
this this' \ | |||||
'<div class="this"><p>this this</p></div>' | |||||
try 'two >%div% blocks in a row' \ | |||||
'>%this% | |||||
this this | |||||
>%that% | |||||
that that' \ | |||||
'<div class="this"><p>this this</p></div> | |||||
<div class="that"><p>that that</p></div>' | |||||
try '>%class:div%' \ | |||||
'>%class:this% | |||||
this this' \ | |||||
'<div class="this"><p>this this</p></div>' | |||||
try '>%id:div%' \ | |||||
'>%id:this% | |||||
this this' \ | |||||
'<div id="this"><p>this this</p></div>' | |||||
try 'nested >%div%' \ | |||||
'>%this% | |||||
>>%that% | |||||
>>that | |||||
>%more% | |||||
more' \ | |||||
'<div class="this"><div class="that"><p>that</p></div></div> | |||||
<div class="more"><p>more</p></div>' | |||||
exit $rc |
@ -0,0 +1,69 @@ | |||||
./echo "definition lists" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
SRC=' | |||||
=this= | |||||
is an ugly | |||||
=test= | |||||
eh?' | |||||
RSLT='<dl> | |||||
<dt>this</dt> | |||||
<dd>is an ugly</dd> | |||||
<dt>test</dt> | |||||
<dd>eh?</dd> | |||||
</dl>' | |||||
if ./markdown -V | grep DL_TAG >/dev/null; then | |||||
try '=tag= generates definition lists' "$SRC" "$RSLT" | |||||
try 'one item with two =tags=' \ | |||||
'=this= | |||||
=is= | |||||
A test, eh?' \ | |||||
'<dl> | |||||
<dt>this</dt> | |||||
<dt>is</dt> | |||||
<dd>A test, eh?</dd> | |||||
</dl>' | |||||
else | |||||
try '=tag= does nothing' "$SRC" \ | |||||
'<p>=this=</p> | |||||
<pre><code>is an ugly | |||||
</code></pre> | |||||
<p>=test=</p> | |||||
<pre><code>eh? | |||||
</code></pre>' | |||||
fi | |||||
exit $rc |
@ -0,0 +1,40 @@ | |||||
./echo "emphasis" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try '*hi* -> <em>hi</em>' '*hi*' '<p><em>hi</em></p>' | |||||
try '* -> *' 'A * A' '<p>A * A</p>' | |||||
try -fstrict '***A**B*' '***A**B*' '<p><em><strong>A</strong>B</em></p>' | |||||
try -fstrict '***A*B**' '***A*B**' '<p><strong><em>A</em>B</strong></p>' | |||||
try -fstrict '**A*B***' '**A*B***' '<p><strong>A<em>B</em></strong></p>' | |||||
try -fstrict '*A**B***' '*A**B***' '<p><em>A<strong>B</strong></em></p>' | |||||
if ./markdown -V | grep RELAXED >/dev/null; then | |||||
try -frelax '_A_B with -frelax' '_A_B' '<p>_A_B</p>' | |||||
try -fstrict '_A_B with -fstrict' '_A_B' '<p><em>A</em>B</p>' | |||||
fi | |||||
exit $rc |
@ -0,0 +1,52 @@ | |||||
./echo "paragraph flow" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'header followed by paragraph' \ | |||||
'###Hello, sailor### | |||||
And how are you today?' \ | |||||
'<h3>Hello, sailor</h3> | |||||
<p>And how are you today?</p>' | |||||
try 'two lists punctuated with a HR' \ | |||||
'* A | |||||
* * * | |||||
* B | |||||
* C' \ | |||||
'<ul> | |||||
<li>A</li> | |||||
</ul> | |||||
<hr /> | |||||
<ul> | |||||
<li>B</li> | |||||
<li>C</li> | |||||
</ul>' | |||||
exit $rc |
@ -0,0 +1,34 @@ | |||||
./echo "footnotes" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'a line with multiple []s' '[a][] [b][]:' '<p>[a][] [b][]:</p>' | |||||
try 'a valid footnote' \ | |||||
'[alink][] | |||||
[alink]: link_me' \ | |||||
'<p><a href="link_me">alink</a></p>' | |||||
exit $rc |
@ -0,0 +1,109 @@ | |||||
./echo "html blocks" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'self-closing block tags (hr)' \ | |||||
'<hr> | |||||
text' \ | |||||
'<hr> | |||||
<p>text</p>' | |||||
try 'self-closing block tags (hr/)' \ | |||||
'<hr/> | |||||
text' \ | |||||
'<hr/> | |||||
<p>text</p>' | |||||
try 'self-closing block tags (br)' \ | |||||
'<br> | |||||
text' \ | |||||
'<br> | |||||
<p>text</p>' | |||||
try 'html comments' \ | |||||
'<!-- | |||||
**hi** | |||||
-->' \ | |||||
'<!-- | |||||
**hi** | |||||
-->' | |||||
try 'no smartypants inside tags (#1)' \ | |||||
'<img src="linky">' \ | |||||
'<p><img src="linky"></p>' | |||||
try 'no smartypants inside tags (#2)' \ | |||||
'<img src="linky" alt=":)" />' \ | |||||
'<p><img src="linky" alt=":)" /></p>' | |||||
try -fnohtml 'block html with -fnohtml' '<b>hi!</b>' '<p><b>hi!</b></p>' | |||||
try -fhtml 'allow html with -fhtml' '<b>hi!</b>' '<p><b>hi!</b></p>' | |||||
# check that nested raw html blocks terminate properly. | |||||
# | |||||
BLOCK1SRC='Markdown works fine *here*. | |||||
*And* here. | |||||
<div><pre> | |||||
</pre></div> | |||||
Markdown here is *not* parsed by RDiscount. | |||||
Nor in *this* paragraph, and there are no paragraph breaks.' | |||||
BLOCK1OUT='<p>Markdown works fine <em>here</em>.</p> | |||||
<p><em>And</em> here.</p> | |||||
<div><pre> | |||||
</pre></div> | |||||
<p>Markdown here is <em>not</em> parsed by RDiscount.</p> | |||||
<p>Nor in <em>this</em> paragraph, and there are no paragraph breaks.</p>' | |||||
try 'nested html blocks (1)' "$BLOCK1SRC" "$BLOCK1OUT" | |||||
try 'nested html blocks (2)' \ | |||||
'<div>This is inside a html block | |||||
<div>This is, too</div>and | |||||
so is this</div>' \ | |||||
'<div>This is inside a html block | |||||
<div>This is, too</div>and | |||||
so is this</div>' | |||||
exit $rc |
@ -0,0 +1,124 @@ | |||||
./echo "embedded links" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'url contains &' '[hehehe](u&rl)' '<p><a href="u&rl">hehehe</a></p>' | |||||
try 'url contains +' '[hehehe](u+rl)' '<p><a href="u+rl">hehehe</a></p>' | |||||
try 'url contains "' '[hehehe](u"rl)' '<p><a href="u%22rl">hehehe</a></p>' | |||||
try 'url contains <' '[hehehe](u<rl)' '<p><a href="u<rl">hehehe</a></p>' | |||||
try 'url contains whitespace' '[ha](r u)' '<p><a href="r%20u">ha</a></p>' | |||||
try 'url contains whitespace & title' \ | |||||
'[hehehe](r u "there")' \ | |||||
'<p><a href="r%20u" title="there">hehehe</a></p>' | |||||
try 'url contains escaped )' \ | |||||
'[hehehe](u\))' \ | |||||
'<p><a href="u)">hehehe</a></p>' | |||||
try 'image label contains <' \ | |||||
'![he<he<he](url)' \ | |||||
'<p><img src="url" alt="he<he<he" /></p>' | |||||
try 'image label contains >' \ | |||||
'![he>he>he](url)' \ | |||||
'<p><img src="url" alt="he>he>he" /></p>' | |||||
try 'sloppy context link' \ | |||||
'[heh]( url "how about it?" )' \ | |||||
'<p><a href="url" title="how about it?">heh</a></p>' | |||||
try 'footnote urls formed properly' \ | |||||
'[hehehe]: hohoho "ha ha" | |||||
[hehehe][]' \ | |||||
'<p><a href="hohoho" title="ha ha">hehehe</a></p>' | |||||
try 'linky-like []s work' \ | |||||
'[foo]' \ | |||||
'<p>[foo]</p>' | |||||
try 'pseudo-protocol "id:"'\ | |||||
'[foo](id:bar)' \ | |||||
'<p><a id="bar">foo</a></p>' | |||||
try 'pseudo-protocol "class:"' \ | |||||
'[foo](class:bar)' \ | |||||
'<p><span class="bar">foo</span></p>' | |||||
try 'pseudo-protocol "abbr:"'\ | |||||
'[foo](abbr:bar)' \ | |||||
'<p><abbr title="bar">foo</abbr></p>' | |||||
try 'nested [][]s' \ | |||||
'[[z](y)](x)' \ | |||||
'<p><a href="x">[z](y)</a></p>' | |||||
try 'empty [][] tags' \ | |||||
'[![][1]][2] | |||||
[1]: image1 | |||||
[2]: image2' \ | |||||
'<p><a href="image2"><img src="image1" alt="" /></a></p>' | |||||
try 'footnote cuddled up to text' \ | |||||
'foo | |||||
[bar]:bar' \ | |||||
'<p>foo</p>' | |||||
try 'mid-paragraph footnote' \ | |||||
'talk talk talk talk | |||||
[bar]: bar | |||||
talk talk talk talk' \ | |||||
'<p>talk talk talk talk | |||||
talk talk talk talk</p>' | |||||
try 'mid-blockquote footnote' \ | |||||
'>blockquote! | |||||
[footnote]: here! | |||||
>blockquote!' \ | |||||
'<blockquote><p>blockquote! | |||||
blockquote!</p></blockquote>' | |||||
try 'end-blockquote footnote' \ | |||||
'>blockquote! | |||||
>blockquote! | |||||
[footnote]: here!' \ | |||||
'<blockquote><p>blockquote! | |||||
blockquote!</p></blockquote>' | |||||
try 'start-blockquote footnote' \ | |||||
'[footnote]: here! | |||||
>blockquote! | |||||
>blockquote!' \ | |||||
'<blockquote><p>blockquote! | |||||
blockquote!</p></blockquote>' | |||||
try '[text] (text) not a link' \ | |||||
'[test] (me)' \ | |||||
'<p>[test] (me)</p>' | |||||
exit $rc |
@ -0,0 +1,31 @@ | |||||
./echo "embedded images" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'image with size extension' \ | |||||
'![picture](pic =200x200)' \ | |||||
'<p><img src="pic" height="200" width="200" alt="picture" /></p>' | |||||
exit $rc |
@ -0,0 +1,168 @@ | |||||
./echo "lists" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'two separated items' \ | |||||
' * A | |||||
* B' \ | |||||
'<ul> | |||||
<li><p>A</p></li> | |||||
<li><p>B</p></li> | |||||
</ul>' | |||||
try 'two adjacent items' \ | |||||
' * A | |||||
* B' \ | |||||
'<ul> | |||||
<li>A</li> | |||||
<li>B</li> | |||||
</ul>' | |||||
try 'two adjacent items, then space' \ | |||||
' * A | |||||
* B | |||||
space, the final frontier' \ | |||||
'<ul> | |||||
<li>A</li> | |||||
<li>B</li> | |||||
</ul> | |||||
<p>space, the final frontier</p>' | |||||
try 'nested lists (1)' \ | |||||
' * 1. Sub (list) | |||||
2. Two (items) | |||||
3. Here' \ | |||||
'<ul> | |||||
<li><ol> | |||||
<li>Sub (list)</li> | |||||
<li>Two (items)</li> | |||||
<li>Here</li> | |||||
</ol> | |||||
</li> | |||||
</ul>' | |||||
try 'nested lists (2)' \ | |||||
' * A (list) | |||||
1. Sub (list) | |||||
2. Two (items) | |||||
3. Here | |||||
Here | |||||
* B (list)' \ | |||||
'<ul> | |||||
<li><p>A (list)</p> | |||||
<ol> | |||||
<li>Sub (list)</li> | |||||
<li>Two (items)</li> | |||||
<li>Here</li> | |||||
</ol> | |||||
<p> Here</p></li> | |||||
<li>B (list)</li> | |||||
</ul>' | |||||
try 'list inside blockquote' \ | |||||
'>A (list) | |||||
> | |||||
>1. Sub (list) | |||||
>2. Two (items) | |||||
>3. Here' \ | |||||
'<blockquote><p>A (list)</p> | |||||
<ol> | |||||
<li>Sub (list)</li> | |||||
<li>Two (items)</li> | |||||
<li>Here</li> | |||||
</ol> | |||||
</blockquote>' | |||||
try 'blockquote inside list' \ | |||||
' * A (list) | |||||
> quote | |||||
> me | |||||
dont quote me' \ | |||||
'<ul> | |||||
<li><p>A (list)</p> | |||||
<blockquote><p>quote | |||||
me</p></blockquote> | |||||
<p>dont quote me</p></li> | |||||
</ul>' | |||||
try 'empty list' \ | |||||
' | |||||
- | |||||
- | |||||
' \ | |||||
'<ul> | |||||
<li></li> | |||||
<li></li> | |||||
</ul>' | |||||
if ./markdown -V | grep DL_TAG >/dev/null; then | |||||
try 'dl followed by non-dl' \ | |||||
'=a= | |||||
test | |||||
2. here' \ | |||||
'<dl> | |||||
<dt>a</dt> | |||||
<dd>test</dd> | |||||
</dl> | |||||
<ol> | |||||
<li>here</li> | |||||
</ol>' | |||||
try 'non-dl followed by dl' \ | |||||
'1. hello | |||||
=sailor= | |||||
hi!' \ | |||||
'<ol> | |||||
<li>hello</li> | |||||
</ol> | |||||
<dl> | |||||
<dt>sailor</dt> | |||||
<dd>hi!</dd> | |||||
</dl>' | |||||
fi | |||||
exit $rc |
@ -0,0 +1,57 @@ | |||||
./echo "deeply nested lists" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
LIST=' | |||||
* top-level list ( list 1) | |||||
+ second-level list (list 2) | |||||
* first item third-level list (list 3) | |||||
+ * second item, third-level list, first item. (list 4) | |||||
* second item, third-level list, second item. | |||||
* top-level list again.' | |||||
RSLT='<ul> | |||||
<li>top-level list ( list 1) | |||||
<ul> | |||||
<li>second-level list (list 2) | |||||
<ul> | |||||
<li>first item third-level list (list 3)</li> | |||||
</ul> | |||||
</li> | |||||
<li><ul> | |||||
<li>second item, third-level list, first item. (list 4)</li> | |||||
<li>second item, third-level list, second item.</li> | |||||
</ul> | |||||
</li> | |||||
</ul> | |||||
</li> | |||||
<li>top-level list again.</li> | |||||
</ul>' | |||||
try 'thrice-nested lists' "$LIST" "$RSLT" | |||||
exit $rc |
@ -0,0 +1,33 @@ | |||||
./echo "misc" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'single paragraph' 'AAA' '<p>AAA</p>' | |||||
try '< -> <' '<' '<p><</p>' | |||||
try '`>` -> <code>></code>' '`>`' '<p><code>></code></p>' | |||||
try '`` ` `` -> <code>`</code>' '`` ` ``' '<p><code>`</code></p>' | |||||
exit $rc |
@ -0,0 +1,74 @@ | |||||
./echo "pandoc headers" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
HEADER='% title | |||||
% author(s) | |||||
% date' | |||||
if ./markdown -V | grep HEADER > /dev/null; then | |||||
try 'valid header' "$HEADER" '' | |||||
try -F0x0100 'valid header with -F0x0100' "$HEADER" '<p>% title | |||||
% author(s) | |||||
% date</p>' | |||||
try 'invalid header' \ | |||||
'% title | |||||
% author(s) | |||||
a pony!' \ | |||||
'<p>% title | |||||
% author(s) | |||||
a pony!</p>' | |||||
try 'offset header' \ | |||||
' | |||||
% title | |||||
% author(s) | |||||
% date' \ | |||||
'<p>% title | |||||
% author(s) | |||||
% date</p>' | |||||
try 'indented header' \ | |||||
' % title | |||||
% author(s) | |||||
% date' \ | |||||
'<p> % title | |||||
% author(s) | |||||
% date</p>' | |||||
else | |||||
try 'ignore headers' "$HEADER" '<p>% title | |||||
% author(s) | |||||
% date</p>' | |||||
fi | |||||
exit $rc |
@ -0,0 +1,38 @@ | |||||
./echo "paragraph blocking" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'paragraph followed by code' \ | |||||
'a | |||||
b' \ | |||||
'<p>a</p> | |||||
<pre><code>b | |||||
</code></pre>' | |||||
try 'single-line paragraph' 'a' '<p>a</p>' | |||||
exit $rc |
@ -0,0 +1,31 @@ | |||||
./echo "paranoia" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try -fsafelink 'bogus url (-fsafelink)' '[test](bad:protocol)' '<p>[test](bad:protocol)</p>' | |||||
try -fnosafelink 'bogus url (-fnosafelink)' '[test](bad:protocol)' '<p><a href="bad:protocol">test</a></p>' | |||||
exit $rc |
@ -0,0 +1,64 @@ | |||||
./echo "markup peculiarities" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'list followed by header .......... ' \ | |||||
" | |||||
- AAA | |||||
- BBB | |||||
-" \ | |||||
'<ul> | |||||
<li>AAA | |||||
<h2>– BBB</h2></li> | |||||
</ul>' | |||||
try 'ul with mixed item prefixes' \ | |||||
' | |||||
- A | |||||
1. B' \ | |||||
'<ul> | |||||
<li>A</li> | |||||
<li>B</li> | |||||
</ul>' | |||||
try 'ol with mixed item prefixes' \ | |||||
' | |||||
1. A | |||||
- B | |||||
' \ | |||||
'<ol> | |||||
<li>A</li> | |||||
<li>B</li> | |||||
</ol>' | |||||
try 'forcing a <br/>' 'this ' '<p>this<br/> | |||||
</p>' | |||||
try 'trimming single spaces' 'this ' '<p>this</p>' | |||||
try -fnohtml 'markdown <br/> with -fnohtml' 'foo ' '<p>foo<br/> | |||||
</p>' | |||||
exit $rc |
@ -0,0 +1,35 @@ | |||||
./echo "pseudo-protocols" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try '[](id:) links' '[foo](id:bar)' '<p><a id="bar">foo</a></p>' | |||||
try -fnoext '[](id:) links with -fnoext' '[foo](id:bar)' '<p>[foo](id:bar)</p>' | |||||
try '[](class:) links' '[foo](class:bar)' '<p><span class="bar">foo</span></p>' | |||||
try -fnoext '[](class:) links with -fnoext' '[foo](class:bar)' '<p>[foo](class:bar)</p>' | |||||
try '[](raw:) links' '[foo](raw:bar)' '<p>bar</p>' | |||||
try -fnoext '[](raw:) links with -fnoext' '[foo](raw:bar)' '<p>[foo](raw:bar)</p>' | |||||
exit $rc |
@ -0,0 +1,34 @@ | |||||
./echo "footnotes inside reparse sections" | |||||
rc=0 | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'footnote inside [] section' \ | |||||
'[![foo][]](bar) | |||||
[foo]: bar2' \ | |||||
'<p><a href="bar"><img src="bar2" alt="foo" /></a></p>' | |||||
exit $rc |
@ -0,0 +1,97 @@ | |||||
./echo "Bugs & misfeatures reported by Mike Schiraldi" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
S=`./echo -n "$1" '..................................' | ./cols 34` | |||||
./echo -n " $S " | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo "ok" | |||||
else | |||||
./echo "FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try -fnohtml 'breaks with -fnohtml' 'foo ' '<p>foo<br/> | |||||
</p>' | |||||
try 'links with trailing \)' \ | |||||
'[foo](http://en.wikipedia.org/wiki/Link_(film\))' \ | |||||
'<p><a href="http://en.wikipedia.org/wiki/Link_(film)">foo</a></p>' | |||||
try -fautolink '(url) with -fautolink' \ | |||||
'(http://tsfr.org)' \ | |||||
'<p>(<a href="http://tsfr.org">http://tsfr.org</a>)</p>' | |||||
try 'single #' \ | |||||
'#' \ | |||||
'<p>#</p>' | |||||
try -frelax '* processing with -frelax' \ | |||||
'2*4 = 8 * 1 = 2**3' \ | |||||
'<p>2*4 = 8 * 1 = 2**3</p>' | |||||
try -fnopants '[]() with a single quote mark' \ | |||||
'[Poe'"'"'s law](http://rationalwiki.com/wiki/Poe'"'"'s_Law)' \ | |||||
'<p><a href="http://rationalwiki.com/wiki/Poe'"'"'s_Law">Poe'"'"'s law</a></p>' | |||||
try -fautolink 'autolink url with escaped spaces' \ | |||||
'http://\(here\ I\ am\)' \ | |||||
'<p><a href="http://(here%20I%20am)">http://(here I am)</a></p>' | |||||
try -fautolink 'autolink café_racer' \ | |||||
'http://en.wikipedia.org/wiki/café_racer' \ | |||||
'<p><a href="http://en.wikipedia.org/wiki/caf%C3%A9_racer">http://en.wikipedia.org/wiki/caf%C3%A9_racer</a></p>' | |||||
try -fautolink 'autolink url with arguments' \ | |||||
'http://foo.bar?a&b=c' \ | |||||
'<p><a href="http://foo.bar?a&b=c">http://foo.bar?a&b=c</a></p>' | |||||
try '\( escapes in []()' \ | |||||
'[foo](http://a.com/\(foo\))' \ | |||||
'<p><a href="http://a.com/(foo)">foo</a></p>' | |||||
try -fautolink 'autolink url with escaped ()' \ | |||||
'http://a.com/\(foo\)' \ | |||||
'<p><a href="http://a.com/(foo)">http://a.com/(foo)</a></p>' | |||||
try -fautolink 'autolink url with escaped \' \ | |||||
'http://a.com/\\\)' \ | |||||
'<p><a href="http://a.com/\)">http://a.com/\)</a></p>' | |||||
try -fautolink 'autolink url with -' \ | |||||
'http://experts-exchange.com' \ | |||||
'<p><a href="http://experts-exchange.com">http://experts-exchange.com</a></p>' | |||||
try -fautolink 'autolink url with +' \ | |||||
'http://www67.wolframalpha.com/input/?i=how+old+was+jfk+jr+when+jfk+died' \ | |||||
'<p><a href="http://www67.wolframalpha.com/input/?i=how+old+was+jfk+jr+when+jfk+died">http://www67.wolframalpha.com/input/?i=how+old+was+jfk+jr+when+jfk+died</a></p>' | |||||
try -fautolink 'autolink url with &' \ | |||||
'http://foo.bar?a&b=c' \ | |||||
'<p><a href="http://foo.bar?a&b=c">http://foo.bar?a&b=c</a></p>' | |||||
try -fautolink 'autolink url with ,' \ | |||||
'http://www.spiegel.de/international/europe/0,1518,626171,00.html' \ | |||||
'<p><a href="http://www.spiegel.de/international/europe/0,1518,626171,00.html">http://www.spiegel.de/international/europe/0,1518,626171,00.html</a></p>' | |||||
try -fautolink 'autolink url with : & ;' \ | |||||
'http://www.biblegateway.com/passage/?search=Matthew%205:29-30;&version=31;' \ | |||||
'<p><a href="http://www.biblegateway.com/passage/?search=Matthew%205:29-30;&version=31;">http://www.biblegateway.com/passage/?search=Matthew%205:29-30;&version=31;</a></p>' | |||||
exit $rc |
@ -0,0 +1,50 @@ | |||||
./echo "smarty pants" | |||||
rc=0 | |||||
MARKDOWN_FLAGS=0x0; export MARKDOWN_FLAGS | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS="$1" | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try '(c) -> ©' '(c)' '<p>©</p>' | |||||
try '(r) -> ®' '(r)' '<p>®</p>' | |||||
try '(tm) -> ™' '(tm)' '<p>™</p>' | |||||
try '... -> …' '...' '<p>…</p>' | |||||
try '"--" -> —' '--' '<p>—</p>' | |||||
try '"-" -> –' 'regular -' '<p>regular –</p>' | |||||
try 'A-B -> A-B' 'A-B' '<p>A-B</p>' | |||||
try '"fancy" -> “fancy”' '"fancy"' '<p>“fancy”</p>' | |||||
try "'fancy'" "'fancy'" '<p>‘fancy’</p>' | |||||
try "don<b>'t -> don<b>’t" "don<b>'t" '<p>don<b>’t</p>' | |||||
try "don't -> don’t" "don't" '<p>don’t</p>' | |||||
try "it's -> it’s" "it's" '<p>it’s</p>' | |||||
if ./markdown -V | grep SUPERSCRIPT >/dev/null; then | |||||
try -frelax 'A^B -> A<sup>B</sup> (-frelax)' 'A^B' '<p>A<sup>B</sup></p>' | |||||
try -fstrict 'A^B != A<sup>B</sup> (-fstrict)' 'A^B' '<p>A^B</p>' | |||||
try -frelax 'A^B in link title' '[link](here "A^B")' '<p><a href="here" title="A^B">link</a></p>' | |||||
fi | |||||
exit $rc |
@ -0,0 +1,34 @@ | |||||
./echo "The snakepit of Markdown.pl compatability" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try '[](single quote) text (quote)' \ | |||||
"[foo](http://Poe's law) will make this fail ('no, it won't!') here."\ | |||||
'<p><a href="http://Poe" title="s law) will make this fail ('"'no, it won't!"'">foo</a> here.</p>' | |||||
try '[](unclosed <url)' '[foo](<http://no trailing gt)' \ | |||||
'<p><a href="http://no%20trailing%20gt">foo</a></p>' | |||||
exit $rc |
@ -0,0 +1,164 @@ | |||||
./echo "tables" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try 'single-column table' \ | |||||
'|hello | |||||
|----- | |||||
|sailor' \ | |||||
'<table> | |||||
<thead> | |||||
<tr> | |||||
<th></th> | |||||
<th>hello</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td></td> | |||||
<td>sailor</td> | |||||
</tr> | |||||
</tbody> | |||||
</table>' | |||||
try 'two-column table' \ | |||||
' | |||||
a | b | |||||
-----|------ | |||||
hello|sailor' \ | |||||
'<table> | |||||
<thead> | |||||
<tr> | |||||
<th> a </th> | |||||
<th> b</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td>hello</td> | |||||
<td>sailor</td> | |||||
</tr> | |||||
</tbody> | |||||
</table>' | |||||
try 'three-column table' \ | |||||
'a|b|c | |||||
-|-|- | |||||
hello||sailor'\ | |||||
'<table> | |||||
<thead> | |||||
<tr> | |||||
<th>a</th> | |||||
<th>b</th> | |||||
<th>c</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td>hello</td> | |||||
<td></td> | |||||
<td>sailor</td> | |||||
</tr> | |||||
</tbody> | |||||
</table>' | |||||
try 'two-column table with empty cells' \ | |||||
' | |||||
a | b | |||||
-----|------ | |||||
hello| | |||||
|sailor' \ | |||||
'<table> | |||||
<thead> | |||||
<tr> | |||||
<th> a </th> | |||||
<th> b</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td>hello</td> | |||||
<td></td> | |||||
</tr> | |||||
<tr> | |||||
<td> </td> | |||||
<td>sailor</td> | |||||
</tr> | |||||
</tbody> | |||||
</table>' | |||||
try 'two-column table with alignment' \ | |||||
' | |||||
a | b | |||||
----:|:----- | |||||
hello|sailor' \ | |||||
'<table> | |||||
<thead> | |||||
<tr> | |||||
<th align="right"> a </th> | |||||
<th align="left"> b</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td align="right">hello</td> | |||||
<td align="left">sailor</td> | |||||
</tr> | |||||
</tbody> | |||||
</table>' | |||||
try 'table with extra data column' \ | |||||
' | |||||
a | b | |||||
-----|------ | |||||
hello|sailor|boy' \ | |||||
'<table> | |||||
<thead> | |||||
<tr> | |||||
<th> a </th> | |||||
<th> b</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td>hello</td> | |||||
<td>sailor|boy</td> | |||||
</tr> | |||||
</tbody> | |||||
</table>' | |||||
try -fnotables 'tables with -fnotables' \ | |||||
'a|b | |||||
-|- | |||||
hello|sailor' \ | |||||
'<p>a|b | |||||
–|– | |||||
hello|sailor</p>' | |||||
exit $rc |
@ -0,0 +1,66 @@ | |||||
rc=0 | |||||
unset MARKDOWN_FLAGS | |||||
unset MKD_TABSTOP | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
eval `./markdown -V | tr ' ' '\n' | grep TAB` | |||||
if [ "${TAB:-4}" -eq 8 ]; then | |||||
./echo "dealing with tabstop derangement" | |||||
LIST=' | |||||
* A | |||||
* B | |||||
* C' | |||||
try 'markdown with TAB=8' \ | |||||
"$LIST" \ | |||||
'<ul> | |||||
<li>A | |||||
<ul> | |||||
<li>B | |||||
<ul> | |||||
<li>C</li> | |||||
</ul> | |||||
</li> | |||||
</ul> | |||||
</li> | |||||
</ul>' | |||||
try -F0x0200 'markdown with TAB=4' \ | |||||
"$LIST" \ | |||||
'<ul> | |||||
<li>A | |||||
<ul> | |||||
<li>B</li> | |||||
<li>C</li> | |||||
</ul> | |||||
</li> | |||||
</ul>' | |||||
fi | |||||
exit $rc |
@ -0,0 +1,41 @@ | |||||
./echo "table-of-contents support" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
Q=`./echo "$2" | ./markdown $FLAGS` | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try '-T -ftoc' 'table of contents' \ | |||||
'#H1 | |||||
hi' \ | |||||
' | |||||
<ul> | |||||
<li><a href="#H1">H1</a> </li> | |||||
</ul> | |||||
<h1 id="H1">H1</h1> | |||||
<p>hi</p>' | |||||
exit $rc |
@ -0,0 +1,39 @@ | |||||
./echo "xml output with MKD_CDATA" | |||||
rc=0 | |||||
MARKDOWN_FLAGS= | |||||
try() { | |||||
unset FLAGS | |||||
case "$1" in | |||||
-*) FLAGS=$1 | |||||
shift ;; | |||||
esac | |||||
./echo -n " $1" '..................................' | ./cols 36 | |||||
case "$2" in | |||||
-t*) Q=`./markdown $FLAGS "$2"` ;; | |||||
*) Q=`./echo "$2" | ./markdown $FLAGS` ;; | |||||
esac | |||||
if [ "$3" = "$Q" ]; then | |||||
./echo " ok" | |||||
else | |||||
./echo " FAILED" | |||||
./echo "wanted: $3" | |||||
./echo "got : $Q" | |||||
rc=1 | |||||
fi | |||||
} | |||||
try -fcdata 'xml output from markdown()' 'hello,sailor' '<p>hello,sailor</p>' | |||||
try -fcdata 'from mkd_generateline()' -t'"hello,sailor"' '&ldquo;hello,sailor&rdquo;' | |||||
try -fnocdata 'html output from markdown()' '"hello,sailor"' '<p>“hello,sailor”</p>' | |||||
try -fnocdata '... from mkd_generateline()' -t'"hello,sailor"' '“hello,sailor”' | |||||
try -fcdata 'xml output with multibyte utf-8' \ | |||||
'tecnología y servicios más confiables' \ | |||||
'<p>tecnología y servicios más confiables</p>' | |||||
exit $rc |
@ -0,0 +1,38 @@ | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
main(argc, argv) | |||||
char **argv; | |||||
{ | |||||
register c; | |||||
int xp; | |||||
int width; | |||||
if ( argc != 2 ) { | |||||
fprintf(stderr, "usage: %s width\n", argv[0]); | |||||
exit(1); | |||||
} | |||||
else if ( (width=atoi(argv[1])) < 1 ) { | |||||
fprintf(stderr, "%s: please set width to > 0\n", argv[0]); | |||||
exit(1); | |||||
} | |||||
for ( xp = 1; (c = getchar()) != EOF; xp++ ) { | |||||
while ( c & 0xC0 ) { | |||||
/* assume that (1) the output device understands utf-8, and | |||||
* (2) the only c & 0x80 input is utf-8. | |||||
*/ | |||||
do { | |||||
if ( xp <= width ) | |||||
putchar(c); | |||||
} while ( (c = getchar()) != EOF && (c & 0x80) && !(c & 0x40) ); | |||||
++xp; | |||||
} | |||||
if ( c == '\n' ) | |||||
xp = 0; | |||||
if ( xp <= width ) | |||||
putchar(c); | |||||
} | |||||
exit(0); | |||||
} |