From e916a7cd90e507a06db904497fc6dc3875e7fee9 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Wed, 27 Jan 2010 22:01:21 +0000 Subject: [PATCH] Formatted text, conditional phrases, anchors, line breaks. [SVN r59297] --- detail/actions.cpp | 43 ----------- detail/actions.hpp | 62 ---------------- detail/actions_class.cpp | 21 ------ detail/actions_class.hpp | 22 ------ phrase.cpp | 157 ++++++++++++++++++++++----------------- phrase.hpp | 38 ++++++++-- phrase_actions.cpp | 27 +++++++ 7 files changed, 148 insertions(+), 222 deletions(-) diff --git a/detail/actions.cpp b/detail/actions.cpp index 3f7e6bb..094fdcc 100644 --- a/detail/actions.cpp +++ b/detail/actions.cpp @@ -46,15 +46,6 @@ namespace quickbook } } - // Handles line-breaks (DEPRECATED!!!) - void break_action::operator()(iterator_range x, unused_type, unused_type) const - { - boost::spirit::classic::file_position const pos = x.begin().get_position(); - detail::outwarn(pos.file,pos.line) << "in column:" << pos.column << ", " - << "[br] and \\n are deprecated" << ".\n"; - phrase << break_mark; - } - void error_action::operator()(iterator_range x, unused_type, unused_type) const { boost::spirit::classic::file_position const pos = x.begin().get_position(); @@ -138,31 +129,6 @@ namespace quickbook out << post; } - void cond_phrase_action_pre::operator()(iterator_range x, unused_type, unused_type) const - { - std::string str(x.begin(), x.end()); - conditions.push_back(macro.find(str.c_str())); - out.push(); // save the stream - } - - void cond_phrase_action_post::operator()(iterator_range x, unused_type, unused_type) const - { - bool symbol_found = conditions.back(); - conditions.pop_back(); - - if (x.begin() == x.end() || !symbol_found) - { - out.pop(); // restore the stream - } - else - { - std::string save; - out.swap(save); - out.pop(); // restore the stream - out << save; // print the body - } - } - void list_action::operator()(unused_type, unused_type, unused_type) const { BOOST_ASSERT(!list_marks.empty()); // there must be at least one item in the stack @@ -281,15 +247,6 @@ namespace quickbook out << ""; } - void anchor_action::operator()(iterator_range x, unused_type, unused_type) const - { - iterator first = x.begin(), last = x.end(); - out << "\n"; - } - void do_macro_action::operator()(std::string const& str, unused_type, unused_type) const { if (str == quickbook_get_date) diff --git a/detail/actions.hpp b/detail/actions.hpp index 49bcbb9..7a73c16 100644 --- a/detail/actions.hpp +++ b/detail/actions.hpp @@ -173,44 +173,6 @@ namespace quickbook string_symbols const& macro; }; - struct cond_phrase_action_pre - { - // Handles conditional phrases - - cond_phrase_action_pre( - collector& out - , std::vector& conditions - , string_symbols const& macro) - : out(out) - , conditions(conditions) - , macro(macro) {} - - void operator()(iterator_range, unused_type, unused_type) const; - - collector& out; - std::vector& conditions; - string_symbols const& macro; - }; - - struct cond_phrase_action_post - { - // Handles conditional phrases - - cond_phrase_action_post( - collector& out - , std::vector& conditions - , string_symbols const& macro) - : out(out) - , conditions(conditions) - , macro(macro) {} - - void operator()(iterator_range, unused_type, unused_type) const; - - collector& out; - std::vector& conditions; - string_symbols const& macro; - }; - struct list_action { // Handles lists @@ -282,18 +244,6 @@ namespace quickbook collector& out; }; - struct anchor_action - { - // Handles anchors - - anchor_action(collector& out) - : out(out) {} - - void operator()(iterator_range, unused_type, unused_type) const; - - collector& out; - }; - extern char const* quickbook_get_date; extern char const* quickbook_get_time; @@ -482,18 +432,6 @@ namespace quickbook collector& temp_para; }; - struct break_action - { - // Handles line-breaks (DEPRECATED!!!) - - break_action(collector& phrase) - : phrase(phrase) {} - - void operator()(iterator_range, unused_type, unused_type) const; - - collector& phrase; - }; - struct macro_identifier_action { // Handles macro identifiers diff --git a/detail/actions_class.cpp b/detail/actions_class.cpp index ef584b7..43b3ebf 100644 --- a/detail/actions_class.cpp +++ b/detail/actions_class.cpp @@ -94,30 +94,11 @@ namespace quickbook , tip(out, temp_para, tip_pre, tip_post) , plain_char(phrase) , raw_char(phrase) - , cond_phrase_pre(phrase, conditions, macro) - , cond_phrase_post(phrase, conditions, macro) , list(out, list_buffer, list_indent, list_marks) , list_format(list_buffer, list_indent, list_marks, error_count) , list_item(list_buffer, phrase, list_item_pre, list_item_post) - , bold_pre(phrase, bold_pre_) - , bold_post(phrase, bold_post_) - , italic_pre(phrase, italic_pre_) - , italic_post(phrase, italic_post_) - , underline_pre(phrase, underline_pre_) - , underline_post(phrase, underline_post_) - , teletype_pre(phrase, teletype_pre_) - , teletype_post(phrase, teletype_post_) - , strikethrough_pre(phrase, strikethrough_pre_) - , strikethrough_post(phrase, strikethrough_post_) - , quote_pre(phrase, quote_pre_) - , quote_post(phrase, quote_post_) - , replaceable_pre(phrase, replaceable_pre_) - , replaceable_post(phrase, replaceable_post_) - , footnote_pre(phrase, footnote_pre_) - , footnote_post(phrase, footnote_post_) - , simple_bold(phrase, bold_pre_, bold_post_, macro) , simple_italic(phrase, italic_pre_, italic_post_, macro) , simple_underline(phrase, underline_pre_, underline_post_, macro) @@ -132,7 +113,6 @@ namespace quickbook , start_varlistitem(phrase) , end_varlistitem(phrase, temp_para) - , break_(phrase) , macro_identifier(*this) , macro_definition(*this) , do_macro(phrase) @@ -147,7 +127,6 @@ namespace quickbook , end_row(phrase, end_row_) , start_cell(phrase, table_span) , end_cell(phrase, temp_para) - , anchor(out) , begin_section(out, phrase, doc_id, section_id, section_level, qualified_section_id) , end_section(out, section_level, qualified_section_id, error_count) diff --git a/detail/actions_class.hpp b/detail/actions_class.hpp index 3ce72b2..8cbc981 100644 --- a/detail/actions_class.hpp +++ b/detail/actions_class.hpp @@ -83,7 +83,6 @@ namespace quickbook std::string macro_id; std::stack list_marks; int list_indent; - std::vector conditions; string_list template_info; int template_depth; bool template_escape; @@ -117,30 +116,11 @@ namespace quickbook phrase_action warning, caution, important, note, tip; plain_char_action plain_char; raw_char_action raw_char; - cond_phrase_action_pre cond_phrase_pre; - cond_phrase_action_post cond_phrase_post; list_action list; list_format_action list_format; phrase_action list_item; - markup_action bold_pre; - markup_action bold_post; - markup_action italic_pre; - markup_action italic_post; - markup_action underline_pre; - markup_action underline_post; - markup_action teletype_pre; - markup_action teletype_post; - markup_action strikethrough_pre; - markup_action strikethrough_post; - markup_action quote_pre; - markup_action quote_post; - markup_action replaceable_pre; - markup_action replaceable_post; - markup_action footnote_pre; - markup_action footnote_post; - simple_phrase_action simple_bold; simple_phrase_action simple_italic; simple_phrase_action simple_underline; @@ -155,7 +135,6 @@ namespace quickbook start_varlistitem_action start_varlistitem; end_varlistitem_action end_varlistitem; - break_action break_; macro_identifier_action macro_identifier; macro_definition_action macro_definition; do_macro_action do_macro; @@ -170,7 +149,6 @@ namespace quickbook markup_action end_row; start_col_action start_cell; end_col_action end_cell; - anchor_action anchor; begin_section_action begin_section; end_section_action end_section; diff --git a/phrase.cpp b/phrase.cpp index 5a32f9e..4b4a567 100644 --- a/phrase.cpp +++ b/phrase.cpp @@ -30,13 +30,32 @@ #include #include +BOOST_FUSION_ADAPT_STRUCT( + quickbook::anchor, + (std::string, id) + (char const*, dummy) +) + BOOST_FUSION_ADAPT_STRUCT( quickbook::link, - (quickbook::link_type, type) + (quickbook::markup, type) (std::string, destination) (std::string, content) ) +BOOST_FUSION_ADAPT_STRUCT( + quickbook::formatted, + (quickbook::markup, type) + (std::string, content) +) + +BOOST_FUSION_ADAPT_STRUCT( + quickbook::break_, + (quickbook::file_position, position) + (char const*, dummy) +) + + BOOST_FUSION_ADAPT_STRUCT( quickbook::image, (quickbook::file_position, position) @@ -44,6 +63,12 @@ BOOST_FUSION_ADAPT_STRUCT( (quickbook::image::attribute_map, attributes) ) +BOOST_FUSION_ADAPT_STRUCT( + quickbook::cond_phrase, + (std::string, macro_id) + (std::string, content) +) + namespace quickbook { namespace qi = boost::spirit::qi; @@ -66,12 +91,12 @@ namespace quickbook qi::rule space, blank, comment, phrase, phrase_markup, - phrase_end, bold, italic, underline, teletype, - strikethrough, escape, common, - anchor, hard_space, eol, inline_code, simple_format, + phrase_end, + escape, common, + hard_space, eol, inline_code, simple_format, template_, - quote, code_block, footnote, replaceable, macro, - dummy_block, cond_phrase, macro_identifier, + code_block, replaceable, macro, + dummy_block, brackets_1_4, template_inner_arg_1_5, brackets_1_5 ; @@ -81,6 +106,11 @@ namespace quickbook qi::rule() > template_args; qi::rule phrase_attr; + + qi::rule break_, escape_break; + + qi::rule macro_identifier; + qi::rule cond_phrase; qi::rule image, image_1_4, image_1_5; qi::rule image_filename, image_attribute_key, image_attribute_value; @@ -88,8 +118,14 @@ namespace quickbook qi::rule()> image_attribute; qi::rule(char)> simple_markup; - qi::symbols link_symbol; + + qi::rule anchor; + + qi::symbols link_symbol; qi::rule link, url; + + qi::symbols format_symbol; + qi::rule formatted, footnote; qi::symbols source_mode; }; @@ -270,28 +306,28 @@ namespace quickbook phrase_markup = '[' - >> ( cond_phrase + >> ( cond_phrase [actions.process] | image [actions.process] | url [actions.process] | link [actions.process] - | anchor + | anchor [actions.process] | source_mode [actions.process] - | bold - | italic - | underline - | teletype - | strikethrough - | quote - | replaceable - | footnote + | formatted [actions.process] + | footnote [actions.process] | template_ - | qi::raw["br"] [actions.break_] + | break_ [actions.process] ) >> ']' ; + break_ = + position + >> "br" + >> qi::attr("dummy") + ; + escape = - qi::raw["\\n"] [actions.break_] + escape_break [actions.process] | "\\ " // ignore an escaped char | '\\' >> qi::punct [actions.raw_char] | ( @@ -300,15 +336,22 @@ namespace quickbook >> qi::lit("'''") [actions.escape_post] ) ; + + escape_break = + position + >> "\\n" + >> qi::attr("dummy") + ; macro_identifier = +(qi::char_ - (qi::space | ']')) ; cond_phrase = - '?' >> blank - >> qi::raw[macro_identifier] [actions.cond_phrase_pre] - >> qi::raw[-phrase] [actions.cond_phrase_post] + '?' + >> blank + >> macro_identifier + >> -phrase_attr ; image = @@ -356,19 +399,20 @@ namespace quickbook anchor = '#' >> blank - >> qi::raw[*(qi::char_ - phrase_end)] [actions.anchor] + >> *(qi::char_ - phrase_end) + >> qi::attr("dummy") ; link_symbol.add - ("link", link_type(link_pre_, link_post_)) - ("funcref", link_type(funcref_pre_, funcref_post_)) - ("classref", link_type(classref_pre_, classref_post_)) - ("memberref", link_type(memberref_pre_, memberref_post_)) - ("enumref", link_type(enumref_pre_, enumref_post_)) - ("macroref", link_type(macroref_pre_, macroref_post_)) - ("headerref", link_type(headerref_pre_, headerref_post_)) - ("conceptref", link_type(conceptref_pre_, conceptref_post_)) - ("globalref", link_type(globalref_pre_, globalref_post_)) + ("link", markup(link_pre_, link_post_)) + ("funcref", markup(funcref_pre_, funcref_post_)) + ("classref", markup(classref_pre_, classref_post_)) + ("memberref", markup(memberref_pre_, memberref_post_)) + ("enumref", markup(enumref_pre_, enumref_post_)) + ("macroref", markup(macroref_pre_, macroref_post_)) + ("headerref", markup(headerref_pre_, headerref_post_)) + ("conceptref", markup(conceptref_pre_, conceptref_post_)) + ("globalref", markup(globalref_pre_, globalref_post_)) ; link = @@ -382,47 +426,24 @@ namespace quickbook url = '@' - >> qi::attr(link_type(url_pre_, url_post_)) + >> qi::attr(markup(url_pre_, url_post_)) >> *(qi::char_ - (']' | qi::space)) >> ( &qi::lit(']') | (hard_space >> phrase_attr) ) ; - bold = - qi::char_('*') [actions.bold_pre] - >> blank >> phrase [actions.bold_post] + format_symbol.add + ("*", markup(bold_pre_, bold_post_)) + ("'", markup(italic_pre_, italic_post_)) + ("_", markup(underline_pre_, underline_post_)) + ("^", markup(teletype_pre_, teletype_post_)) + ("-", markup(strikethrough_pre_, strikethrough_post_)) + ("\"", markup(quote_pre_, quote_post_)) + ("~", markup(replaceable_pre_, replaceable_post_)) ; - italic = - qi::char_('\'') [actions.italic_pre] - >> blank >> phrase [actions.italic_post] - ; - - underline = - qi::char_('_') [actions.underline_pre] - >> blank >> phrase [actions.underline_post] - ; - - teletype = - qi::char_('^') [actions.teletype_pre] - >> blank >> phrase [actions.teletype_post] - ; - - strikethrough = - qi::char_('-') [actions.strikethrough_pre] - >> blank >> phrase [actions.strikethrough_post] - ; - - quote = - qi::char_('"') [actions.quote_pre] - >> blank >> phrase [actions.quote_post] - ; - - replaceable = - qi::char_('~') [actions.replaceable_pre] - >> blank >> phrase [actions.replaceable_post] - ; + formatted = format_symbol >> blank >> phrase_attr; source_mode.add ("c++", quickbook::source_mode("c++")) @@ -431,8 +452,10 @@ namespace quickbook ; footnote = - qi::lit("footnote") [actions.footnote_pre] - >> blank >> phrase [actions.footnote_post] + "footnote" + >> qi::attr(markup(footnote_pre_, footnote_post_)) + >> blank + >> phrase_attr ; position = qi::raw[qi::eps] [get_position]; diff --git a/phrase.hpp b/phrase.hpp index 92d63ea..d055546 100644 --- a/phrase.hpp +++ b/phrase.hpp @@ -27,22 +27,42 @@ namespace quickbook std::string mode; }; - struct link_type { - link_type() + struct markup { + markup() : pre(""), post("") {} - link_type(char const* pre, char const* post) + markup(char const* pre, char const* post) : pre(pre), post(post) {} char const* pre; char const* post; }; + + struct anchor { + char const* dummy; + std::string id; + }; struct link { - link_type type; + markup type; std::string destination; std::string content; }; + struct formatted { + markup type; + std::string content; + }; + + struct cond_phrase { + std::string macro_id; + std::string content; + }; + + struct break_ { + const char* dummy; + file_position position; + }; + struct image { typedef std::multimap attribute_map; @@ -51,9 +71,13 @@ namespace quickbook attribute_map attributes; }; - void process(quickbook::actions& actions, source_mode const& s); - void process(quickbook::actions& actions, link const& x); - void process(quickbook::actions& actions, image const& x); + void process(quickbook::actions&, source_mode const&); + void process(quickbook::actions&, anchor const&); + void process(quickbook::actions&, link const&); + void process(quickbook::actions&, formatted const&); + void process(quickbook::actions&, cond_phrase const&); + void process(quickbook::actions&, break_ const&); + void process(quickbook::actions&, image const&); } #endif // BOOST_SPIRIT_QUICKBOOK_PHRASE_HPP diff --git a/phrase_actions.cpp b/phrase_actions.cpp index e54cc5b..1a91963 100644 --- a/phrase_actions.cpp +++ b/phrase_actions.cpp @@ -10,6 +10,7 @@ #include "./phrase.hpp" #include "./detail/actions_class.hpp" +#include "./detail/markups.hpp" namespace quickbook { @@ -17,6 +18,12 @@ namespace quickbook actions.source_mode = s.mode; } + void process(quickbook::actions& actions, anchor const& x) { + actions.phrase << "\n"; + } + void process(quickbook::actions& actions, link const& x) { actions.phrase << x.type.pre; detail::print_string(x.destination, actions.phrase.get()); @@ -27,4 +34,24 @@ namespace quickbook actions.phrase << x.content; actions.phrase << x.type.post; } + + void process(quickbook::actions& actions, formatted const& x) { + actions.phrase << x.type.pre << x.content << x.type.post; + } + + void process(quickbook::actions& actions, cond_phrase const& x) { + bool symbol_found = actions.macro.find(x.macro_id.c_str()); + + if (!x.content.empty() && symbol_found) { + actions.phrase << x.content; // print the body + } + } + + void process(quickbook::actions& actions, break_ const& x) { + detail::outwarn(x.position.file,x.position.line) + << "in column:" << x.position.column << ", " + << "[br] and \\n are deprecated" << ".\n"; + actions.phrase << break_mark; + + } }