Switch to putting radio targets in the global settings instead of the context tree.
This commit is contained in:
@@ -95,8 +95,9 @@ fn document_org_source<'b, 'g, 'r, 's>(
|
||||
.map(|rt| &rt.children)
|
||||
.collect();
|
||||
if !all_radio_targets.is_empty() {
|
||||
let parser_context = ContextElement::RadioTarget(all_radio_targets);
|
||||
let parser_context = context.with_additional_node(&parser_context);
|
||||
let mut new_global_settings = context.get_global_settings().clone();
|
||||
new_global_settings.radio_targets = all_radio_targets;
|
||||
let parser_context = context.with_global_settings(&new_global_settings);
|
||||
let (remaining, document) = _document(&parser_context, input)
|
||||
.map(|(rem, out)| (Into::<&str>::into(rem), out))?;
|
||||
return Ok((remaining.into(), document));
|
||||
|
||||
@@ -27,14 +27,7 @@ pub fn radio_link<'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
) -> Res<OrgSource<'s>, RadioLink<'s>> {
|
||||
let radio_targets = context
|
||||
.iter()
|
||||
.filter_map(|context_element| match context_element {
|
||||
ContextElement::RadioTarget(targets) => Some(targets),
|
||||
_ => None,
|
||||
})
|
||||
.flatten();
|
||||
for radio_target in radio_targets {
|
||||
for radio_target in &context.get_global_settings().radio_targets {
|
||||
let rematched_target = rematch_target(context, radio_target, input);
|
||||
if let Ok((remaining, rematched_target)) = rematched_target {
|
||||
let (remaining, _) = space0(remaining)?;
|
||||
@@ -149,12 +142,14 @@ mod tests {
|
||||
fn plain_text_radio_target() {
|
||||
let input = OrgSource::new("foo bar baz");
|
||||
let radio_target_match = vec![Object::PlainText(PlainText { source: "bar" })];
|
||||
let global_settings = GlobalSettings::default();
|
||||
let global_settings = {
|
||||
let mut global_settings = GlobalSettings::default();
|
||||
global_settings.radio_targets = vec![&radio_target_match];
|
||||
global_settings
|
||||
};
|
||||
let initial_context = ContextElement::document_context();
|
||||
let initial_context = Context::new(&global_settings, List::new(&initial_context));
|
||||
let document_context = ContextElement::RadioTarget(vec![&radio_target_match]);
|
||||
let document_context = initial_context.with_additional_node(&document_context);
|
||||
let paragraph_matcher = parser_with_context!(element(true))(&document_context);
|
||||
let paragraph_matcher = parser_with_context!(element(true))(&initial_context);
|
||||
let (remaining, first_paragraph) = paragraph_matcher(input).expect("Parse first paragraph");
|
||||
let first_paragraph = match first_paragraph {
|
||||
Element::Paragraph(paragraph) => paragraph,
|
||||
@@ -182,12 +177,14 @@ mod tests {
|
||||
source: "*bar*",
|
||||
children: vec![Object::PlainText(PlainText { source: "bar" })],
|
||||
})];
|
||||
let global_settings = GlobalSettings::default();
|
||||
let global_settings = {
|
||||
let mut global_settings = GlobalSettings::default();
|
||||
global_settings.radio_targets = vec![&radio_target_match];
|
||||
global_settings
|
||||
};
|
||||
let initial_context = ContextElement::document_context();
|
||||
let initial_context = Context::new(&global_settings, List::new(&initial_context));
|
||||
let document_context = ContextElement::RadioTarget(vec![&radio_target_match]);
|
||||
let document_context = initial_context.with_additional_node(&document_context);
|
||||
let paragraph_matcher = parser_with_context!(element(true))(&document_context);
|
||||
let paragraph_matcher = parser_with_context!(element(true))(&initial_context);
|
||||
let (remaining, first_paragraph) =
|
||||
paragraph_matcher(input.into()).expect("Parse first paragraph");
|
||||
let first_paragraph = match first_paragraph {
|
||||
|
||||
Reference in New Issue
Block a user