Skip to content

Instantly share code, notes, and snippets.

@Awea
Last active December 14, 2015 07:39
Show Gist options
  • Save Awea/5052312 to your computer and use it in GitHub Desktop.
Save Awea/5052312 to your computer and use it in GitHub Desktop.
Markdown to Html with code highlight

Have a model with this attributes

  • md
  • html

Usage

class Article < ActiveRecord::Base
  include MdToHtml
end
gem 'redcarpet'
gem 'pygmentize'
require 'digest/md5'
module MdToHtml
extend ActiveSupport::Concern
included do
before_save :convert_md
end
private
def convert_md
markdown = Redcarpet::Markdown.new(PygmentizeHTML, :autolink => true, :space_after_headers => true, :fenced_code_blocks => true)
self.html = markdown.render(gfm(self.md))
end
# from https://help.github.com/articles/github-flavored-markdown
def gfm(text)
# Extract pre blocks
extractions = {}
text.gsub!(%r{<pre>.*?</pre>}m) do |match|
md5 = Digest::MD5.hexdigest(match)
extractions[md5] = match
"{gfm-extraction-#{md5}}"
end
# prevent foo_bar_baz from ending up with an italic word in the middle
text.gsub!(/(^(?! {4}|\t)\w+_\w+_\w[\w_]*)/) do |x|
x.gsub('_', '\_') if x.split('').sort.to_s[0..1] == '__'
end
# in very clear cases, let newlines become <br /> tags
text.gsub!(/^[\w\<][^\n]*\n+/) do |x|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
end
# Insert pre block extractions
text.gsub!(/\{gfm-extraction-([0-9a-f]{32})\}/) do
"\n\n" + extractions[$1]
end
text
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment