diff options
Diffstat (limited to 'src/content')
| -rw-r--r-- | src/content/document.rs | 105 | 
1 files changed, 13 insertions, 92 deletions
| diff --git a/src/content/document.rs b/src/content/document.rs index cc83415..2c340f2 100644 --- a/src/content/document.rs +++ b/src/content/document.rs @@ -9,7 +9,7 @@  //! *   [List][crate::construct::list]  use crate::parser::ParseState; -use crate::subtokenize::subtokenize; +use crate::subtokenize::{divide_events, subtokenize};  use crate::token::Token;  use crate::tokenizer::{      Container, ContainerState, ContentType, Event, EventType, Link, Point, State, StateName, @@ -550,101 +550,22 @@ fn exit_containers(tokenizer: &mut Tokenizer, phase: &Phase) {  // Inject the container events.  fn resolve(tokenizer: &mut Tokenizer) {      let mut child = tokenizer.tokenize_state.child_tokenizer.take().unwrap(); -    child.map.consume(&mut child.events);      // To do: see if we can do this less.      tokenizer.map.consume(&mut tokenizer.events); -    let mut link_index = skip::to(&tokenizer.events, 0, &[Token::Data]); -    // To do: share this code with `subtokenize`. -    // Now, loop through all subevents to figure out which parts -    // belong where and fix deep links. -    let mut subindex = 0; -    let mut slices = vec![]; -    let mut slice_start = 0; -    let mut old_prev: Option<usize> = None; - -    while subindex < child.events.len() { -        // Find the first event that starts after the end we’re looking -        // for. -        if child.events[subindex].event_type == EventType::Enter -            && child.events[subindex].point.index >= tokenizer.events[link_index + 1].point.index -        { -            slices.push((link_index, slice_start)); -            slice_start = subindex; -            link_index = tokenizer.events[link_index] -                .link -                .as_ref() -                .unwrap() -                .next -                .unwrap(); -        } - -        // Fix sublinks. -        if let Some(sublink_curr) = &child.events[subindex].link { -            if sublink_curr.previous.is_some() { -                let old_prev = old_prev.unwrap(); -                let prev_event = &mut child.events[old_prev]; -                // The `index` in `events` where the current link is, -                // minus one to get the previous link, -                // minus 2 events (the enter and exit) for each removed -                // link. -                let new_link = if slices.is_empty() { -                    old_prev + link_index + 2 -                } else { -                    old_prev + link_index - (slices.len() - 1) * 2 -                }; -                prev_event.link.as_mut().unwrap().next = Some(new_link); -            } -        } - -        // If there is a `next` link in the subevents, we have to change -        // its `previous` index to account for the shifted events. -        // If it points to a next event, we also change the next event’s -        // reference back to *this* event. -        if let Some(sublink_curr) = &child.events[subindex].link { -            if let Some(next) = sublink_curr.next { -                let sublink_next = child.events[next].link.as_mut().unwrap(); - -                old_prev = sublink_next.previous; - -                sublink_next.previous = sublink_next -                    .previous -                    // The `index` in `events` where the current link is, -                    // minus 2 events (the enter and exit) for each removed -                    // link. -                    .map(|previous| previous + link_index - (slices.len() * 2)); -            } -        } +    divide_events( +        &mut tokenizer.map, +        &tokenizer.events, +        skip::to(&tokenizer.events, 0, &[Token::Data]), +        &mut child.events, +    ); -        subindex += 1; -    } - -    if !child.events.is_empty() { -        slices.push((link_index, slice_start)); -    } - -    // Finally, inject the subevents. -    let mut index = slices.len(); - -    while index > 0 { -        index -= 1; -        let start = slices[index].0; -        tokenizer.map.add( -            start, -            if start == tokenizer.events.len() { -                0 -            } else { -                2 -            }, -            child.events.split_off(slices[index].1), -        ); -    } -    // To do: share the above code with `subtokenize`. - -    let mut resolvers = child.resolvers.split_off(0); -    let mut resolver_ids = child.resolver_ids.split_off(0); -    tokenizer.resolvers.append(&mut resolvers); -    tokenizer.resolver_ids.append(&mut resolver_ids); +    tokenizer +        .resolvers +        .append(&mut child.resolvers.split_off(0)); +    tokenizer +        .resolver_ids +        .append(&mut child.resolver_ids.split_off(0));      // To do: see if we can do this less.      tokenizer.map.consume(&mut tokenizer.events); | 
