Hex Artifact Content
Logged in as anonymous

Artifact 85ea533bba28f1935773b3afc6caf10e40237e6a7722609afdd40aaff7eef321:


0000: 75 73 65 20 63 72 61 74 65 3a 3a 43 75 72 73 6f  use crate::Curso
0010: 72 3b 0a 0a 75 73 65 20 73 74 64 3a 3a 62 6f 72  r;..use std::bor
0020: 72 6f 77 3a 3a 43 6f 77 3b 0a 0a 75 73 65 20 68  row::Cow;..use h
0030: 74 6d 6c 5f 65 73 63 61 70 65 3a 3a 65 6e 63 6f  tml_escape::enco
0040: 64 65 5f 74 65 78 74 3b 0a 75 73 65 20 6c 61 7a  de_text;.use laz
0050: 79 5f 73 74 61 74 69 63 3a 3a 6c 61 7a 79 5f 73  y_static::lazy_s
0060: 74 61 74 69 63 3b 0a 75 73 65 20 72 65 67 65 78  tatic;.use regex
0070: 3a 3a 52 65 67 65 78 3b 0a 75 73 65 20 73 74 61  ::Regex;.use sta
0080: 63 6b 65 64 5f 65 72 72 6f 72 73 3a 3a 7b 0a 09  cked_errors::{..
0090: 62 61 69 6c 2c 0a 09 52 65 73 75 6c 74 2c 0a 7d  bail,..Result,.}
00a0: 3b 0a 0a 6c 61 7a 79 5f 73 74 61 74 69 63 21 20  ;..lazy_static! 
00b0: 7b 0a 09 70 75 62 20 73 74 61 74 69 63 20 72 65  {..pub static re
00c0: 66 20 52 45 5f 44 4f 4d 41 49 4e 3a 20 52 65 67  f RE_DOMAIN: Reg
00d0: 65 78 20 3d 20 52 65 67 65 78 3a 3a 6e 65 77 28  ex = Regex::new(
00e0: 72 22 5e 5b 61 2d 7a 30 2d 39 5d 28 5b 2d 61 2d  r"^[a-z0-9]([-a-
00f0: 7a 30 2d 39 5d 2a 5b 61 2d 7a 30 2d 39 5d 29 3f  z0-9]*[a-z0-9])?
0100: 28 5c 2e 5b 61 2d 7a 30 2d 39 5d 28 5b 2d 61 2d  (\.[a-z0-9]([-a-
0110: 7a 30 2d 39 5d 2a 5b 61 2d 7a 30 2d 39 5d 29 3f  z0-9]*[a-z0-9])?
0120: 29 2a 24 22 29 2e 75 6e 77 72 61 70 28 29 3b 0a  )*$").unwrap();.
0130: 09 70 75 62 20 73 74 61 74 69 63 20 72 65 66 20  .pub static ref 
0140: 52 45 5f 43 4c 4f 53 49 4e 47 3a 20 52 65 67 65  RE_CLOSING: Rege
0150: 78 20 3d 20 52 65 67 65 78 3a 3a 6e 65 77 28 72  x = Regex::new(r
0160: 22 3c 2f 5b 20 5c 74 5d 2a 28 70 72 65 7c 63 6f  "</[ \t]*(pre|co
0170: 64 65 29 5b 20 5c 74 5d 2a 3e 22 29 2e 75 6e 77  de)[ \t]*>").unw
0180: 72 61 70 28 29 3b 0a 7d 0a 0a 2f 2f 2f 20 60 41  rap();.}../// `A
0190: 74 74 61 63 68 6d 65 6e 74 60 20 6f 62 6a 65 63  ttachment` objec
01a0: 74 20 74 6f 20 73 74 6f 72 65 20 6e 75 6d 62 65  t to store numbe
01b0: 72 20 61 74 74 61 63 68 6d 65 6e 74 20 64 61 74  r attachment dat
01c0: 61 20 61 6e 64 20 63 6f 72 72 65 73 70 6f 6e 64  a and correspond
01d0: 69 6e 67 20 66 69 6c 65 20 6e 61 6d 65 0a 23 5b  ing file name.#[
01e0: 64 65 72 69 76 65 28 44 65 62 75 67 29 5d 0a 70  derive(Debug)].p
01f0: 75 62 20 73 74 72 75 63 74 20 41 74 74 61 63 68  ub struct Attach
0200: 6d 65 6e 74 20 7b 0a 09 70 75 62 20 64 61 74 61  ment {..pub data
0210: 3a 20 43 75 72 73 6f 72 3c 56 65 63 3c 75 38 3e  : Cursor<Vec<u8>
0220: 3e 2c 0a 09 70 75 62 20 6e 61 6d 65 3a 20 53 74  >,..pub name: St
0230: 72 69 6e 67 2c 0a 7d 0a 0a 2f 2f 2f 20 50 61 73  ring,.}../// Pas
0240: 73 20 61 6e 79 20 74 65 78 74 20 68 65 72 65 20  s any text here 
0250: 74 6f 20 62 65 20 76 61 6c 69 64 61 74 65 64 20  to be validated 
0260: 61 73 20 6e 6f 74 20 62 72 65 61 6b 69 6e 67 20  as not breaking 
0270: 66 72 6f 6d 20 54 65 6c 65 67 72 61 6d 20 70 72  from Telegram pr
0280: 65 66 6f 72 6d 61 74 74 65 64 20 62 6c 6f 63 6b  eformatted block
0290: 73 0a 2f 2f 2f 20 65 73 63 61 70 65 20 61 6c 6c  s./// escape all
02a0: 20 48 54 4d 4c 20 63 68 61 72 73 20 61 66 74 65   HTML chars afte
02b0: 72 77 61 72 64 73 0a 70 75 62 20 66 6e 20 76 61  rwards.pub fn va
02c0: 6c 69 64 61 74 65 20 28 74 65 78 74 3a 20 26 73  lidate (text: &s
02d0: 74 72 29 20 2d 3e 20 52 65 73 75 6c 74 3c 43 6f  tr) -> Result<Co
02e0: 77 3c 27 5f 2c 20 73 74 72 3e 3e 20 7b 0a 09 69  w<'_, str>> {..i
02f0: 66 20 52 45 5f 43 4c 4f 53 49 4e 47 2e 69 73 5f  f RE_CLOSING.is_
0300: 6d 61 74 63 68 28 74 65 78 74 29 20 7b 0a 09 09  match(text) {...
0310: 62 61 69 6c 21 28 22 54 65 6c 65 67 72 61 6d 20  bail!("Telegram 
0320: 63 6c 6f 73 69 6e 67 20 74 61 67 20 66 6f 75 6e  closing tag foun
0330: 64 2e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  d.");..} else {.
0340: 09 09 4f 6b 28 65 6e 63 6f 64 65 5f 74 65 78 74  ..Ok(encode_text
0350: 28 74 65 78 74 29 29 0a 09 7d 0a 7d 0a           (text))..}.}.