-
-
Save remino/3036680 to your computer and use it in GitHub Desktop.
WordPress's wpautop function port to ruby.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def wpautop(pee, br = true) | |
return '' if pee.strip == '' | |
pee = "#{pee}\n" # just to make things a little easier, pad the end | |
pee = pee.gsub(/<br \/>\s*<br \/>/s, "\n\n") | |
# pace things out a little | |
allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; | |
pee = pee.gsub(Regexp.new('(<'+allblocks+'[^>]*>)'), "\n"+'\1') | |
pee = pee.gsub(Regexp.new('(<\/'+allblocks+'[^>]*>)'), '\1' + "\n\n") | |
pee = pee.gsub(/\r\n|\r/, "\n") # cross-platform newlines | |
if pee.include?('<object') | |
pee = pee.gsub(/\s*<param([^>]*)>\s*/, '<param\1>') # no pee inside object/embed | |
pee = pee.gsub(/\s*<\/embed>\s*/, '</embed>') | |
end | |
pee = pee.gsub(/\n\n+/, "\n\n") # take care of duplicates | |
# make paragraphs, including one at the end | |
pees = pee.split(/\n\s*\n/) | |
pee = ''; | |
pees.each do |tinkle| | |
next if tinkle == "" | |
pee += '<p>' + tinkle.gsub(/\n/, "") + "</p>\n"; | |
end | |
pee = pee.gsub(/<p>\s*<\/p>/, "") # under certain strange conditions it could create a P of entirely whitespace | |
pee = pee.gsub(/<p>([^<]+)<\/(div|address|form)>/, '<p>\1</p></\2>') | |
pee = pee.gsub(Regexp.new('<p>\s*(<\/?'+allblocks+'[^>]*>)\s*<\/p>'), '\1') # don't pee all over a tag | |
pee = pee.gsub(/<p>(<li.+?)<\/p>/, "\1") # problem with nested lists | |
pee = pee.gsub(/<p><blockquote([^>]*)>/i, '<blockquote\1><p>') | |
pee = pee.gsub('</blockquote></p>', '</p></blockquote>') | |
pee = pee.gsub(Regexp.new('<p>\s*(<\/?'+ allblocks + '[^>]*>)'), '\1') | |
pee = pee.gsub(Regexp.new('(<\/?'+allblocks+'[^>]*>)\s*</p>'), '\1') | |
if br | |
pee = pee.scan(/<(script|style).*?<\/\\1>/s) do |s| | |
pee = pee.gsub(s, "\n<WPPreserveNewline />") | |
end | |
pee = pee.gsub(/\(?<!<br \/>\)\s*\n/, "<br />\n") # optionally make line breaks | |
pee = pee.gsub('<WPPreserveNewline />', "\n") | |
end | |
pee = pee.gsub(Regexp.new('(</?'+allblocks+'[^>]*>)\s*<br />'), '\1') | |
pee = pee.gsub(/<br \/>(\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)/, '\1') | |
if pee.include?('<pre') | |
pee.scan(/(<pre[^>]*>)(.*?)<\/pre>/is) do |s| | |
s = s.gsub('<br />', '') | |
s = s.gsub('<p>', "\n") | |
s = s.gsub('</p>', '') | |
end | |
end | |
return pee.gsub(/\n<\/p>$/, '</p>') | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
if anyone ever needs a groovy port https://gist.github.com/danielschonfeld/9046289. Thank you so much for providing this Ruby port, it helped tremendously making the groovy port