-- simple replacements demo
function span_text(class, str)
  return string.format("
%s
", class, str)
end
function wobble_text(str)
  return span_text("wobble", str)
end
function explode_text(str)
  return span_text("explode", str)
end
function psy_text(str)
  return string.format("%s", str)
end
function red_text(str)
  return string.format("%s", str)
end
function pre_text(str)
  str = str:gsub("%(", "(")
  str = str:gsub("%)", ")")
  str = str:gsub("%[", "[")
  str = str:gsub("\\", "\")
  str = str:gsub("/", "/")
  str = str:gsub("%]", "]")
  str = str:gsub("=", "=")
  str = str:gsub("@", "@")
  return span_text("code", str:gsub("%|", "|"))
end
-- generate extra markup
function memeposting(body, prefix)
  body = string.gsub(body, "`(.-)`", pre_text)
  body = string.gsub(body, "%(%(%((.-)%)%)%)", function(str) return string.format("%s
", prefix, str) end)
  body = string.gsub(body, "|(.-)|", wobble_text)
  body = string.gsub(body, "==(.-)==", red_text)
  body = string.gsub(body, "@@(.-)@@", psy_text)
  body = string.gsub(body, "//(.-)\\\\", explode_text)
  body = string.gsub(body, "/@(.-)@\\", psy_text)
  return body
end