require 'vendor/sinatra/lib/sinatra.rb'
require 'vendor/hpricot/lib/hpricot.rb'
require 'lib/hpricot_text_gsub.rb'
# FIXME: Accept HTML5 Elements
# FIXME: Ignore <?php ?> <%= %> etc.
# TODO: Typographic quotes toggling
def entityReplace(el, typographic_quotes)
el.text_gsub! /&/, '&'
el.text_gsub! /&amp;/, '&' # Hacky workaround
el.text_gsub! /"/, '"'
el.text_gsub! /</, '<'
el.text_gsub! />/, '>'
el.text_gsub! /¡/, '¡'
el.text_gsub! /¢/, '¢'
el.text_gsub! /£/, '£'
el.text_gsub! /¤/, '¤'
el.text_gsub! /¥/, '¥'
el.text_gsub! /¦/, '¦'
el.text_gsub! /§/, '§'
el.text_gsub! /¨/, '¨'
el.text_gsub! /©/, '©'
el.text_gsub! /ª/, 'ª'
el.text_gsub! /«/, '«'
el.text_gsub! /¬/, '¬'
el.text_gsub! /®/, '®'
el.text_gsub! /¯/, '¯'
el.text_gsub! /°/, '°'
el.text_gsub! /±/, '±'
el.text_gsub! /²/, '²'
el.text_gsub! /³/, '³'
el.text_gsub! /´/, '´'
el.text_gsub! /µ/, 'µ'
el.text_gsub! /¶/, '¶'
el.text_gsub! /·/, '·'
el.text_gsub! /¸/, '¸'
el.text_gsub! /¹/, '¹'
el.text_gsub! /º/, 'º'
el.text_gsub! /»/, '»'
el.text_gsub! /¼/, '¼'
el.text_gsub! /½/, '½'
el.text_gsub! /¾/, '¾'
el.text_gsub! /¿/, '¿'
el.text_gsub! /À/, 'À'
el.text_gsub! /Á/, 'Á'
el.text_gsub! /Â/, 'Â'
el.text_gsub! /Ã/, 'Ã'
el.text_gsub! /Ä/, 'Ä'
el.text_gsub! /Å/, 'Å'
el.text_gsub! /Æ/, 'Æ'
el.text_gsub! /Ç/, 'Ç'
el.text_gsub! /È/, 'È'
el.text_gsub! /É/, 'É'
el.text_gsub! /Ê/, 'Ê'
el.text_gsub! /Ë/, 'Ë'
el.text_gsub! /Ì/, 'Ì'
el.text_gsub! /Í/, 'Í'
el.text_gsub! /Î/, 'Î'
el.text_gsub! /Ï/, 'Ï'
el.text_gsub! /Ð/, 'Ð'
el.text_gsub! /Ñ/, 'Ñ'
el.text_gsub! /Ò/, 'Ò'
el.text_gsub! /Ó/, 'Ó'
el.text_gsub! /Ô/, 'Ô'
el.text_gsub! /Õ/, 'Õ'
el.text_gsub! /Ö/, 'Ö'
el.text_gsub! /×/, '×'
el.text_gsub! /Ø/, 'Ø'
el.text_gsub! /Ù/, 'Ù'
el.text_gsub! /Ú/, 'Ú'
el.text_gsub! /Û/, 'Û'
el.text_gsub! /Ü/, 'Ü'
el.text_gsub! /Ý/, 'Ý'
el.text_gsub! /Þ/, 'Þ'
el.text_gsub! /ß/, 'ß'
el.text_gsub! /à/, 'à'
el.text_gsub! /á/, 'á'
el.text_gsub! /â/, 'â'
el.text_gsub! /ã/, 'ã'
el.text_gsub! /ä/, 'ä'
el.text_gsub! /å/, 'å'
el.text_gsub! /æ/, 'æ'
el.text_gsub! /ç/, 'ç'
el.text_gsub! /è/, 'è'
el.text_gsub! /é/, 'é'
el.text_gsub! /ê/, 'ê'
el.text_gsub! /ë/, 'ë'
el.text_gsub! /ì/, 'ì'
el.text_gsub! /í/, 'í'
el.text_gsub! /î/, 'î'
el.text_gsub! /ï/, 'ï'
el.text_gsub! /ð/, 'ð'
el.text_gsub! /ñ/, 'ñ'
el.text_gsub! /ò/, 'ò'
el.text_gsub! /ó/, 'ó'
el.text_gsub! /ô/, 'ô'
el.text_gsub! /õ/, 'õ'
el.text_gsub! /ö/, 'ö'
el.text_gsub! /÷/, '÷'
el.text_gsub! /ø/, 'ø'
el.text_gsub! /ù/, 'ù'
el.text_gsub! /ú/, 'ú'
el.text_gsub! /û/, 'û'
el.text_gsub! /ü/, 'ü'
el.text_gsub! /ý/, 'ý'
el.text_gsub! /þ/, 'þ'
el.text_gsub! /ÿ/, 'ÿ'
el.text_gsub! /Œ/, 'Œ'
el.text_gsub! /œ/, 'œ'
el.text_gsub! /Š/, 'Š'
el.text_gsub! /š/, 'š'
el.text_gsub! /Ÿ/, 'Ÿ'
el.text_gsub! /ƒ/, 'ƒ'
el.text_gsub! /ˆ/, 'ˆ'
el.text_gsub! /˜/, '˜'
el.text_gsub! /Α/, 'Α'
el.text_gsub! /Β/, 'Β'
el.text_gsub! /Γ/, 'Γ'
el.text_gsub! /Δ/, 'Δ'
el.text_gsub! /Ε/, 'Ε'
el.text_gsub! /Ζ/, 'Ζ'
el.text_gsub! /Η/, 'Η'
el.text_gsub! /Θ/, 'Θ'
el.text_gsub! /Ι/, 'Ι'
el.text_gsub! /Κ/, 'Κ'
el.text_gsub! /Λ/, 'Λ'
el.text_gsub! /Μ/, 'Μ'
el.text_gsub! /Ν/, 'Ν'
el.text_gsub! /Ξ/, 'Ξ'
el.text_gsub! /Ο/, 'Ο'
el.text_gsub! /Π/, 'Π'
el.text_gsub! /Ρ/, 'Ρ'
el.text_gsub! /Σ/, 'Σ'
el.text_gsub! /Τ/, 'Τ'
el.text_gsub! /Υ/, 'Υ'
el.text_gsub! /Φ/, 'Φ'
el.text_gsub! /Χ/, 'Χ'
el.text_gsub! /Ψ/, 'Ψ'
el.text_gsub! /Ω/, 'Ω'
el.text_gsub! /α/, 'α'
el.text_gsub! /β/, 'β'
el.text_gsub! /γ/, 'γ'
el.text_gsub! /δ/, 'δ'
el.text_gsub! /ε/, 'ε'
el.text_gsub! /ζ/, 'ζ'
el.text_gsub! /η/, 'η'
el.text_gsub! /θ/, 'θ'
el.text_gsub! /ι/, 'ι'
el.text_gsub! /κ/, 'κ'
el.text_gsub! /λ/, 'λ'
el.text_gsub! /μ/, 'μ'
el.text_gsub! /ν/, 'ν'
el.text_gsub! /ξ/, 'ξ'
el.text_gsub! /ο/, 'ο'
el.text_gsub! /π/, 'π'
el.text_gsub! /ρ/, 'ρ'
el.text_gsub! /ς/, 'ς'
el.text_gsub! /σ/, 'σ'
el.text_gsub! /τ/, 'τ'
el.text_gsub! /υ/, 'υ'
el.text_gsub! /φ/, 'φ'
el.text_gsub! /χ/, 'χ'
el.text_gsub! /ψ/, 'ψ'
el.text_gsub! /ω/, 'ω'
el.text_gsub! /ϑ/, 'ϑ'
el.text_gsub! /ϒ/, 'ϒ'
el.text_gsub! /ϖ/, 'ϖ'
el.text_gsub! /–/, '–'
el.text_gsub! /—/, '—'
if typographic_quotes
el.text_gsub! /‘/, '‘'
el.text_gsub! /’/, '’'
el.text_gsub! /“/, '“'
el.text_gsub! /”/, '”'
else
el.text_gsub! /‘/, '"'
el.text_gsub! /’/, '"'
el.text_gsub! /“/, '"'
el.text_gsub! /”/, '"'
end
el.text_gsub! /‚/, '‚'
el.text_gsub! /„/, '„'
el.text_gsub! /†/, '†'
el.text_gsub! /‡/, '‡'
el.text_gsub! /•/, '•'
el.text_gsub! /…/, '…'
el.text_gsub! /‰/, '‰'
el.text_gsub! /′/, '′'
el.text_gsub! /″/, '″'
el.text_gsub! /‹/, '‹'
el.text_gsub! /›/, '›'
el.text_gsub! /‾/, '‾'
el.text_gsub! /⁄/, '⁄'
el.text_gsub! /€/, '€'
el.text_gsub! /ℑ/, 'ℑ'
el.text_gsub! /℘/, '℘'
el.text_gsub! /ℜ/, 'ℜ'
el.text_gsub! /™/, '™'
el.text_gsub! /ℵ/, 'ℵ'
el.text_gsub! /←/, '←'
el.text_gsub! /↑/, '↑'
el.text_gsub! /→/, '→'
el.text_gsub! /↓/, '↓'
el.text_gsub! /↔/, '↔'
el.text_gsub! /↵/, '↵'
el.text_gsub! /⇐/, '⇐'
el.text_gsub! /⇑/, '⇑'
el.text_gsub! /⇒/, '⇒'
el.text_gsub! /⇓/, '⇓'
el.text_gsub! /⇔/, '⇔'
el.text_gsub! /∀/, '∀'
el.text_gsub! /∂/, '∂'
el.text_gsub! /∃/, '∃'
el.text_gsub! /∅/, '∅'
el.text_gsub! /∇/, '∇'
el.text_gsub! /∈/, '∈'
el.text_gsub! /∉/, '∉'
el.text_gsub! /∋/, '∋'
el.text_gsub! /∏/, '∏'
el.text_gsub! /∑/, '∑'
el.text_gsub! /−/, '−'
el.text_gsub! /∗/, '∗'
el.text_gsub! /√/, '√'
el.text_gsub! /∝/, '∝'
el.text_gsub! /∞/, '∞'
el.text_gsub! /∠/, '∠'
el.text_gsub! /∧/, '∧'
el.text_gsub! /∨/, '∨'
el.text_gsub! /∩/, '∩'
el.text_gsub! /∪/, '∪'
el.text_gsub! /∫/, '∫'
el.text_gsub! /∴/, '∴'
el.text_gsub! /∼/, '∼'
el.text_gsub! /≅/, '≅'
el.text_gsub! /≈/, '≈'
el.text_gsub! /≠/, '≠'
el.text_gsub! /≡/, '≡'
el.text_gsub! /≤/, '≤'
el.text_gsub! /≥/, '≥'
el.text_gsub! /⊂/, '⊂'
el.text_gsub! /⊃/, '⊃'
el.text_gsub! /⊄/, '⊄'
el.text_gsub! /⊆/, '⊆'
el.text_gsub! /⊇/, '⊇'
el.text_gsub! /⊕/, '⊕'
el.text_gsub! /⊗/, '⊗'
el.text_gsub! /⊥/, '⊥'
el.text_gsub! /⋅/, '⋅'
el.text_gsub! /⌈/, '⌈'
el.text_gsub! /⌉/, '⌉'
el.text_gsub! /⌊/, '⌊'
el.text_gsub! /⌋/, '⌋'
el.text_gsub! /〈/, '⟨'
el.text_gsub! /〉/, '⟩'
el.text_gsub! /◊/, '◊'
el.text_gsub! /♠/, '♠'
el.text_gsub! /♣/, '♣'
el.text_gsub! /♥/, '♥'
el.text_gsub! /♦/, '♦'
end
def textReplace(str, typographic_quotes = nil)
str.gsub! /&/, '&'
str.gsub! /&amp;/, '&'
str.gsub! /"/, '"'
str.gsub! /</, '<'
str.gsub! />/, '>'
str.gsub! /¡/, '¡'
str.gsub! /¢/, '¢'
str.gsub! /£/, '£'
str.gsub! /¤/, '¤'
str.gsub! /¥/, '¥'
str.gsub! /¦/, '¦'
str.gsub! /§/, '§'
str.gsub! /¨/, '¨'
str.gsub! /©/, '©'
str.gsub! /ª/, 'ª'
str.gsub! /«/, '«'
str.gsub! /¬/, '¬'
str.gsub! /®/, '®'
str.gsub! /¯/, '¯'
str.gsub! /°/, '°'
str.gsub! /±/, '±'
str.gsub! /²/, '²'
str.gsub! /³/, '³'
str.gsub! /´/, '´'
str.gsub! /µ/, 'µ'
str.gsub! /¶/, '¶'
str.gsub! /·/, '·'
str.gsub! /¸/, '¸'
str.gsub! /¹/, '¹'
str.gsub! /º/, 'º'
str.gsub! /»/, '»'
str.gsub! /¼/, '¼'
str.gsub! /½/, '½'
str.gsub! /¾/, '¾'
str.gsub! /¿/, '¿'
str.gsub! /À/, 'À'
str.gsub! /Á/, 'Á'
str.gsub! /Â/, 'Â'
str.gsub! /Ã/, 'Ã'
str.gsub! /Ä/, 'Ä'
str.gsub! /Å/, 'Å'
str.gsub! /Æ/, 'Æ'
str.gsub! /Ç/, 'Ç'
str.gsub! /È/, 'È'
str.gsub! /É/, 'É'
str.gsub! /Ê/, 'Ê'
str.gsub! /Ë/, 'Ë'
str.gsub! /Ì/, 'Ì'
str.gsub! /Í/, 'Í'
str.gsub! /Î/, 'Î'
str.gsub! /Ï/, 'Ï'
str.gsub! /Ð/, 'Ð'
str.gsub! /Ñ/, 'Ñ'
str.gsub! /Ò/, 'Ò'
str.gsub! /Ó/, 'Ó'
str.gsub! /Ô/, 'Ô'
str.gsub! /Õ/, 'Õ'
str.gsub! /Ö/, 'Ö'
str.gsub! /×/, '×'
str.gsub! /Ø/, 'Ø'
str.gsub! /Ù/, 'Ù'
str.gsub! /Ú/, 'Ú'
str.gsub! /Û/, 'Û'
str.gsub! /Ü/, 'Ü'
str.gsub! /Ý/, 'Ý'
str.gsub! /Þ/, 'Þ'
str.gsub! /ß/, 'ß'
str.gsub! /à/, 'à'
str.gsub! /á/, 'á'
str.gsub! /â/, 'â'
str.gsub! /ã/, 'ã'
str.gsub! /ä/, 'ä'
str.gsub! /å/, 'å'
str.gsub! /æ/, 'æ'
str.gsub! /ç/, 'ç'
str.gsub! /è/, 'è'
str.gsub! /é/, 'é'
str.gsub! /ê/, 'ê'
str.gsub! /ë/, 'ë'
str.gsub! /ì/, 'ì'
str.gsub! /í/, 'í'
str.gsub! /î/, 'î'
str.gsub! /ï/, 'ï'
str.gsub! /ð/, 'ð'
str.gsub! /ñ/, 'ñ'
str.gsub! /ò/, 'ò'
str.gsub! /ó/, 'ó'
str.gsub! /ô/, 'ô'
str.gsub! /õ/, 'õ'
str.gsub! /ö/, 'ö'
str.gsub! /÷/, '÷'
str.gsub! /ø/, 'ø'
str.gsub! /ù/, 'ù'
str.gsub! /ú/, 'ú'
str.gsub! /û/, 'û'
str.gsub! /ü/, 'ü'
str.gsub! /ý/, 'ý'
str.gsub! /þ/, 'þ'
str.gsub! /ÿ/, 'ÿ'
str.gsub! /Œ/, 'Œ'
str.gsub! /œ/, 'œ'
str.gsub! /Š/, 'Š'
str.gsub! /š/, 'š'
str.gsub! /Ÿ/, 'Ÿ'
str.gsub! /ƒ/, 'ƒ'
str.gsub! /ˆ/, 'ˆ'
str.gsub! /˜/, '˜'
str.gsub! /Α/, 'Α'
str.gsub! /Β/, 'Β'
str.gsub! /Γ/, 'Γ'
str.gsub! /Δ/, 'Δ'
str.gsub! /Ε/, 'Ε'
str.gsub! /Ζ/, 'Ζ'
str.gsub! /Η/, 'Η'
str.gsub! /Θ/, 'Θ'
str.gsub! /Ι/, 'Ι'
str.gsub! /Κ/, 'Κ'
str.gsub! /Λ/, 'Λ'
str.gsub! /Μ/, 'Μ'
str.gsub! /Ν/, 'Ν'
str.gsub! /Ξ/, 'Ξ'
str.gsub! /Ο/, 'Ο'
str.gsub! /Π/, 'Π'
str.gsub! /Ρ/, 'Ρ'
str.gsub! /Σ/, 'Σ'
str.gsub! /Τ/, 'Τ'
str.gsub! /Υ/, 'Υ'
str.gsub! /Φ/, 'Φ'
str.gsub! /Χ/, 'Χ'
str.gsub! /Ψ/, 'Ψ'
str.gsub! /Ω/, 'Ω'
str.gsub! /α/, 'α'
str.gsub! /β/, 'β'
str.gsub! /γ/, 'γ'
str.gsub! /δ/, 'δ'
str.gsub! /ε/, 'ε'
str.gsub! /ζ/, 'ζ'
str.gsub! /η/, 'η'
str.gsub! /θ/, 'θ'
str.gsub! /ι/, 'ι'
str.gsub! /κ/, 'κ'
str.gsub! /λ/, 'λ'
str.gsub! /μ/, 'μ'
str.gsub! /ν/, 'ν'
str.gsub! /ξ/, 'ξ'
str.gsub! /ο/, 'ο'
str.gsub! /π/, 'π'
str.gsub! /ρ/, 'ρ'
str.gsub! /ς/, 'ς'
str.gsub! /σ/, 'σ'
str.gsub! /τ/, 'τ'
str.gsub! /υ/, 'υ'
str.gsub! /φ/, 'φ'
str.gsub! /χ/, 'χ'
str.gsub! /ψ/, 'ψ'
str.gsub! /ω/, 'ω'
str.gsub! /ϑ/, 'ϑ'
str.gsub! /ϒ/, 'ϒ'
str.gsub! /ϖ/, 'ϖ'
str.gsub! /–/, '–'
str.gsub! /—/, '—'
if typographic_quotes
str.gsub! /‘/, '‘'
str.gsub! /’/, '’'
str.gsub! /“/, '“'
str.gsub! /”/, '”'
else
str.gsub! /‘/, '"'
str.gsub! /’/, '"'
str.gsub! /“/, '"'
str.gsub! /”/, '"'
end
str.gsub! /‚/, '‚'
str.gsub! /„/, '„'
str.gsub! /†/, '†'
str.gsub! /‡/, '‡'
str.gsub! /•/, '•'
str.gsub! /…/, '…'
str.gsub! /‰/, '‰'
str.gsub! /′/, '′'
str.gsub! /″/, '″'
str.gsub! /‹/, '‹'
str.gsub! /›/, '›'
str.gsub! /‾/, '‾'
str.gsub! /⁄/, '⁄'
str.gsub! /€/, '€'
str.gsub! /ℑ/, 'ℑ'
str.gsub! /℘/, '℘'
str.gsub! /ℜ/, 'ℜ'
str.gsub! /™/, '™'
str.gsub! /ℵ/, 'ℵ'
str.gsub! /←/, '←'
str.gsub! /↑/, '↑'
str.gsub! /→/, '→'
str.gsub! /↓/, '↓'
str.gsub! /↔/, '↔'
str.gsub! /↵/, '↵'
str.gsub! /⇐/, '⇐'
str.gsub! /⇑/, '⇑'
str.gsub! /⇒/, '⇒'
str.gsub! /⇓/, '⇓'
str.gsub! /⇔/, '⇔'
str.gsub! /∀/, '∀'
str.gsub! /∂/, '∂'
str.gsub! /∃/, '∃'
str.gsub! /∅/, '∅'
str.gsub! /∇/, '∇'
str.gsub! /∈/, '∈'
str.gsub! /∉/, '∉'
str.gsub! /∋/, '∋'
str.gsub! /∏/, '∏'
str.gsub! /∑/, '∑'
str.gsub! /−/, '−'
str.gsub! /∗/, '∗'
str.gsub! /√/, '√'
str.gsub! /∝/, '∝'
str.gsub! /∞/, '∞'
str.gsub! /∠/, '∠'
str.gsub! /∧/, '∧'
str.gsub! /∨/, '∨'
str.gsub! /∩/, '∩'
str.gsub! /∪/, '∪'
str.gsub! /∫/, '∫'
str.gsub! /∴/, '∴'
str.gsub! /∼/, '∼'
str.gsub! /≅/, '≅'
str.gsub! /≈/, '≈'
str.gsub! /≠/, '≠'
str.gsub! /≡/, '≡'
str.gsub! /≤/, '≤'
str.gsub! /≥/, '≥'
str.gsub! /⊂/, '⊂'
str.gsub! /⊃/, '⊃'
str.gsub! /⊄/, '⊄'
str.gsub! /⊆/, '⊆'
str.gsub! /⊇/, '⊇'
str.gsub! /⊕/, '⊕'
str.gsub! /⊗/, '⊗'
str.gsub! /⊥/, '⊥'
str.gsub! /⋅/, '⋅'
str.gsub! /⌈/, '⌈'
str.gsub! /⌉/, '⌉'
str.gsub! /⌊/, '⌊'
str.gsub! /⌋/, '⌋'
str.gsub! /〈/, '⟨'
str.gsub! /〉/, '⟩'
str.gsub! /◊/, '◊'
str.gsub! /♠/, '♠'
str.gsub! /♣/, '♣'
str.gsub! /♥/, '♥'
str.gsub! /♦/, '♦'
str
end
def entitify(html, typographic_quotes = nil)
@html = ''
h = Hpricot(html)
# We don't want to replace stuff in the head
unless h.search("/html/body").empty?
body = h.search "/html/body"
body.each do |el|
entityReplace(el, typographic_quotes)
end
html = h
else
html = entityReplace(h, typographic_quotes)
end
html
end
get '/' do
erb :home
end
post '/' do
@javascript = params[:javascript_disabled]
@html = params[:html]
if @html
@content = entitify(@html, params[:typographic_quotes]) if params[:text_or_html] == "html"
@content = textReplace(@html, params[:typographic_quotes]) if params[:text_or_html] == "text"
else
redirect '/', 500
pp 'hello'
end
unless @javascript
erb :display_code, :layout => false
else
erb :display_code
end
end