Only allow phrase templates in attribute values. Refs #2035.
[SVN r86683]
This commit is contained in:
parent
02d70c0524
commit
0ec1072eb3
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -15,6 +15,7 @@ namespace quickbook
|
||||
{
|
||||
QUICKBOOK_VALUE_TAGS(template_tags, 0x100,
|
||||
(template_)
|
||||
(attribute_template)
|
||||
(escape)
|
||||
(identifier)
|
||||
(block)
|
||||
|
@ -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 ]
|
||||
|
11
test/templates-1_7-fail2.quickbook
Normal file
11
test/templates-1_7-fail2.quickbook
Normal 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]]
|
Loading…
Reference in New Issue
Block a user