quickbook/phrase.hpp
João Abecasis 5b9dff3c29 fix warnings with gcc -Wall.
[SVN r30967]
2005-09-14 00:58:00 +00:00

317 lines
12 KiB
C++

/*=============================================================================
Copyright (c) 2002 2004 Joel de Guzman
Copyright (c) 2004 Eric Niebler
http://spirit.sourceforge.net/
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#if !defined(BOOST_SPIRIT_QUICKBOOK_PHRASE_HPP)
#define BOOST_SPIRIT_QUICKBOOK_PHRASE_HPP
#include "detail/utils.hpp"
#include <boost/spirit/core.hpp>
#include <boost/spirit/utility/confix.hpp>
#include <boost/spirit/utility/chset.hpp>
#include <boost/spirit/actor/assign_actor.hpp>
#include <boost/spirit/dynamic/if.hpp>
namespace quickbook
{
using namespace boost::spirit;
template <typename Rule, typename Action>
inline void
simple_markup(Rule& simple, char mark, Action const& action, Rule const& eol)
{
simple =
mark >>
(
( graph_p >> // graph_p must follow mark
*(anychar_p -
( eol // Make sure that we don't go
| (graph_p >> mark) // past a single line
)
) >> graph_p // graph_p must precede mark
>> eps_p(mark
>> (space_p | punct_p)) // space_p or punct_p must
) // follow mark
| (
graph_p // A single char. e.g. *c*
>> eps_p(mark
>> (space_p | punct_p))
)
) [action]
>> mark
;
}
template <typename Actions>
struct phrase_grammar : grammar<phrase_grammar<Actions> >
{
phrase_grammar(Actions& actions, bool& is_not_preformatted)
: is_not_preformatted(is_not_preformatted), actions(actions) {}
template <typename Scanner>
struct definition
{
definition(phrase_grammar const& self)
{
using detail::var;
Actions& actions = self.actions;
space =
*(space_p | comment)
;
blank =
*(blank_p | comment)
;
eol = blank >> eol_p
;
close_bracket =
']' |
if_p(var(self.is_not_preformatted))
[
eol_p >> eol_p // Make sure that we don't go
] // past a single block, except
; // when preformatted.
hard_space =
(eps_p - (alnum_p | '_')) >> space // must not be followed by
; // alpha-numeric or underscore
comment =
"[/" >> *(anychar_p - ']') >> ']'
;
common =
actions.macro [actions.do_macro]
| phrase_markup
| code_block
| inline_code
| simple_format
| escape
| comment
;
inline_code =
'`' >>
(
*(anychar_p -
( '`'
| (eol >> eol) // Make sure that we don't go
) // past a single block
) >> eps_p('`')
) [actions.inline_code]
>> '`'
;
code_block =
"``" >>
(
*(anychar_p - "``")
>> eps_p("``")
) [actions.code_block]
>> "``"
;
simple_format =
simple_bold
| simple_italic
| simple_underline
| simple_teletype
| simple_strikethrough
;
simple_markup(simple_bold,
'*', actions.simple_bold, eol);
simple_markup(simple_italic,
'/', actions.simple_italic, eol);
simple_markup(simple_underline,
'_', actions.simple_underline, eol);
simple_markup(simple_teletype,
'=', actions.simple_teletype, eol);
simple_markup(simple_strikethrough,
'-', actions.simple_strikethrough, eol);
phrase =
*( common
| comment
| (anychar_p -
close_bracket) [actions.plain_char]
)
;
phrase_markup =
'['
>> ( image
| url
| link
| anchor
| source_mode
| funcref
| classref
| memberref
| enumref
| headerref
| bold
| italic
| underline
| teletype
| strikethrough
| quote
| str_p("br") [actions.break_]
)
>> ']'
;
escape =
str_p("\\n") [actions.break_]
| '\\' >> punct_p [actions.raw_char]
| (
"'''" >> !eol
>> *(anychar_p - "'''") [actions.raw_char]
>> "'''"
)
;
image =
'$' >> blank
>> (*(anychar_p -
close_bracket)) [actions.image]
;
url =
'@'
>> (*(anychar_p -
(']' | hard_space))) [actions.url_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.url_post]
;
link =
"link" >> hard_space
>> (*(anychar_p -
(']' | hard_space))) [actions.link_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.link_post]
;
anchor =
'#'
>> blank
>> ( *(anychar_p -
close_bracket)
) [actions.anchor]
;
funcref =
"funcref" >> hard_space
>> (*(anychar_p -
(']' | hard_space))) [actions.funcref_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.funcref_post]
;
classref =
"classref" >> hard_space
>> (*(anychar_p -
(']' | hard_space))) [actions.classref_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.classref_post]
;
memberref =
"memberref" >> hard_space
>> (*(anychar_p -
(']' | hard_space))) [actions.memberref_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.memberref_post]
;
enumref =
"enumref" >> hard_space
>> (*(anychar_p -
(']' | hard_space))) [actions.enumref_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.enumref_post]
;
headerref =
"headerref" >> hard_space
>> (*(anychar_p -
(']' | hard_space))) [actions.headerref_pre]
>> ( eps_p(']')
| (hard_space >> phrase)
) [actions.headerref_post]
;
bold =
ch_p('*') [actions.bold_pre]
>> blank >> phrase [actions.bold_post]
;
italic =
ch_p('\'') [actions.italic_pre]
>> blank >> phrase [actions.italic_post]
;
underline =
ch_p('_') [actions.underline_pre]
>> blank >> phrase [actions.underline_post]
;
teletype =
ch_p('^') [actions.teletype_pre]
>> blank >> phrase [actions.teletype_post]
;
strikethrough =
ch_p('-') [actions.strikethrough_pre]
>> blank >> phrase [actions.strikethrough_post]
;
quote =
ch_p('"') [actions.quote_pre]
>> blank >> phrase [actions.quote_post]
;
source_mode =
(
str_p("c++")
| "python"
) [assign_a(actions.source_mode)]
;
}
rule<Scanner> space, blank, comment, phrase, phrase_markup, image,
close_bracket, bold, italic, underline, teletype,
strikethrough, escape, url, common, funcref,
classref, memberref, enumref, headerref, anchor,
link, hard_space, eol, inline_code, simple_format,
simple_bold, simple_italic, simple_underline,
simple_teletype, simple_strikethrough, source_mode,
quote, code_block;
rule<Scanner> const&
start() const { return common; }
};
bool& is_not_preformatted;
Actions& actions;
};
}
#endif // BOOST_SPIRIT_QUICKBOOK_PHRASE_HPP