You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2016/01/26 22:52:50 UTC
[6/7] allura git commit: [#8040] changes to support SimpleMDE dev
version, including our code block contribution
[#8040] changes to support SimpleMDE dev version, including our code block contribution
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/64318624
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/64318624
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/64318624
Branch: refs/heads/db/8040
Commit: 643186242a33f87e21fcc617438773792e5d1099
Parents: 81546ab
Author: Dave Brondsema <da...@brondsema.net>
Authored: Tue Jan 19 18:53:40 2016 -0500
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jan 25 17:53:14 2016 -0500
----------------------------------------------------------------------
.../lib/widgets/resources/css/markitup_sf.css | 3 +
.../lib/widgets/resources/js/sf_markitup.js | 202 +------------------
2 files changed, 8 insertions(+), 197 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/64318624/Allura/allura/lib/widgets/resources/css/markitup_sf.css
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/resources/css/markitup_sf.css b/Allura/allura/lib/widgets/resources/css/markitup_sf.css
index 31c5730..55d11c7 100644
--- a/Allura/allura/lib/widgets/resources/css/markitup_sf.css
+++ b/Allura/allura/lib/widgets/resources/css/markitup_sf.css
@@ -64,4 +64,7 @@
}
.CodeMirror .CodeMirror-code .cm-url {
color: #33d;
+}
+.CodeMirror .CodeMirror-placeholder {
+ color: #999;
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/allura/blob/64318624/Allura/allura/lib/widgets/resources/js/sf_markitup.js
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/resources/js/sf_markitup.js b/Allura/allura/lib/widgets/resources/js/sf_markitup.js
index 58593ce..b659b08 100644
--- a/Allura/allura/lib/widgets/resources/js/sf_markitup.js
+++ b/Allura/allura/lib/widgets/resources/js/sf_markitup.js
@@ -27,15 +27,9 @@ $(window).load(function() {
var $help_area = $('div.markdown_help', $container);
var $help_contents = $('div.markdown_help_contents', $container);
- // Override action for "preview" & "guide" tools
+ // Override action for a few buttons
var toolbar = [
- "bold", "italic", "heading", "|",
- {
- name: 'code',
- action: function(editor) { return toggleCodeBlock(editor, '~~~~'); },
- className: 'fa fa-code',
- title: 'Code Block'
- },
+ "bold", "italic", "heading", "|", "code",
"quote", "unordered-list", "ordered-list",
{
name: 'table',
@@ -65,11 +59,13 @@ $(window).load(function() {
toolbar: toolbar,
previewRender: previewRender,
parsingConfig: {
- highlightFormatting: true,
allowAtxHeaderWithoutSpace: true,
strikethrough: false,
taskLists: false,
fencedCodeBlocks: true // override gfm's limited fencing regex
+ },
+ blockStyles: {
+ code: '~~~'
}
});
editor.render();
@@ -112,194 +108,6 @@ $(window).load(function() {
'Cell | Cell | Cell ');
}
- function toggleCodeBlock(editor, fenceCharsToInsert) {
- // NOTE: this requires highlightFormatting:true in the mode config
-
- fenceCharsToInsert = fenceCharsToInsert || '```';
-
- function fencing_line(line) {
- /* return true, if this is a ``` or ~~~ line */
- if (typeof line !== 'object') {
- throw 'fencing_line() takes a "line" object (not a line number, or line text). Got: ' + typeof line + ': ' + line;
- }
- return line.styles && line.styles[2] && line.styles[2].indexOf('formatting-code-block') !== -1;
- }
-
- function code_type(cm, line_num, line, firstTok, lastTok) {
- /*
- * Return 'single', 'indented', 'fenced' or false
- *
- * cm and line_num are required. Others are optional for efficiency
- * To check in the middle of a line, pass in firstTok yourself.
- */
- line = line || cm.getLineHandle(line_num);
- firstTok = firstTok || cm.getTokenAt({line: line_num, ch: 1});
- lastTok = lastTok || (!!line.text && cm.getTokenAt({line: line_num, ch: line.text.length-1}));
- var types = firstTok.type ? firstTok.type.split(' ') : [];
- if (lastTok && lastTok.state.base.indentedCode) {
- // have to check last char, since first chars of first line aren't marked as indented
- return 'indented';
- } else if (types.indexOf('comment') === -1) {
- // has to be after 'indented' check, since first chars of first indented line aren't marked as such
- return false;
- } else if (firstTok.state.base.fencedChars || lastTok.state.base.fencedChars || fencing_line(line)) {
- return 'fenced';
- } else {
- return 'single';
- }
- }
-
- function insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert) {
- var start_line_sel = cur_start.line + 1,
- end_line_sel = cur_end.line + 1,
- sel_multi = cur_start.line !== cur_end.line,
- repl_start = fenceCharsToInsert + '\n',
- repl_end = '\n' + fenceCharsToInsert;
- if (sel_multi) {
- end_line_sel++;
- }
- // handle last char including \n or not
- if (sel_multi && cur_end.ch === 0) {
- repl_end = fenceCharsToInsert + '\n';
- end_line_sel--;
- }
- _replaceSelection(cm, false, repl_start, repl_end);
- cm.setSelection({line: start_line_sel, ch: 0},
- {line: end_line_sel, ch: 0});
- }
-
- var cm = editor.codemirror,
- cur_start = cm.getCursor('start'),
- cur_end = cm.getCursor('end'),
- tok = cm.getTokenAt({line: cur_start.line, ch: cur_start.ch || 1}), // avoid ch 0 which is a cursor pos but not token
- line = cm.getLineHandle(cur_start.line),
- is_code = code_type(cm, cur_start.line, line, tok);
- var block_start, block_end, lineCount;
-
- if (is_code === 'single') {
- // similar to some SimpleMDE _toggleBlock logic
- var start = line.text.slice(0, cur_start.ch).replace('`',''),
- end = line.text.slice(cur_start.ch).replace('`', '');
- cm.replaceRange(start + end, {
- line: cur_start.line,
- ch: 0
- }, {
- line: cur_start.line,
- ch: 99999999999999
- });
- cur_start.ch--;
- if (cur_start !== cur_end) {
- cur_end.ch--;
- }
- cm.setSelection(cur_start, cur_end);
- cm.focus();
- } else if (is_code === 'fenced') {
- if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {
- // use selection
- for (block_start = cur_start.line; block_start >= 0; block_start--) {
- line = cm.getLineHandle(block_start);
- if (fencing_line(line)) {
- break;
- }
- }
- var fencedTok = cm.getTokenAt({line: block_start, ch: 1});
- insertFencingAtSelection(cm, cur_start, cur_end, fencedTok.state.base.fencedChars);
- } else {
- // no selection, search for ends of this fenced block
- var search_from = cur_start.line;
- if (fencing_line(cm.getLineHandle(cur_start.line))) { // gets a little tricky if cursor is right on a fenced line
- if (code_type(cm, cur_start.line + 1) === 'fenced') {
- block_start = cur_start.line;
- search_from = cur_start.line + 1; // for searching for "end"
- } else {
- block_end = cur_start.line;
- search_from = cur_start.line - 1; // for searching for "start"
- }
- }
- if (block_start === undefined) {
- for (block_start = search_from; block_start >= 0; block_start--) {
- line = cm.getLineHandle(block_start);
- if (fencing_line(line)) {
- break;
- }
- }
- }
- if (block_end === undefined) {
- lineCount = cm.lineCount();
- for (block_end = search_from; block_end < lineCount; block_end++) {
- line = cm.getLineHandle(block_end);
- if (fencing_line(line)) {
- break;
- }
- }
- }
- cm.operation(function () {
- cm.replaceRange('', {line: block_start, ch: 0}, {line: block_start + 1, ch: 0});
- cm.replaceRange('', {line: block_end - 1, ch: 0}, {line: block_end, ch: 0});
- });
- cm.focus();
- }
- } else if (is_code === 'indented') {
- if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {
- // use selection
- block_start = cur_start.line;
- block_end = cur_end.line;
- if (cur_end.ch === 0) {
- block_end--;
- }
- } else {
- // no selection, search for ends of this indented block
- for (block_start = cur_start.line; block_start >= 0; block_start--) {
- line = cm.getLineHandle(block_start);
- if (line.text.match(/^\s*$/)) {
- // empty or all whitespace - keep going
- continue;
- } else {
- if (code_type(cm, block_start, line) !== 'indented') {
- block_start += 1;
- break;
- }
- }
- }
- lineCount = cm.lineCount();
- for (block_end = cur_start.line; block_end < lineCount; block_end++) {
- line = cm.getLineHandle(block_end);
- if (line.text.match(/^\s*$/)) {
- // empty or all whitespace - keep going
- continue;
- } else {
- if (code_type(cm, block_end, line) !== 'indented') {
- block_end -= 1;
- break;
- }
- }
- }
- }
- // if we are going to un-indent based on a selected set of lines, and the next line is indented too, we need to
- // insert a blank line so that the next line(s) continue to be indented code
- var next_line = cm.getLineHandle(block_end+1),
- next_line_last_tok = next_line && cm.getTokenAt({line: block_end+1, ch: next_line.text.length-1}),
- next_line_indented = next_line_last_tok && next_line_last_tok.state.base.indentedCode;
- if (next_line_indented) {
- cm.replaceRange('\n', {line: block_end+1, ch:0});
- }
-
- for (var i = block_start; i <= block_end; i++) {
- cm.indentLine(i, 'subtract'); // TODO: this doesn't get tracked in the history, so can't be undone :(
- }
- cm.focus();
- } else {
- // insert code formatting
- var no_sel_and_starting_of_line = (cur_start.line === cur_end.line && cur_start.ch === cur_end.ch && cur_start.ch === 0);
- var sel_multi = cur_start.line !== cur_end.line;
- if (no_sel_and_starting_of_line || sel_multi) {
- insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert);
- } else {
- _replaceSelection(cm, false, '`', '`');
- }
- }
- }
-
function show_help(editor) {
$help_contents.html('Loading...');
$.get($help_contents.attr('data-url'), function (data) {