static S ai_subst_web_charBasedReplace(S webID, fS input) { int n = websMadeInThread(); Web web = assertNotNull("Web not found: " + webID, ai_getWeb(webID)); WebRelation rel = assertNotNull(web_findRelationNamed(web, "matches")); S pat = web_unquoted(rel.a), cmd = web_unquoted(rel.b); assertEquals("substitute * => * with *", pat); new Matches m; assertTrue(flexMatchIC(pat, cmd, m)); S src = $1; fS var = $3; L terms = unquoteAll(trimAll(splitAtJavaToken(m.get(1), ","))); O replacer = func(S s) { replaceIC(s, var, input) }; src = (S) callF(replacer, src); terms = map(replacer, terms); ai_postTriple_multi(src, "see:", terms); ret nWebs(websMadeInThread()-n) + " made"; }