-
-
Save choxi/6fa98f7b203bf2dfdcfa to your computer and use it in GitHub Desktop.
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
# This marked.js extension takes a modified code fence syntax that looks like: | |
# | |
# ```ruby(app/controllers/application_controller.rb) | |
# class ApplicationController < ActionController | |
# + def new | |
# - def old | |
# end | |
# end | |
# ``` | |
# | |
# and should produce code snippets in HTML that look like: | |
# | |
# <div class=‘snippet’> | |
# <div class='file-path’> app/controllers/application_controller.rb </div> | |
# <pre> | |
# <code> | |
# <div class=‘line’>class ApplicationController < ActionController</div> | |
# <div class=‘line addition’>def new</div> | |
# <div class=‘line subtraction’>def old</div> | |
# <div class=‘line’>end</div> | |
# </code> | |
# </pre> | |
# </div> | |
renderer = new marked.Renderer() | |
# This is copied from marked.js, because it doesn't make the function accessible outside of the file's scope: | |
# https://github.com/chjj/marked/blob/master/lib/marked.js#L1076 | |
escapeHTML = (html, encode) -> | |
html.replace((if not encode then /&(?!#?\w+;)/g else /&/g), "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace /'/g, "'" | |
renderer.code = (code, language) -> | |
filePathRegex = /\(([^)]+)\)/ | |
if language? && language.match(filePathRegex)? | |
filePath = language.match(filePathRegex)[1] | |
language = language.replace(filePathRegex, "") | |
renderedLines = [] | |
lines = escapeHTML(code, true).split("\n") | |
for line in lines | |
if line[0] == "+" | |
renderedLines.push("<span class='line addition'>#{line.replace('+', ' ')}</span>") | |
else if line[0] == "-" | |
renderedLines.push("<span class='line subtraction'>#{line.replace('-', ' ')}</span>") | |
else | |
renderedLines.push("<span class='line'>#{line}</span>") | |
if filePath? | |
"<div class='snippet'><div class='file-bar'>#{filePath}</div><pre><code class='lang-#{language}'>#{renderedLines.join("\n")}</code></pre></div>" | |
else | |
"<div class='snippet'><pre><code class='lang-#{language}'>#{renderedLines.join("\n")}</code></pre></div>" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment