# Untested code snippet from https://gist.github.com/somebox/619537 class String def trac_to_markdown! gsub!(/\{\{\{([^\n]+?)\}\}\}/, '`\1`') gsub!(/\{\{\{(.+?)\}\}\}/m){|m| m.each_line.map{|x| "\t#{x}".gsub(/[\{\}]{3}/,'')}.join} gsub!(/\=\=\=\=\s(.+?)\s\=\=\=\=/, '### \1') gsub!(/\=\=\=\s(.+?)\s\=\=\=/, '## \1') gsub!(/\=\=\s(.+?)\s\=\=/, '# \1') gsub!(/\=\s(.+?)\s\=[\s\n]*/, '') gsub!(/\[(http[^\s\[\]]+)\s([^\[\]]+)\]/, '[\2](\1)') gsub!(/\!(([A-Z][a-z0-9]+){2,})/, '\1') gsub!(/'''(.+)'''/, '*\1*') gsub!(/''(.+)''/, '_\1_') gsub!(/^\s\*/, '*') gsub!(/^\s\d\./, '1.') gsub!(/\{\{\{([^\n]+?)\}\}\}/, '`\1`') gsub!(/'''(.+?)'''/, '**\1**') gsub!(/''(.+?)''/, '*\1*') gsub!(/((^\|\|[^\n\r]+\|\|[ \t]*\r?(\n|$))+)/m) do |m| m = m.each_line.map do |x| x.gsub(/\t/, ' ') .gsub(/(\|\|){2,}/){|k| k.gsub(/\|\|/, '|| ')} .gsub(/ {3,}/, ' ') end.join lines = m.each_line.to_a line1 = lines.shift line2 = line1.dup.gsub(/[^\n\r\|]/, '-') lines.unshift(line1, line2) c = lines.join c = c.each_line.map do |x| x.gsub(/\=\s?(.+?)\s?=/, ' \1 ') .gsub(/\|\|/, '|') end.join end gsub!(/^\{\{\{(.+?)^\}\}\}/m, '```\1```') gsub!(/\=\=\=\=\s(.+?)\s\=\=\=\=/, '### \1') gsub!(/\=\=\=\s(.+?)\s\=\=\=/, '## \1') gsub!(/\=\=\s(.+?)\s\=\=/, '# \1') gsub!(/\=\s(.+?)\s\=[\s\n]*/, '') gsub!(/\[(http[^\s\[\]]+)\s([^\[\]]+)\]/, '[\2](\1)') gsub!(/\!(([A-Z][a-z0-9]+){2,})/, '\1') gsub!(/^\s\*/, '*') gsub!(/^\s\d\./, '1.') end end some_trac = 'my document' puts some_trac.trac_to_markdown!