From 7d8e1295ff6bd4a768a658690b850d58aba01b0b Mon Sep 17 00:00:00 2001 From: Grégoire Duchêne Date: Sat, 4 Dec 2010 21:34:06 +0100 Subject: 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. --- src/elements.h | 46 +++++++++++++++++++++++++++ src/generators/latex/text_g.cpp | 29 +++++++++++++++++ src/generators/latex/text_g.h | 33 +++++++++++++++++++ src/generators/latex_g.cpp | 20 ++++++++++++ src/generators/latex_g.h | 30 ++++++++++++++++++ src/main.cpp | 70 +++++++++++++++++++++++++++++++++++++++++ src/parser/document_p.cpp | 20 ++++++++++++ src/parser/document_p.h | 26 +++++++++++++++ src/parser/text_p.cpp | 31 ++++++++++++++++++ src/parser/text_p.h | 34 ++++++++++++++++++++ 10 files changed, 339 insertions(+) create mode 100644 src/elements.h create mode 100644 src/generators/latex/text_g.cpp create mode 100644 src/generators/latex/text_g.h create mode 100644 src/generators/latex_g.cpp create mode 100644 src/generators/latex_g.h create mode 100644 src/main.cpp create mode 100644 src/parser/document_p.cpp create mode 100644 src/parser/document_p.h create mode 100644 src/parser/text_p.cpp create mode 100644 src/parser/text_p.h 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 + +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 +#include +#include +#include + +typedef std::wstring::iterator iiterator; +typedef std::back_insert_iterator oiterator; + +struct stext_t; +typedef boost::variant, std::wstring> text_t; + +enum stattribute_t { + EMPH, + SEMPH, + VSEMPH +}; + +struct stext_t { + stattribute_t attribute; + std::vector value; +}; + +typedef std::vector document_t; + +BOOST_FUSION_ADAPT_STRUCT (stext_t, + (stattribute_t, attribute) + (std::vector, 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 + +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 + +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 +#include +#include "../../elements.h" + +namespace ka = boost::spirit::karma; + +namespace latex { +struct text_g : ka::grammar { + ka::rule text_; + ka::rule stext_; + ka::rule 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 + +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 + +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 +#include "../elements.h" +#include "latex/text_g.h" + +namespace ka = boost::spirit::karma; + +struct latex_g : ka::grammar { + ka::rule 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 + +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 +#include +#include +#include +#include +#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 + +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 + +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 { + qi::rule 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 + +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 + +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 +#include +#include +#include "../elements.h" + +namespace qi = boost::spirit::qi; + +struct text_p : qi::grammar { + qi::rule text_; + qi::rule stext_; + qi::rule ptext_; + qi::rule echar_; + qi::rule rchar_; + + text_p(); +}; +#endif -- cgit v1.2.3-70-g09d2