package classes import ( "regexp" "strings" "git.golem15.com/golem15/sm-sitemap-plugin/models" ) // The PHP routes.php patterns of the frontend rewrite. var ( locElement = regexp.MustCompile(`(.*?)`) xhtmlLinkRef = regexp.MustCompile(`(]*href=")([^"]*)(")`) ) // Rewrite is the frontend_url rewrite of PHP routes.php: with frontendURL // set, backendURL is replaced literally (str_replace) inside every loc // element, inside every xhtml:link href and in the exact stylesheet href. // Both URLs are right-trimmed of slashes first. An empty frontendURL (or // "0", which PHP reads as false) leaves xml unchanged. // // PHP inserted the stored text as it was. Three rules keep that text out of // the document unless it is a plain http(s) URL (T-17-15): // // - a frontendURL that models.AllowedFrontendURL refuses leaves xml // unchanged, whatever is stored in the settings row; // - the frontend URL is inserted through EscapeText in loc and through // EscapeAttr in the hrefs. Both are the identity for every accepted // value, which keeps the PHP bytes; // - a loc or xhtml:link href whose rewritten value does not start with // http:// or https:// keeps its value. The generator applies the same // filter before the rewrite. func Rewrite(xml, backendURL, frontendURL string) string { if frontendURL == "" || frontendURL == "0" { return xml } if !models.AllowedFrontendURL(frontendURL) { return xml } frontend := strings.TrimRight(frontendURL, "/") backend := strings.TrimRight(backendURL, "/") if backend == "" { return xml } frontendText, frontendAttr := EscapeText(frontend), EscapeAttr(frontend) xml = locElement.ReplaceAllStringFunc(xml, func(m string) string { inner := m[len("") : len(m)-len("")] rewritten := strings.ReplaceAll(inner, backend, frontendText) if !httpURL(rewritten) { return m } return "" + rewritten + "" }) xml = xhtmlLinkRef.ReplaceAllStringFunc(xml, func(m string) string { sub := xhtmlLinkRef.FindStringSubmatch(m) rewritten := strings.ReplaceAll(sub[2], backend, frontendAttr) if !httpURL(rewritten) { return m } return sub[1] + rewritten + sub[3] }) return strings.ReplaceAll(xml, `href="`+backend+`/sitemap.xsl"`, `href="`+frontendAttr+`/sitemap.xsl"`) } // BackendURL is PHP rtrim(url('/'), '/') for a request whose root URL is // root: the URL the rewrite replaces. func BackendURL(root string) string { return strings.TrimRight(URLTo(root, "/"), "/") }