Only allow phrase templates in attribute values. Refs #2035.

[SVN r86683]
This commit is contained in:
Daniel James 2013-11-13 21:47:28 +00:00
parent 02d70c0524
commit 0ec1072eb3
5 changed files with 51 additions and 6 deletions

View File

@ -191,6 +191,7 @@ namespace quickbook
case code_tags::inline_code_block:
case code_tags::inline_code:
return code_action(state, v);
case template_tags::attribute_template:
case template_tags::template_:
return do_template_action(state, v, first.base());
default:
@ -1367,6 +1368,9 @@ namespace quickbook
void do_template_action(quickbook::state& state, value template_list,
string_iterator first)
{
bool const is_attribute_template =
template_list.get_tag() == template_tags::attribute_template;
// Get the arguments
value_consumer values = template_list;
@ -1428,6 +1432,20 @@ namespace quickbook
return;
}
///////////////////////////////////
// Check that attribute templates are phrase templates
if (is_attribute_template &&
symbol->content.get_tag() != template_tags::phrase)
{
detail::outerr(state.current_file, first)
<< "Only phrase templates can be used in attribute values."
<< std::endl;
++state.error_count;
return;
}
///////////////////////////////////
// Initialise the arguments

View File

@ -91,7 +91,7 @@ namespace quickbook
paragraph_separator, inside_paragraph,
code, code_line, blank_line, hr,
inline_code, skip_inline_code,
template_,
template_, attribute_template, template_body,
code_block, skip_code_block, macro,
template_args,
template_args_1_4, template_arg_1_4,
@ -653,7 +653,24 @@ namespace quickbook
( '['
>> space
>> state.values.list(template_tags::template_)
[ ( cl::str_p('`')
[ local.template_body
>> ']'
]
) [element_action]
;
local.attribute_template =
( '['
>> space
>> state.values.list(template_tags::attribute_template)
[ local.template_body
>> ']'
]
) [element_action]
;
local.template_body =
( cl::str_p('`')
>> cl::eps_p(cl::punct_p)
>> state.templates.scope
[state.values.entry(ph::arg1, ph::arg2, template_tags::escape)]
@ -675,9 +692,6 @@ namespace quickbook
)
>> space
>> !local.template_args
>> ']'
]
) [element_action]
;
local.template_args =
@ -945,7 +959,7 @@ namespace quickbook
)
) [error("Elements not allowed in attribute values.")]
>> local.square_brackets
| local.template_
| local.attribute_template
| cl::eps_p(cl::ch_p('[')) [error("Unmatched template in attribute value.")]
>> local.square_brackets
| raw_escape

View File

@ -15,6 +15,7 @@ namespace quickbook
{
QUICKBOOK_VALUE_TAGS(template_tags, 0x100,
(template_)
(attribute_template)
(escape)
(identifier)
(block)

View File

@ -113,6 +113,7 @@ test-suite quickbook.test :
[ quickbook-error-test templates-1_6-fail1 ]
[ quickbook-test templates-1_7 ]
[ quickbook-error-test templates-1_7-fail1 ]
[ quickbook-error-test templates-1_7-fail2 ]
[ quickbook-test unicode_escape-1_5 ]
[ quickbook-test unmatched_element-1_5 ]
[ quickbook-test unmatched_element-1_6 ]

View File

@ -0,0 +1,11 @@
[article Template 1.7 fail
[quickbook 1.7]
]
[/ This should fail because it's a block template called from an attribute ]
[template fail[]
Block template.]
[link this-should-[fail]]