summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrégoire Duchêne <gduchene@fastmail.net>2010-12-04 21:34:06 +0100
committerGrégoire Duchêne <gduchene@fastmail.net>2010-12-04 21:34:06 +0100
commit7d8e1295ff6bd4a768a658690b850d58aba01b0b (patch)
tree2fe35673f0b58b86934bed419b29202ce22fc5c4
parent2e7217432858185374fc958bcd4dc4d0cd7b22fe (diff)
Emphasized text support added.
I will try to add both parsing and generation at the same time for each mdown feature I will implement. Do not expect this to last.
-rw-r--r--src/elements.h46
-rw-r--r--src/generators/latex/text_g.cpp29
-rw-r--r--src/generators/latex/text_g.h33
-rw-r--r--src/generators/latex_g.cpp20
-rw-r--r--src/generators/latex_g.h30
-rw-r--r--src/main.cpp70
-rw-r--r--src/parser/document_p.cpp20
-rw-r--r--src/parser/document_p.h26
-rw-r--r--src/parser/text_p.cpp31
-rw-r--r--src/parser/text_p.h34
10 files changed, 339 insertions, 0 deletions
diff --git a/src/elements.h b/src/elements.h
new file mode 100644
index 0000000..1c2f451
--- /dev/null
+++ b/src/elements.h
@@ -0,0 +1,46 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#ifndef _MPPDOWN_ELEMENTS
+#define _MPPDOWN_ELEMENTS
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <boost/variant.hpp>
+#include <string>
+#include <vector>
+
+typedef std::wstring::iterator iiterator;
+typedef std::back_insert_iterator<std::wstring> oiterator;
+
+struct stext_t;
+typedef boost::variant<boost::recursive_wrapper<stext_t>, std::wstring> text_t;
+
+enum stattribute_t {
+ EMPH,
+ SEMPH,
+ VSEMPH
+};
+
+struct stext_t {
+ stattribute_t attribute;
+ std::vector<text_t> value;
+};
+
+typedef std::vector<text_t> document_t;
+
+BOOST_FUSION_ADAPT_STRUCT (stext_t,
+ (stattribute_t, attribute)
+ (std::vector<text_t>, value)
+ )
+#endif
diff --git a/src/generators/latex/text_g.cpp b/src/generators/latex/text_g.cpp
new file mode 100644
index 0000000..aeaffc0
--- /dev/null
+++ b/src/generators/latex/text_g.cpp
@@ -0,0 +1,29 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#include "text_g.h"
+
+latex::text_g::text_g() : text_g::base_type(text_) {
+ using namespace ka;
+ using ka::standard_wide::char_;
+
+ text_ = stext_ | ptext_;
+
+ stext_ = &uint_(EMPH) << L"\\emph{" << +text_ << '}'
+ | &uint_(SEMPH) << L"\\textit{\\emph{" << +text_ << L"}}"
+ | &uint_(VSEMPH) << L"\\texttt{\\textit{\\emph{" << +text_ << L"}}}";
+
+ ptext_ = +char_;
+}
diff --git a/src/generators/latex/text_g.h b/src/generators/latex/text_g.h
new file mode 100644
index 0000000..90d88b8
--- /dev/null
+++ b/src/generators/latex/text_g.h
@@ -0,0 +1,33 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#ifndef _MPPDOWN_LATEX_TEXT_G
+#define _MPPDOWN_LATEX_TEXT_G
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/include/support_standard_wide.hpp>
+#include "../../elements.h"
+
+namespace ka = boost::spirit::karma;
+
+namespace latex {
+struct text_g : ka::grammar<oiterator, text_t()> {
+ ka::rule<oiterator, text_t()> text_;
+ ka::rule<oiterator, stext_t()> stext_;
+ ka::rule<oiterator, std::wstring()> ptext_;
+
+ text_g();
+};
+}
+#endif
diff --git a/src/generators/latex_g.cpp b/src/generators/latex_g.cpp
new file mode 100644
index 0000000..089e8a9
--- /dev/null
+++ b/src/generators/latex_g.cpp
@@ -0,0 +1,20 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#include "latex_g.h"
+
+latex_g::latex_g() : latex_g::base_type(latex_) {
+ latex_ = +text_;
+}
diff --git a/src/generators/latex_g.h b/src/generators/latex_g.h
new file mode 100644
index 0000000..965ba47
--- /dev/null
+++ b/src/generators/latex_g.h
@@ -0,0 +1,30 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#ifndef _MPPDOWN_LATEX_G
+#define _MPPDOWN_LATEX_G
+#include <boost/spirit/include/karma.hpp>
+#include "../elements.h"
+#include "latex/text_g.h"
+
+namespace ka = boost::spirit::karma;
+
+struct latex_g : ka::grammar<oiterator, document_t()> {
+ ka::rule<oiterator, document_t()> latex_;
+ latex::text_g text_;
+
+ latex_g();
+};
+#endif
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..f4113fd
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,70 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#include <boost/spirit/include/karma.hpp>
+#include <boost/spirit/include/qi.hpp>
+#include <fstream>
+#include <iostream>
+#include <string>
+#include "elements.h"
+#include "generators/latex_g.h"
+#include "parser/document_p.h"
+
+namespace ka = boost::spirit::karma;
+namespace qi = boost::spirit::qi;
+
+int main(int argc, char **argv) {
+ using namespace std;
+
+ if (argc != 2)
+ return 1;
+
+ wifstream ifile(argv[1]);
+
+ if (ifile.fail()) {
+ cerr << "Error while reading the file." << endl;
+ return 1;
+ }
+
+ wchar_t buffer;
+ wstring input;
+
+ while (ifile.get(buffer))
+ input.push_back(buffer);
+
+ ifile.close();
+
+ document_p parser;
+ iiterator begin = input.begin();
+ iiterator end = input.end();
+ document_t ast;
+
+ if (!qi::parse(begin, end, parser, ast) || begin != end) {
+ cerr << "Error while parsing the file." << endl;
+ return 1;
+ }
+
+ latex_g generator;
+ wstring output;
+ oiterator sink(output);
+
+ if (!ka::generate(sink, generator, ast)) {
+ cerr << "Error while generating the output." << endl;
+ return 1;
+ }
+
+ wcout << output << flush;
+ return 0;
+}
diff --git a/src/parser/document_p.cpp b/src/parser/document_p.cpp
new file mode 100644
index 0000000..875211c
--- /dev/null
+++ b/src/parser/document_p.cpp
@@ -0,0 +1,20 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#include "document_p.h"
+
+document_p::document_p() : document_p::base_type(document_) {
+ document_ = +text_;
+}
diff --git a/src/parser/document_p.h b/src/parser/document_p.h
new file mode 100644
index 0000000..fc6530e
--- /dev/null
+++ b/src/parser/document_p.h
@@ -0,0 +1,26 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#ifndef _MPPDOWN_DOCUMENT_P
+#define _MPPDOWN_DOCUMENT_P
+#include "text_p.h"
+
+struct document_p : qi::grammar<iiterator, document_t()> {
+ qi::rule<iiterator, document_t()> document_;
+ text_p text_;
+
+ document_p();
+};
+#endif
diff --git a/src/parser/text_p.cpp b/src/parser/text_p.cpp
new file mode 100644
index 0000000..4d44e66
--- /dev/null
+++ b/src/parser/text_p.cpp
@@ -0,0 +1,31 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#include "text_p.h"
+
+text_p::text_p() : text_p::base_type(text_) {
+ using namespace qi;
+ using qi::standard_wide::char_;
+
+ text_ = stext_ | ptext_;
+
+ stext_ = lit("***") >> attr(VSEMPH) >> +text_ >> "***"
+ | lit("**") >> attr(SEMPH) >> +text_ >> "**"
+ | lit('*') >> attr(EMPH) >> +text_ >> '*';
+
+ ptext_ = +(echar_ | rchar_);
+ echar_ = lit('\\') >> char_;
+ rchar_ = char_ - char_(L"*");
+}
diff --git a/src/parser/text_p.h b/src/parser/text_p.h
new file mode 100644
index 0000000..83ef54f
--- /dev/null
+++ b/src/parser/text_p.h
@@ -0,0 +1,34 @@
+/*
+Copyright (c) 2010, Grégoire Duchêne <gduchene@fastmail.net>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+#ifndef _MPPDOWN_TEXT_P
+#define _MPPDOWN_TEXT_P
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/support_standard_wide.hpp>
+#include <string>
+#include "../elements.h"
+
+namespace qi = boost::spirit::qi;
+
+struct text_p : qi::grammar<iiterator, text_t()> {
+ qi::rule<iiterator, text_t()> text_;
+ qi::rule<iiterator, stext_t()> stext_;
+ qi::rule<iiterator, std::wstring()> ptext_;
+ qi::rule<iiterator, wchar_t()> echar_;
+ qi::rule<iiterator, wchar_t()> rchar_;
+
+ text_p();
+};
+#endif