1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
/* * text.rs * * ftml - Library to parse Wikidot code * Copyright (C) 2019-2020 Ammon Smith * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ use crate::ExtractedToken; /// Wrapper for the input string that was tokenized. /// /// This structure does not expose the internal string (preventing weird ad-hoc /// or hack parsing), but permits joining adjacent `ExtractedToken` string slices /// by selecting from the original text source. #[derive(Debug, Copy, Clone)] pub struct FullText<'t> { text: &'t str, } impl<'t> FullText<'t> { #[inline] pub fn new(text: &'t str) -> Self { FullText { text } } /// Slices from the given start to end token. /// /// # Panics /// If the ending token does not come after the first, or if /// the slices specified are out of range for the string (unlikely), /// this function will panic. pub fn slice( &self, log: &slog::Logger, start_token: &ExtractedToken, end_token: &ExtractedToken, ) -> &'t str { let start = start_token.span.start; let end = end_token.span.end; debug!( log, "Extracting slice from full text"; "start" => start, "end" => end, ); if start > end { panic!( "Starting index is later than the ending index: {} > {}", start, end, ); } &self.text[start..end] } }