stupid but working autolinking
This commit is contained in:
		
							parent
							
								
									73534faec9
								
							
						
					
					
						commit
						f06de3ba13
					
				
					 2 changed files with 25 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -25,4 +25,5 @@ tera = "1"
 | 
			
		|||
 | 
			
		||||
chrono = "0.4"
 | 
			
		||||
regex = "1"
 | 
			
		||||
linkify = "0.4"
 | 
			
		||||
percent-encoding = "2.1.0"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										26
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								src/main.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -9,6 +9,7 @@ use actix_web::error::ErrorInternalServerError;
 | 
			
		|||
use actix_web::{error, get, http, middleware, web, App, Error, HttpResponse, HttpServer};
 | 
			
		||||
use chrono::{DateTime, Local};
 | 
			
		||||
use clap::{App as ClapApp, Arg};
 | 
			
		||||
use linkify::LinkFinder;
 | 
			
		||||
use log::info;
 | 
			
		||||
use percent_encoding::utf8_percent_encode;
 | 
			
		||||
use pulldown_cmark::{html, Options, Parser};
 | 
			
		||||
| 
						 | 
				
			
			@ -197,8 +198,9 @@ async fn render(
 | 
			
		|||
 | 
			
		||||
fn preprocess(string: String) -> String {
 | 
			
		||||
    let double_brackets = Regex::new(r"\[\[(?P<inner>[\w .]+)\]\]").unwrap();
 | 
			
		||||
    let finder = LinkFinder::new();
 | 
			
		||||
 | 
			
		||||
    double_brackets
 | 
			
		||||
    let result = double_brackets
 | 
			
		||||
        .replace_all(string.as_str(), |caps: &Captures| {
 | 
			
		||||
            format!(
 | 
			
		||||
                "[{}]({})",
 | 
			
		||||
| 
						 | 
				
			
			@ -206,5 +208,25 @@ fn preprocess(string: String) -> String {
 | 
			
		|||
                utf8_percent_encode(&caps[1], percent_encoding::NON_ALPHANUMERIC)
 | 
			
		||||
            )
 | 
			
		||||
        })
 | 
			
		||||
        .to_string()
 | 
			
		||||
        .to_string();
 | 
			
		||||
 | 
			
		||||
    let result_vec = Vec::from(result.as_str());
 | 
			
		||||
    let start_delims = vec![b'(', b'<'];
 | 
			
		||||
    let end_delims = vec![b')', b'>'];
 | 
			
		||||
    let links = finder.links(result.as_str()).filter(|link| {
 | 
			
		||||
        (link.start() == 0 || link.end() == result.len())
 | 
			
		||||
            || (!start_delims.contains(&result_vec[link.start() - 1])
 | 
			
		||||
                && !end_delims.contains(&result_vec[link.end() + 1]))
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let mut offset = 0;
 | 
			
		||||
    let mut result_string = result.to_string();
 | 
			
		||||
    for link in links {
 | 
			
		||||
        let orig = link.as_str();
 | 
			
		||||
        let new = format!("<{}>", orig);
 | 
			
		||||
        result_string.replace_range((link.start() + offset)..(link.end() + offset), new.as_str());
 | 
			
		||||
        offset += new.len() - orig.len();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    result_string
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue