Ticket #3029: quickbook.patch

File quickbook.patch, 6.9 KB (added by jgresula@…, 13 years ago)

patch

  • detail/actions.cpp

     
    968968        out << "\" />\n";
    969969    }
    970970
    971     void cpp_code_snippet_grammar::pass_thru(iterator first, iterator last) const
     971    void code_snippet_grammar::pass_thru(iterator first, iterator last) const
    972972    {
    973973        code += *first;
    974974    }
     
    978978        int callout_id = 0;
    979979    }
    980980
    981     void cpp_code_snippet_grammar::callout(iterator first, iterator last, char const* role) const
     981    void code_snippet_grammar::callout(iterator first, iterator last, char const* role) const
    982982    {
    983983        using detail::callout_id;
    984984        code += "``'''";
     
    993993        callouts.push_back(std::string(first, last));
    994994    }
    995995
    996     void cpp_code_snippet_grammar::inline_callout(iterator first, iterator last) const
     996    void code_snippet_grammar::inline_callout(iterator first, iterator last) const
    997997    {
    998998        callout(first, last, "callout_bug");
    999999    }
    10001000
    1001     void cpp_code_snippet_grammar::line_callout(iterator first, iterator last) const
     1001    void code_snippet_grammar::line_callout(iterator first, iterator last) const
    10021002    {
    10031003        callout(first, last, "line_callout_bug");
    10041004    }
    10051005
    1006     void cpp_code_snippet_grammar::escaped_comment(iterator first, iterator last) const
     1006    void code_snippet_grammar::escaped_comment(iterator first, iterator last) const
    10071007    {
    10081008        if (!code.empty())
    10091009        {
     
    10221022        }
    10231023    }
    10241024
    1025     void cpp_code_snippet_grammar::compile(iterator first, iterator last) const
     1025    void code_snippet_grammar::compile(iterator first, iterator last) const
    10261026    {
    10271027        using detail::callout_id;
    10281028        if (!code.empty())
     
    10811081        iterator_type first(code.begin(), code.end(), file);
    10821082        iterator_type last(code.end(), code.end());
    10831083
    1084         cpp_code_snippet_grammar g(storage, doc_id);
     1084        size_t fname_len = file.size();
     1085        bool is_python = file[--fname_len]=='y' && file[--fname_len]=='p';
     1086        code_snippet_grammar g(storage, doc_id, is_python);
    10851087        // TODO: Should I check that parse succeeded?
    10861088        boost::spirit::classic::parse(first, last, g);
    10871089
  • code_snippet.hpp

     
    1515
    1616namespace quickbook
    1717{
    18     struct cpp_code_snippet_grammar
    19         : grammar<cpp_code_snippet_grammar>
    20     {
    21         cpp_code_snippet_grammar(std::vector<template_symbol>& storage, std::string const& doc_id)
     18  struct code_snippet_grammar
     19      : grammar<code_snippet_grammar>
     20  {
     21        code_snippet_grammar(std::vector<template_symbol>& storage,
     22                                 std::string const& doc_id,
     23                                 bool is_python)
    2224            : storage(storage)
    2325            , doc_id(doc_id)
     26            , is_python(is_python)
    2427        {}
    2528
    2629        template <typename Scanner>
    2730        struct definition
    2831        {
    29             definition(cpp_code_snippet_grammar const& self)
     32            typedef code_snippet_grammar self_type;
     33           
     34            definition(self_type const& self)
    3035            {
    31                 typedef cpp_code_snippet_grammar self_type;
     36                self.is_python
     37                    ? definition_python(self)
     38                    : definition_cpp(self)
     39                    ;
     40            }
     41           
     42            void definition_python(self_type const& self)
     43            {
    3244                start_ =
    3345                    +(
    3446                            snippet                 [boost::bind(&self_type::compile, &self, _1, _2)]
     
    4153                    ;
    4254
    4355                snippet =
    44                     "//[" >> *space_p
     56                    "#[" >> *space_p
    4557                    >> identifier                   [assign_a(self.id)]
    46                     >> (*(code_elements - "//]"))
    47                     >> "//]"
     58                    >> (*(code_elements - "#]"))
     59                    >> "#]"
    4860                    ;
    4961
    5062                code_elements =
    5163                        escaped_comment
    5264                    |   ignore
     65                    |   (anychar_p - "#]")         [boost::bind(&self_type::pass_thru, &self, _1, _2)]
     66                    ;
     67
     68                ignore =
     69                        *blank_p >> "#<-"
     70                        >> (*(anychar_p - "#->"))
     71                        >> "#->" >> *blank_p >> eol_p
     72                    |   "\"\"\"<-\"\"\""
     73                        >> (*(anychar_p - "\"\"\"->\"\"\""))
     74                        >> "\"\"\"->\"\"\""
     75                    |   "\"\"\"<-"
     76                        >> (*(anychar_p - "->\"\"\""))
     77                        >> "->\"\"\""
     78                    ;
     79
     80                escaped_comment =
     81                        *space_p >> "#`"
     82                        >> ((*(anychar_p - eol_p))
     83                            >> eol_p)               [boost::bind(&self_type::escaped_comment, &self, _1, _2)]
     84                    |   *space_p >> "\"\"\"`"
     85                        >> (*(anychar_p - "\"\"\""))    [boost::bind(&self_type::escaped_comment, &self, _1, _2)]
     86                        >> "\"\"\""
     87                    ;
     88            }
     89           
     90            void definition_cpp(self_type const& self)
     91            {
     92                start_ =
     93                    +(
     94                            snippet                 [boost::bind(&self_type::compile, &self, _1, _2)]
     95                        |   anychar_p
     96                    )
     97                    ;
     98
     99                identifier =
     100                    (alpha_p | '_') >> *(alnum_p | '_')
     101                    ;
     102
     103                snippet =
     104                        "//[" >> *space_p
     105                        >> identifier                   [assign_a(self.id)]
     106                        >> (*(code_elements - "//]"))
     107                        >> "//]"
     108                    |
     109                        "/*[" >> *space_p
     110                        >> identifier                   [assign_a(self.id)]
     111                        >> *space_p >> "*/"
     112                        >> (*(code_elements - "/*]*"))
     113                        >> "/*]*/"
     114                    ;
     115
     116                code_elements =
     117                        escaped_comment
     118                    |   ignore
    53119                    |   line_callout
    54120                    |   inline_callout
    55                     |   (anychar_p - "//]")         [boost::bind(&self_type::pass_thru, &self, _1, _2)]
     121                    |   (anychar_p - "//]" - "/*]*/")    [boost::bind(&self_type::pass_thru, &self, _1, _2)]
    56122                    ;
    57123
    58124                inline_callout =
     
    111177        mutable std::vector<std::string> callouts;
    112178        std::vector<template_symbol>& storage;
    113179        std::string doc_id;
     180        bool is_python;
    114181    };
     182 
    115183}
    116184
    117185#endif // BOOST_SPIRIT_QUICKBOOK_CODE_SNIPPET_HPP