diff options
| author | Grégoire Duchêne <gduchene@fastmail.net> | 2010-12-04 21:34:06 +0100 |
|---|---|---|
| committer | Grégoire Duchêne <gduchene@fastmail.net> | 2010-12-04 21:34:06 +0100 |
| commit | 7d8e1295ff6bd4a768a658690b850d58aba01b0b (patch) | |
| tree | 2fe35673f0b58b86934bed419b29202ce22fc5c4 /src | |
| parent | 2e7217432858185374fc958bcd4dc4d0cd7b22fe (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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/elements.h | 46 | ||||
| -rw-r--r-- | src/generators/latex/text_g.cpp | 29 | ||||
| -rw-r--r-- | src/generators/latex/text_g.h | 33 | ||||
| -rw-r--r-- | src/generators/latex_g.cpp | 20 | ||||
| -rw-r--r-- | src/generators/latex_g.h | 30 | ||||
| -rw-r--r-- | src/main.cpp | 70 | ||||
| -rw-r--r-- | src/parser/document_p.cpp | 20 | ||||
| -rw-r--r-- | src/parser/document_p.h | 26 | ||||
| -rw-r--r-- | src/parser/text_p.cpp | 31 | ||||
| -rw-r--r-- | src/parser/text_p.h | 34 |
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 |
