From b0a8984d3bec9885c860623c5ea4a688c7902311 Mon Sep 17 00:00:00 2001 From: bootstraponline Date: Mon, 18 Jun 2012 12:31:30 -0600 Subject: [PATCH] Update livepreview for new Ace. --- .../livepreview/js/livepreview/livepreview.js | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/gollum/frontend/public/gollum/livepreview/js/livepreview/livepreview.js b/lib/gollum/frontend/public/gollum/livepreview/js/livepreview/livepreview.js index 5524bd6e..d8ad1235 100644 --- a/lib/gollum/frontend/public/gollum/livepreview/js/livepreview/livepreview.js +++ b/lib/gollum/frontend/public/gollum/livepreview/js/livepreview/livepreview.js @@ -172,7 +172,8 @@ var previewSet = function( text ) { } }; -var languages = [ 'c_cpp', 'clojure', 'coffee', 'coldfusion', +// 'c', 'c++', 'cpp' are github specific and transformed to c_cpp for Ace. +var languages = [ 'c', 'c++', 'cpp', 'clojure', 'coffee', 'coldfusion', 'csharp', 'css', 'diff', 'golang', 'groovy', 'haxe', 'html', 'java', 'javascript', 'json', 'latex', 'less', 'liquid', 'lua', 'markdown', 'ocaml', 'perl', 'pgsql', 'php', 'powershell', @@ -205,9 +206,14 @@ function getLang( language ) { } function highlight( element, language ) { - var data = element.innerHTML; + // Highlighting requires .innerText not + // .innerHTML. It's the difference between + // '>' and '>'. + // Firefox does not support innerText. + var data = element.innerText || element.textContent; var mode = getLang( language ); - var color = staticHighlight.render( data, mode, githubTheme ); + // input, mode, theme, lineStart, disableGutter + var color = staticHighlight.render( data, mode, githubTheme, 1, true ); var newDiv = doc.createElement('div'); newDiv.innerHTML = color.html; @@ -257,6 +263,23 @@ var makePreviewHtml = function () { // the syntax for code highlighting means all code, even one line, contains newlines. if ( txt.length > 1 && codeHTML.match( /\n/ ) ) { var declaredLanguage = txt[ 1 ]; + var aceMode = declaredLanguage; + + // GitHub supports 'c', 'c++', 'cpp' + // which must trigger the 'c_cpp' mode in Ace. + if ( declaredLanguage === 'cpp' ) { + aceMode = 'c_cpp'; + } + + // '`c++'.split( /\b/ ) + // ["`", "c", "++"] + if ( declaredLanguage === 'c' ) { + aceMode = 'c_cpp'; + if ( txt.length > 2 && txt[ 2 ].substring( 0, 2 ) === '++' ) { + declaredLanguage += '++'; + } + } + // txt[0] must be '`' // txt[0] = '`'; txt[1] = 'ruby' if ( txt[ 0 ] !== '`' || $.inArray( declaredLanguage, languages ) === -1 ) { @@ -268,7 +291,7 @@ var makePreviewHtml = function () { // length + 1 for the marker character. element.innerHTML = codeHTML.substring( declaredLanguage.length + 1 ).trim(); // highlight: element - highlight( element, declaredLanguage ); + highlight( element, aceMode ); } else { // Highlighting is not for `code` inline syntax. For example `puts "string"`. skipped++;