class Text toColor: (text, saturation=30, lightness=50) -> hash = 0 for i in [0..text.length-1] hash += text.charCodeAt(i)*i hash = hash % 1777 return "hsl(" + (hash % 360) + ",#{saturation}%,#{lightness}%)"; renderMarked: (text, options={}) -> options["gfm"] = true options["breaks"] = true options["sanitize"] = true options["renderer"] = marked_renderer text = marked(text, options) return @fixHtmlLinks text emailLinks: (text) -> return text.replace(/([a-zA-Z0-9]+)@zeroid.bit/g, "$1@zeroid.bit") # Convert zeronet html links to relaitve fixHtmlLinks: (text) -> if window.is_proxy return text.replace(/href="http:\/\/(127.0.0.1|localhost):43110/g, 'href="http://zero') else return text.replace(/href="http:\/\/(127.0.0.1|localhost):43110/g, 'href="') # Convert a single link to relative fixLink: (link) -> if window.is_proxy back = link.replace(/http:\/\/(127.0.0.1|localhost):43110/, 'http://zero') return back.replace(/http:\/\/zero\/([^\/]+\.bit)/, "http://$1") # Domain links else return link.replace(/http:\/\/(127.0.0.1|localhost):43110/, '') toUrl: (text) -> return text.replace(/[^A-Za-z0-9]/g, "+").replace(/[+]+/g, "+").replace(/[+]+$/, "") getSiteUrl: (address) -> if window.is_proxy if "." in address # Domain return "http://"+address+"/" else return "http://zero/"+address+"/" else return "/"+address+"/" fixReply: (text) -> return text.replace(/(>.*\n)([^\n>])/gm, "$1\n$2") toBitcoinAddress: (text) -> return text.replace(/[^A-Za-z0-9]/g, "") jsonEncode: (obj) -> return unescape(encodeURIComponent(JSON.stringify(obj))) jsonDecode: (obj) -> return JSON.parse(decodeURIComponent(escape(obj))) fileEncode: (obj) -> if typeof(obj) == "string" return btoa(unescape(encodeURIComponent(obj))) else return btoa(unescape(encodeURIComponent(JSON.stringify(obj, undefined, '\t')))) utf8Encode: (s) -> return unescape(encodeURIComponent(s)) utf8Decode: (s) -> return decodeURIComponent(escape(s)) distance: (s1, s2) -> s1 = s1.toLocaleLowerCase() s2 = s2.toLocaleLowerCase() next_find_i = 0 next_find = s2[0] match = true extra_parts = {} for char in s1 if char != next_find if extra_parts[next_find_i] extra_parts[next_find_i] += char else extra_parts[next_find_i] = char else next_find_i++ next_find = s2[next_find_i] if extra_parts[next_find_i] extra_parts[next_find_i] = "" # Extra chars on the end doesnt matter extra_parts = (val for key, val of extra_parts) if next_find_i >= s2.length return extra_parts.length + extra_parts.join("").length else return false parseQuery: (query) -> params = {} parts = query.split('&') for part in parts [key, val] = part.split("=") if val params[decodeURIComponent(key)] = decodeURIComponent(val) else params["url"] = decodeURIComponent(key) return params encodeQuery: (params) -> back = [] if params.url back.push(params.url) for key, val of params if not val or key == "url" continue back.push("#{encodeURIComponent(key)}=#{encodeURIComponent(val)}") return back.join("&") highlight: (text, search) -> if not text return [""] parts = text.split(RegExp(search, "i")) back = [] for part, i in parts back.push(part) if i < parts.length-1 back.push(h("span.highlight", {key: i}, search)) return back formatSize: (size) -> if isNaN(parseInt(size)) return "" size_mb = size/1024/1024 if size_mb >= 1000 return (size_mb/1024).toFixed(1)+" GB" else if size_mb >= 100 return size_mb.toFixed(0)+" MB" else if size/1024 >= 1000 return size_mb.toFixed(2)+" MB" else return (parseInt(size)/1024).toFixed(2)+" KB" window.is_proxy = (document.location.host == "zero" or window.location.pathname == "/") window.Text = new Text()