Skip to content

Instantly share code, notes, and snippets.

@Odie
Created April 4, 2018 15:24
Show Gist options
  • Save Odie/967d452c263d5a61aec433bdfd3df54e to your computer and use it in GitHub Desktop.
Save Odie/967d452c263d5a61aec433bdfd3df54e to your computer and use it in GitHub Desktop.
(ns bbcode-obfuscator)
(defn opening-tag [tag-name]
(format "[%s]" tag-name))
(defn closing-tag [tag-name]
(format "[/%s]" tag-name))
(defn tag-info [tag-name]
{:name tag-name
:open (opening-tag tag-name)
:close (closing-tag tag-name)})
(def tags
(for [tag ["b" "i" "u"]]
(tag-info tag)))
(defn pick-tag-to-add [opened-tags]
(let [tag (rand-nth tags)]
(if-not (contains? opened-tags tag)
[(:open tag) (conj opened-tags tag)]
[(:close tag) (disj opened-tags tag)])))
(defn close-open-tags [opened-tags]
(->> opened-tags
(map :close)
(apply str)))
(defn mut-str
[string]
(if (clojure.string/blank? string)
string
(let [state (reduce (fn [state character]
(let [[tag-text opened-tags] (pick-tag-to-add (:opened-tags state))]
(-> state
(assoc :result
(if (java.lang.Character/isWhitespace character)
(str tag-text (:result state))
(str (:result state) tag-text character)))
(assoc :opened-tags opened-tags))))
{:result nil
:opened-tags #{}}
(seq string))]
(str (:result state) (close-open-tags (:opened-tags state))))))
(comment
(mut-str "Obfuscated")
;=> "[b]O[/b]b[b]f[i]u[u]s[/i]c[i]a[/u]t[/i]e[u]d[/u][/b]"
(mut-str "O b f u s c a t e d")
;=> [i][/i][/i][i][i][/i][/i][b][/u][u]O[i]b[/b]f[i]u[b]s[/i]c[/b]a[i]t[b]e[/b]d[/i]
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment