forked from aaronbloomfield/slp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
markdown.cpp.html
134 lines (129 loc) · 17.9 KB
/
markdown.cpp.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="GNU source-highlight 3.1.6
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite">
<title>markdown.cpp</title>
</head>
<body bgcolor="white">
<pre><tt><i><font color="#9A1900">/* A more modern markdown converter.</font></i>
<i><font color="#9A1900"> *</font></i>
<i><font color="#9A1900"> * Copyright (c) 2014 by Aaron Bloomfield</font></i>
<i><font color="#9A1900"> *</font></i>
<i><font color="#9A1900"> * This is part of the </font></i><u><font color="#0000FF">https://github.com/aaronbloomfield/pdr</font></u>
<i><font color="#9A1900"> * repository, and is released under the CC BY-SA license (along with</font></i>
<i><font color="#9A1900"> * the rest of that repository).</font></i>
<i><font color="#9A1900"> *</font></i>
<i><font color="#9A1900"> * The default markdown that is installed with Ubuntu (version 1.0.1</font></i>
<i><font color="#9A1900"> * from 2004) does not support more modern tags, such as tables. This</font></i>
<i><font color="#9A1900"> * program will use the libmarkdown library, which does have support</font></i>
<i><font color="#9A1900"> * for those tags, to perform a markdown conversion. The full list of</font></i>
<i><font color="#9A1900"> * additional features it supports can be found at</font></i>
<i><font color="#9A1900"> * </font></i><u><font color="#0000FF">http://manpages.ubuntu.com/manpages/raring/man7/mkd-extensions.7.html.</font></u>
<i><font color="#9A1900"> * It requires the libmarkdown2-dev pacakage be installed under</font></i>
<i><font color="#9A1900"> * Ubuntu.</font></i>
<i><font color="#9A1900"> *</font></i>
<i><font color="#9A1900"> * The resulting document is a full HTML document -- meaning it adds</font></i>
<i><font color="#9A1900"> * the <doctype>, <html>, <head>, and <body> tags to the document.</font></i>
<i><font color="#9A1900"> *</font></i>
<i><font color="#9A1900"> * To compile: "gcc markdown.c -o markdown -lmarkdown"</font></i>
<i><font color="#9A1900"> *</font></i>
<i><font color="#9A1900"> * To use, specify the input file name, and optionally an output file</font></i>
<i><font color="#9A1900"> * name.</font></i>
<i><font color="#9A1900"> */</font></i>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><iostream></font>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><fstream></font>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><string></font>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><stdio.h></font>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><stdlib.h></font>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><string.h></font>
<b><font color="#0000FF">extern</font></b> <font color="#FF0000">"C"</font> <font color="#FF0000">{</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000"><mkdio.h></font>
<font color="#FF0000">}</font>
<b><font color="#0000FF">using</font></b> <b><font color="#0000FF">namespace</font></b> std<font color="#990000">;</font>
<font color="#009900">int</font> <b><font color="#000000">main</font></b> <font color="#990000">(</font><font color="#009900">int</font> argc<font color="#990000">,</font> <font color="#009900">char</font> <font color="#990000">**</font>argv<font color="#990000">)</font> <font color="#FF0000">{</font>
<font color="#009900">int</font> i<font color="#990000">,</font> inidx<font color="#990000">,</font> outidx<font color="#990000">;</font>
<font color="#008080">FILE</font> <font color="#990000">*</font>fpin<font color="#990000">,</font> <font color="#990000">*</font>fpout<font color="#990000">;</font>
<font color="#009900">char</font> <font color="#990000">*</font>css <font color="#990000">=</font> NULL<font color="#990000">;</font>
<i><font color="#9A1900">// check command line parameters</font></i>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">!</font><b><font color="#000000">strcmp</font></b><font color="#990000">(</font>argv<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">],</font><font color="#FF0000">"-css"</font><font color="#990000">)</font> <font color="#990000">)</font> <font color="#FF0000">{</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">(</font>argc <font color="#990000">!=</font> <font color="#993399">4</font><font color="#990000">)</font> <font color="#990000">&&</font> <font color="#990000">(</font>argc <font color="#990000">!=</font> <font color="#993399">5</font><font color="#990000">)</font> <font color="#990000">)</font> <font color="#FF0000">{</font>
cout <font color="#990000"><<</font> <font color="#FF0000">"Usage: "</font> <font color="#990000"><<</font> argv<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">]</font> <font color="#990000"><<</font> <font color="#FF0000">" [-css <css_file>] <input_file> <output_file>"</font> <font color="#990000"><<</font> endl<font color="#990000">;</font>
<b><font color="#000000">exit</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">);</font>
<font color="#FF0000">}</font>
css <font color="#990000">=</font> argv<font color="#990000">[</font><font color="#993399">2</font><font color="#990000">];</font>
<font color="#FF0000">}</font> <b><font color="#0000FF">else</font></b> <font color="#FF0000">{</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">(</font>argc <font color="#990000">!=</font> <font color="#993399">2</font><font color="#990000">)</font> <font color="#990000">&&</font> <font color="#990000">(</font>argc <font color="#990000">!=</font> <font color="#993399">3</font><font color="#990000">)</font> <font color="#990000">)</font> <font color="#FF0000">{</font>
cout <font color="#990000"><<</font> <font color="#FF0000">"Usage: "</font> <font color="#990000"><<</font> argv<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">]</font> <font color="#990000"><<</font> <font color="#FF0000">" [-css <css_file>] <input_file> <output_file>"</font> <font color="#990000"><<</font> endl<font color="#990000">;</font>
<b><font color="#000000">exit</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">);</font>
<font color="#FF0000">}</font>
<font color="#FF0000">}</font>
<i><font color="#9A1900">// if the -css flag is there, then the input and output file names will be in a different place</font></i>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> css <font color="#990000">)</font> <font color="#FF0000">{</font>
inidx <font color="#990000">=</font> <font color="#993399">3</font><font color="#990000">;</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> argc <font color="#990000">==</font> <font color="#993399">4</font> <font color="#990000">)</font>
outidx <font color="#990000">=</font> <font color="#990000">-</font><font color="#993399">1</font><font color="#990000">;</font>
<b><font color="#0000FF">else</font></b>
outidx <font color="#990000">=</font> <font color="#993399">4</font><font color="#990000">;</font>
<font color="#FF0000">}</font> <b><font color="#0000FF">else</font></b> <font color="#FF0000">{</font>
inidx <font color="#990000">=</font> <font color="#993399">1</font><font color="#990000">;</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> argc <font color="#990000">==</font> <font color="#993399">2</font> <font color="#990000">)</font>
outidx <font color="#990000">=</font> <font color="#990000">-</font><font color="#993399">1</font><font color="#990000">;</font>
<b><font color="#0000FF">else</font></b>
outidx <font color="#990000">=</font> <font color="#993399">2</font><font color="#990000">;</font>
<font color="#FF0000">}</font>
<i><font color="#9A1900">// try to open the file</font></i>
<font color="#008080">ifstream</font> <b><font color="#000000">fin</font></b><font color="#990000">(</font>argv<font color="#990000">[</font>inidx<font color="#990000">]);</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">!</font>fin<font color="#990000">.</font><b><font color="#000000">is_open</font></b><font color="#990000">()</font> <font color="#990000">)</font> <font color="#FF0000">{</font>
cout <font color="#990000"><<</font> <font color="#FF0000">"Error: unable to open input file: "</font> <font color="#990000"><<</font> argv<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">]</font> <font color="#990000"><<</font> endl<font color="#990000">;</font>
<b><font color="#000000">exit</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">);</font>
<font color="#FF0000">}</font>
<i><font color="#9A1900">// read in the file into an internal string</font></i>
<font color="#009900">bool</font> codemode <font color="#990000">=</font> <b><font color="#0000FF">false</font></b><font color="#990000">;</font>
<font color="#008080">string</font> codeprefix <font color="#990000">=</font> <font color="#FF0000">" "</font><font color="#990000">;</font>
<font color="#008080">string</font> file<font color="#990000">,</font> line<font color="#990000">,</font> firstline<font color="#990000">;</font>
<font color="#009900">bool</font> gotfirstline <font color="#990000">=</font> <b><font color="#0000FF">false</font></b><font color="#990000">;</font>
<b><font color="#0000FF">while</font></b> <font color="#990000">(</font> <b><font color="#000000">getline</font></b><font color="#990000">(</font>fin<font color="#990000">,</font>line<font color="#990000">)</font> <font color="#990000">)</font> <font color="#FF0000">{</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">!</font>gotfirstline <font color="#990000">)</font> <font color="#FF0000">{</font>
gotfirstline <font color="#990000">=</font> <b><font color="#0000FF">true</font></b><font color="#990000">;</font>
firstline <font color="#990000">=</font> line<font color="#990000">;</font>
<font color="#FF0000">}</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">(</font>line<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">]</font> <font color="#990000">==</font> <font color="#FF0000">'`'</font><font color="#990000">)</font> <font color="#990000">&&</font> <font color="#990000">(</font>line<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">]</font> <font color="#990000">==</font> <font color="#FF0000">'`'</font><font color="#990000">)</font> <font color="#990000">&&</font> <font color="#990000">(</font>line<font color="#990000">[</font><font color="#993399">2</font><font color="#990000">]</font> <font color="#990000">==</font> <font color="#FF0000">'`'</font><font color="#990000">)</font> <font color="#990000">)</font> <font color="#FF0000">{</font>
<i><font color="#9A1900">// we ignore any language specification after the three back quotes</font></i>
codemode <font color="#990000">=</font> <font color="#990000">!</font>codemode<font color="#990000">;</font>
<b><font color="#0000FF">continue</font></b><font color="#990000">;</font>
<font color="#FF0000">}</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> codemode <font color="#990000">)</font>
file <font color="#990000">+=</font> codeprefix<font color="#990000">;</font>
file <font color="#990000">+=</font> line <font color="#990000">+</font> <font color="#FF0000">"</font><font color="#CC33CC">\n</font><font color="#FF0000">"</font><font color="#990000">;</font>
<font color="#FF0000">}</font>
<i><font color="#9A1900">// try to process the string</font></i>
MMIOT<font color="#990000">*</font> doc <font color="#990000">=</font> <b><font color="#000000">mkd_string</font></b><font color="#990000">(</font>file<font color="#990000">.</font><b><font color="#000000">c_str</font></b><font color="#990000">(),</font>file<font color="#990000">.</font><b><font color="#000000">length</font></b><font color="#990000">(),</font><font color="#993399">0</font><font color="#990000">);</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> doc <font color="#990000">==</font> NULL <font color="#990000">)</font> <font color="#FF0000">{</font>
cout <font color="#990000"><<</font> <font color="#FF0000">"Error processing markdown input file in mkd_in()"</font> <font color="#990000"><<</font> endl<font color="#990000">;</font>
<b><font color="#000000">exit</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">);</font>
<font color="#FF0000">}</font>
<i><font color="#9A1900">// determine where the output is going</font></i>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">(</font>outidx <font color="#990000">==</font> <font color="#990000">-</font><font color="#993399">1</font><font color="#990000">)</font> <font color="#990000">||</font> <font color="#990000">(!</font><b><font color="#000000">strcmp</font></b><font color="#990000">(</font>argv<font color="#990000">[</font>outidx<font color="#990000">],</font><font color="#FF0000">"-"</font><font color="#990000">))</font> <font color="#990000">)</font>
fpout <font color="#990000">=</font> stdout<font color="#990000">;</font>
<b><font color="#0000FF">else</font></b> <b><font color="#0000FF">if</font></b> <font color="#990000">(</font> <font color="#990000">(</font>fpout <font color="#990000">=</font> <b><font color="#000000">fopen</font></b><font color="#990000">(</font>argv<font color="#990000">[</font>outidx<font color="#990000">],</font><font color="#FF0000">"w"</font><font color="#990000">))</font> <font color="#990000">==</font> NULL <font color="#990000">)</font> <font color="#FF0000">{</font>
<b><font color="#000000">printf</font></b> <font color="#990000">(</font><font color="#FF0000">"Error: unable to open output file: %s</font><font color="#CC33CC">\n</font><font color="#FF0000">"</font><font color="#990000">,</font> argv<font color="#990000">[</font><font color="#993399">2</font><font color="#990000">]);</font>
<b><font color="#000000">exit</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">);</font>
<font color="#FF0000">}</font>
<i><font color="#9A1900">// write the output</font></i>
<b><font color="#000000">fprintf</font></b> <font color="#990000">(</font>fpout<font color="#990000">,</font> <font color="#FF0000">"<!doctype html></font><font color="#CC33CC">\n</font><font color="#FF0000"><html></font><font color="#CC33CC">\n</font><font color="#FF0000"><head></font><font color="#CC33CC">\n</font><font color="#FF0000"><meta charset=</font><font color="#CC33CC">\"</font><font color="#FF0000">utf-8</font><font color="#CC33CC">\"</font><font color="#FF0000">></font><font color="#CC33CC">\n</font><font color="#FF0000"><title>%s</title></font><font color="#CC33CC">\n</font><font color="#FF0000">"</font><font color="#990000">,</font> firstline<font color="#990000">.</font><b><font color="#000000">c_str</font></b><font color="#990000">());</font>
<b><font color="#0000FF">if</font></b> <font color="#990000">(</font> css <font color="#990000">)</font>
<b><font color="#000000">fprintf</font></b> <font color="#990000">(</font>fpout<font color="#990000">,</font> <font color="#FF0000">"<link href=</font><font color="#CC33CC">\"</font><font color="#FF0000">%s</font><font color="#CC33CC">\"</font><font color="#FF0000"> media=</font><font color="#CC33CC">\"</font><font color="#FF0000">all</font><font color="#CC33CC">\"</font><font color="#FF0000"> rel=</font><font color="#CC33CC">\"</font><font color="#FF0000">stylesheet</font><font color="#CC33CC">\"</font><font color="#FF0000"> type=</font><font color="#CC33CC">\"</font><font color="#FF0000">text/css</font><font color="#CC33CC">\"</font><font color="#FF0000">>"</font><font color="#990000">,</font> css<font color="#990000">);</font>
<b><font color="#000000">fprintf</font></b> <font color="#990000">(</font>fpout<font color="#990000">,</font> <font color="#FF0000">"</head></font><font color="#CC33CC">\n</font><font color="#FF0000"><body></font><font color="#CC33CC">\n</font><font color="#FF0000">"</font><font color="#990000">);</font>
<b><font color="#000000">markdown</font></b> <font color="#990000">(</font>doc<font color="#990000">,</font> fpout<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">);</font>
<b><font color="#000000">fprintf</font></b> <font color="#990000">(</font>fpout<font color="#990000">,</font> <font color="#FF0000">"</body></font><font color="#CC33CC">\n</font><font color="#FF0000"></html></font><font color="#CC33CC">\n</font><font color="#FF0000">"</font><font color="#990000">);</font>
<b><font color="#000000">fclose</font></b><font color="#990000">(</font>fpout<font color="#990000">);</font>
<b><font color="#000000">mkd_cleanup</font></b><font color="#990000">(</font>doc<font color="#990000">);</font>
<b><font color="#0000FF">return</font></b> <font color="#993399">0</font><font color="#990000">;</font>
<font color="#FF0000">}</font>
</tt></pre>
</body>
</html>