adamc@821: type t = Basis.string adamc@821: adamc@1023: val str = Basis.str1 adamc@1023: adamc@828: val length = Basis.strlen adam@1388: val lengthGe = Basis.strlenGe adamc@828: val append = Basis.strcat adamc@828: adamc@821: val sub = Basis.strsub adamc@821: val suffix = Basis.strsuffix adamc@829: adamc@829: val index = Basis.strindex adam@1390: fun sindex r = Basis.strsindex r.Haystack r.Needle adamc@829: val atFirst = Basis.strchr adamc@829: adamc@1272: fun mindex {Haystack = s, Needle = chs} = adamc@1272: let adamc@1272: val n = Basis.strcspn s chs adamc@1272: in adamc@1272: if n >= length s then adamc@1272: None adamc@1272: else adamc@1272: Some n adamc@1272: end adamc@831: adamc@829: fun substring s {Start = start, Len = len} = Basis.substring s start len adamc@829: adam@1389: fun seek s ch = adam@1389: case index s ch of adam@1389: None => None adam@1389: | Some i => Some (suffix s (i + 1)) adam@1389: fun mseek {Haystack = s, Needle = chs} = adam@1389: case mindex {Haystack = s, Needle = chs} of adam@1389: None => None adam@1389: | Some i => Some (sub s i, suffix s (i + 1)) adam@1389: adamc@829: fun split s ch = adamc@829: case index s ch of adamc@829: None => None adamc@829: | Some i => Some (substring s {Start = 0, Len = i}, adam@1389: suffix s (i + 1)) adam@1389: fun split' s ch = adam@1389: case index s ch of adam@1389: None => None adam@1389: | Some i => Some (substring s {Start = 0, Len = i}, adam@1389: suffix s i) adamc@831: fun msplit {Haystack = s, Needle = chs} = adamc@831: case mindex {Haystack = s, Needle = chs} of adamc@831: None => None adamc@831: | Some i => Some (substring s {Start = 0, Len = i}, adamc@831: sub s i, adam@1389: suffix s (i + 1)) adamc@1057: adam@1390: fun ssplit r = adam@1390: case sindex r of adam@1390: None => None adam@1390: | Some i => Some (substring r.Haystack {Start = 0, Len = i}, adam@1390: suffix r.Haystack (i + length r.Needle)) adam@1390: adamc@1057: fun all f s = adamc@1057: let adamc@1057: val len = length s adamc@1057: adamc@1057: fun al i = adamc@1057: i >= len adamc@1057: || (f (sub s i) && al (i + 1)) adamc@1057: in adamc@1057: al 0 adamc@1057: end adamc@1122: adamc@1131: fun mp f s = adamc@1131: let adamc@1131: fun mp' i acc = adamc@1131: if i < 0 then adamc@1131: acc adamc@1131: else adamc@1131: mp' (i - 1) (str (f (sub s i)) ^ acc) adamc@1131: in adamc@1131: mp' (length s - 1) "" adamc@1131: end adamc@1131: adam@1304: fun newlines [ctx] [[Body] ~ ctx] (s : string) : xml ([Body] ++ ctx) [] [] = adamc@1122: case split s #"\n" of adamc@1122: None => cdata s adamc@1122: | Some (s1, s2) => {[s1]}
{newlines s2}
adamc@1174: adamc@1174: fun isPrefix {Full = f, Prefix = p} = adamc@1174: length f >= length p && substring f {Start = 0, Len = length p} = p adam@2021: adam@2021: fun trim s = adam@2021: let adam@2021: val len = length s adam@2021: adam@2021: fun findStart i = adam@2022: if i < len && isspace (sub s i) then adam@2021: findStart (i+1) adam@2021: else adam@2021: i adam@2021: adam@2021: fun findFinish i = adam@2022: if i >= 0 && isspace (sub s i) then adam@2021: findFinish (i-1) adam@2021: else adam@2021: i adam@2021: adam@2021: val start = findStart 0 adam@2021: val finish = findFinish (len - 1) adam@2021: in adam@2021: if finish >= start then adam@2021: substring s {Start = start, Len = finish - start + 1} adam@2021: else adam@2021: "" adam@2021: end