Hex Artifact Content
Logged in as anonymous

Artifact 448dd04db59963cc0319a4f295fcdfa6f314b1040cbb9a2c60768df41615246a:


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 6c 61 7a 79 5f 73 74 61  r;..use lazy_sta
0020: 74 69 63 3a 3a 6c 61 7a 79 5f 73 74 61 74 69 63  tic::lazy_static
0030: 3b 0a 75 73 65 20 72 65 67 65 78 3a 3a 52 65 67  ;.use regex::Reg
0040: 65 78 3b 0a 75 73 65 20 73 63 72 61 70 65 72 3a  ex;.use scraper:
0050: 3a 48 74 6d 6c 3b 0a 75 73 65 20 73 74 61 63 6b  :Html;.use stack
0060: 65 64 5f 65 72 72 6f 72 73 3a 3a 7b 0a 09 62 61  ed_errors::{..ba
0070: 69 6c 2c 0a 09 52 65 73 75 6c 74 2c 0a 7d 3b 0a  il,..Result,.};.
0080: 0a 6c 61 7a 79 5f 73 74 61 74 69 63 21 20 7b 0a  .lazy_static! {.
0090: 09 70 75 62 20 73 74 61 74 69 63 20 72 65 66 20  .pub static ref 
00a0: 52 45 5f 53 50 45 43 49 41 4c 3a 20 52 65 67 65  RE_SPECIAL: Rege
00b0: 78 20 3d 20 52 65 67 65 78 3a 3a 6e 65 77 28 72  x = Regex::new(r
00c0: 22 28 5b 5c 2d 5f 2a 5c 5b 5c 5d 28 29 7e 60 3e  "([\-_*\[\]()~`>
00d0: 23 2b 7c 7b 7d 5c 2e 21 5d 29 22 29 2e 75 6e 77  #+|{}\.!])").unw
00e0: 72 61 70 28 29 3b 0a 09 70 75 62 20 73 74 61 74  rap();..pub stat
00f0: 69 63 20 72 65 66 20 52 45 5f 44 4f 4d 41 49 4e  ic ref RE_DOMAIN
0100: 3a 20 52 65 67 65 78 20 3d 20 52 65 67 65 78 3a  : Regex = Regex:
0110: 3a 6e 65 77 28 72 22 5e 5b 61 2d 7a 30 2d 39 5d  :new(r"^[a-z0-9]
0120: 28 5b 2d 61 2d 7a 30 2d 39 5d 2a 5b 61 2d 7a 30  ([-a-z0-9]*[a-z0
0130: 2d 39 5d 29 3f 28 5c 2e 5b 61 2d 7a 30 2d 39 5d  -9])?(\.[a-z0-9]
0140: 28 5b 2d 61 2d 7a 30 2d 39 5d 2a 5b 61 2d 7a 30  ([-a-z0-9]*[a-z0
0150: 2d 39 5d 29 3f 29 2a 24 22 29 2e 75 6e 77 72 61  -9])?)*$").unwra
0160: 70 28 29 3b 0a 7d 0a 0a 2f 2f 2f 20 60 41 74 74  p();.}../// `Att
0170: 61 63 68 6d 65 6e 74 60 20 6f 62 6a 65 63 74 20  achment` object 
0180: 74 6f 20 73 74 6f 72 65 20 6e 75 6d 62 65 72 20  to store number 
0190: 61 74 74 61 63 68 6d 65 6e 74 20 64 61 74 61 20  attachment data 
01a0: 61 6e 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  and correspondin
01b0: 67 20 66 69 6c 65 20 6e 61 6d 65 0a 23 5b 64 65  g file name.#[de
01c0: 72 69 76 65 28 44 65 62 75 67 29 5d 0a 70 75 62  rive(Debug)].pub
01d0: 20 73 74 72 75 63 74 20 41 74 74 61 63 68 6d 65   struct Attachme
01e0: 6e 74 20 7b 0a 09 70 75 62 20 64 61 74 61 3a 20  nt {..pub data: 
01f0: 43 75 72 73 6f 72 3c 56 65 63 3c 75 38 3e 3e 2c  Cursor<Vec<u8>>,
0200: 0a 09 70 75 62 20 6e 61 6d 65 3a 20 53 74 72 69  ..pub name: Stri
0210: 6e 67 2c 0a 7d 0a 0a 2f 2f 2f 20 50 61 73 73 20  ng,.}../// Pass 
0220: 61 6e 79 20 74 65 78 74 20 68 65 72 65 20 74 6f  any text here to
0230: 20 62 65 20 76 61 6c 69 64 61 74 65 64 20 61 73   be validated as
0240: 20 48 54 4d 4c 2c 20 62 72 65 61 6b 73 20 6f 6e   HTML, breaks on
0250: 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 72 72 6f   validation erro
0260: 72 73 0a 70 75 62 20 66 6e 20 76 61 6c 69 64 61  rs.pub fn valida
0270: 74 65 20 28 74 65 78 74 3a 20 26 73 74 72 29 20  te (text: &str) 
0280: 2d 3e 20 52 65 73 75 6c 74 3c 26 73 74 72 3e 20  -> Result<&str> 
0290: 7b 0a 09 6c 65 74 20 66 72 61 67 6d 65 6e 74 20  {..let fragment 
02a0: 3d 20 48 74 6d 6c 3a 3a 70 61 72 73 65 5f 66 72  = Html::parse_fr
02b0: 61 67 6d 65 6e 74 28 74 65 78 74 29 3b 0a 09 69  agment(text);..i
02c0: 66 20 21 66 72 61 67 6d 65 6e 74 2e 65 72 72 6f  f !fragment.erro
02d0: 72 73 2e 69 73 5f 65 6d 70 74 79 28 29 20 7b 0a  rs.is_empty() {.
02e0: 09 09 62 61 69 6c 21 28 66 72 61 67 6d 65 6e 74  ..bail!(fragment
02f0: 2e 65 72 72 6f 72 73 2e 6a 6f 69 6e 28 22 5c 6e  .errors.join("\n
0300: 22 29 29 3b 0a 09 7d 0a 09 4f 6b 28 74 65 78 74  "));..}..Ok(text
0310: 29 0a 7d 0a                                      ).}.