pull/510/head
WittBulter 7 years ago
parent ca6b87f016
commit 827300b1ed

@ -1,25 +1,25 @@
{
"rules": {
"indent": [
2,
"tab"
],
// "indent": [
// 2,
// "tab"
// ],
"strict": 0,
"no-console": 0,
"quotes": [
2,
"double"
],
"semi": [
2,
"always"
]
"no-console": 0
// "quotes": [
// 2,
// "double"
// ],
// "semi": [
// 2,
// "never"
// ]
},
"env": {
"browser": true,
"node":true
},
"extends": "eslint:recommended",
// "extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

@ -11,7 +11,7 @@ export default class Action {
/**
* Action for toggling bold.
*/
static toggleBold (editor){
static toggleBold (editor){
Base.toggleBlock(editor, "bold", editor.options.blockStyles.bold);
}
@ -27,12 +27,12 @@ export default class Action {
*/
static drawLink (editor){
const cm = editor.codemirror;
const stat = getState(cm);
const stat = Base.getState(cm);
const options = editor.options;
let url = "http://";
if(options.promptURLs) {
if (options.promptURLs){
url = prompt(options.promptTexts.link);
if(!url) {
if (!url){
return false;
}
}
@ -63,9 +63,9 @@ export default class Action {
const stat = Base.getState(cm);
const options = editor.options;
let url = "http://";
if(options.promptURLs) {
if (options.promptURLs){
url = prompt(options.promptTexts.image);
if(!url) {
if (!url){
return false;
}
}
@ -102,9 +102,9 @@ export default class Action {
static toggleCodeBlock (editor){
let fenceCharsToInsert = editor.options.blockStyles.code;
const fencing_line = line => {
const fencing_line = line =>{
/* return true, if this is a ``` or ~~~ line */
if(typeof line !== "object") {
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;
@ -115,7 +115,7 @@ export default class Action {
return token.state.base.base || token.state.base;
}
const code_type = (cm, line_num, line = cm.getLineHandle(line_num), firstTok, lastTok) => {
const code_type = (cm, line_num, line = cm.getLineHandle(line_num), firstTok, lastTok) =>{
/*
* Return "single", "indented", "fenced" or false
*
@ -130,31 +130,31 @@ export default class Action {
line: line_num,
ch: line.text.length - 1
}));
let types = firstTok.type ? firstTok.type.split(" ") : [];
if(lastTok && token_state(lastTok).indentedCode) {
let types = firstTok.type? firstTok.type.split(" "): [];
if (lastTok && token_state(lastTok).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) {
} 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(token_state(firstTok).fencedChars || token_state(lastTok).fencedChars || fencing_line(line)) {
} else if (token_state(firstTok).fencedChars || token_state(lastTok).fencedChars || fencing_line(line)){
return "fenced";
} else {
} else{
return "single";
}
}
const insertFencingAtSelection = (cm, cur_start, cur_end, fenceCharsToInsert) => {
const insertFencingAtSelection = (cm, cur_start, cur_end, fenceCharsToInsert) =>{
let 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) {
if (sel_multi){
end_line_sel++;
}
// handle last char including \n or not
if(sel_multi && cur_end.ch === 0) {
if (sel_multi && cur_end.ch === 0){
repl_end = fenceCharsToInsert + "\n";
end_line_sel--;
}
@ -179,10 +179,12 @@ export default class Action {
is_code = code_type(cm, cur_start.line, line, tok);
let block_start, block_end, lineCount;
if(is_code === "single") {
if (is_code === "single"){
// similar to some SimpleMDE _toggleBlock logic
let start = line.text.slice(0, cur_start.ch).replace("`", ""),
end = line.text.slice(cur_start.ch).replace("`", "");
let 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
@ -191,19 +193,19 @@ export default class Action {
ch: 99999999999999
});
cur_start.ch--;
if(cur_start !== cur_end) {
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) {
} else if (is_code === "fenced"){
if (cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch){
// use selection
// find the fenced line so we know what type it is (tilde, backticks, number of them)
for(block_start = cur_start.line; block_start >= 0; block_start--) {
for (block_start = cur_start.line; block_start >= 0; block_start--){
line = cm.getLineHandle(block_start);
if(fencing_line(line)) {
if (fencing_line(line)){
break;
}
}
@ -215,88 +217,88 @@ export default class Action {
let start_text, start_line;
let end_text, end_line;
// check for selection going up against fenced lines, in which case we don't want to add more fencing
if(fencing_line(cm.getLineHandle(cur_start.line))) {
if (fencing_line(cm.getLineHandle(cur_start.line))){
start_text = "";
start_line = cur_start.line;
} else if(fencing_line(cm.getLineHandle(cur_start.line - 1))) {
} else if (fencing_line(cm.getLineHandle(cur_start.line - 1))){
start_text = "";
start_line = cur_start.line - 1;
} else {
} else{
start_text = fence_chars + "\n";
start_line = cur_start.line;
}
if(fencing_line(cm.getLineHandle(cur_end.line))) {
if (fencing_line(cm.getLineHandle(cur_end.line))){
end_text = "";
end_line = cur_end.line;
if(cur_end.ch === 0) {
if (cur_end.ch === 0){
end_line += 1;
}
} else if(cur_end.ch !== 0 && fencing_line(cm.getLineHandle(cur_end.line + 1))) {
} else if (cur_end.ch !== 0 && fencing_line(cm.getLineHandle(cur_end.line + 1))){
end_text = "";
end_line = cur_end.line + 1;
} else {
} else{
end_text = fence_chars + "\n";
end_line = cur_end.line + 1;
}
if(cur_end.ch === 0) {
if (cur_end.ch === 0){
// full last line selected, putting cursor at beginning of next
end_line -= 1;
}
cm.operation(function() {
cm.operation(function (){
// end line first, so that line numbers don't change
cm.replaceRange(end_text, {
line: end_line,
ch: 0
}, {
line: end_line + (end_text ? 0 : 1),
line: end_line + (end_text? 0: 1),
ch: 0
});
cm.replaceRange(start_text, {
line: start_line,
ch: 0
}, {
line: start_line + (start_text ? 0 : 1),
line: start_line + (start_text? 0: 1),
ch: 0
});
});
cm.setSelection({
line: start_line + (start_text ? 1 : 0),
line: start_line + (start_text? 1: 0),
ch: 0
}, {
line: end_line + (start_text ? 1 : -1),
line: end_line + (start_text? 1: -1),
ch: 0
});
cm.focus();
} else {
} else{
// no selection, search for ends of this fenced block
let 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") {
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 {
} 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--) {
if (block_start === undefined){
for (block_start = search_from; block_start >= 0; block_start--){
line = cm.getLineHandle(block_start);
if(fencing_line(line)) {
if (fencing_line(line)){
break;
}
}
}
if(block_end === undefined) {
if (block_end === undefined){
lineCount = cm.lineCount();
for(block_end = search_from; block_end < lineCount; block_end++) {
for (block_end = search_from; block_end < lineCount; block_end++){
line = cm.getLineHandle(block_end);
if(fencing_line(line)) {
if (fencing_line(line)){
break;
}
}
}
cm.operation(function() {
cm.operation(function (){
cm.replaceRange("", {
line: block_start,
ch: 0
@ -314,36 +316,36 @@ export default class Action {
});
cm.focus();
}
} else if(is_code === "indented") {
if(cur_start.line !== cur_end.line || cur_start.ch !== cur_end.ch) {
} 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) {
if (cur_end.ch === 0){
block_end--;
}
} else {
} else{
// no selection, search for ends of this indented block
for(block_start = cur_start.line; block_start >= 0; block_start--) {
for (block_start = cur_start.line; block_start >= 0; block_start--){
line = cm.getLineHandle(block_start);
if(line.text.match(/^\s*$/)) {
if (line.text.match(/^\s*$/)){
// empty or all whitespace - keep going
continue;
} else {
if(code_type(cm, block_start, line) !== "indented") {
} 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++) {
for (block_end = cur_start.line; block_end < lineCount; block_end++){
line = cm.getLineHandle(block_end);
if(line.text.match(/^\s*$/)) {
if (line.text.match(/^\s*$/)){
// empty or all whitespace - keep going
continue;
} else {
if(code_type(cm, block_end, line) !== "indented") {
} else{
if (code_type(cm, block_end, line) !== "indented"){
block_end -= 1;
break;
}
@ -358,24 +360,24 @@ export default class Action {
ch: next_line.text.length - 1
}),
next_line_indented = next_line_last_tok && token_state(next_line_last_tok).indentedCode;
if(next_line_indented) {
if (next_line_indented){
cm.replaceRange("\n", {
line: block_end + 1,
ch: 0
});
}
for(var i = block_start; i <= block_end; i++) {
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 {
} else{
// insert code formatting
let no_sel_and_starting_of_line = (cur_start.line === cur_end.line && cur_start.ch === cur_end.ch && cur_start.ch === 0);
let sel_multi = cur_start.line !== cur_end.line;
if(no_sel_and_starting_of_line || sel_multi) {
if (no_sel_and_starting_of_line || sel_multi){
insertFencingAtSelection(cm, cur_start, cur_end, fenceCharsToInsert);
} else {
} else{
Base.replaceSelection(cm, false, ["`", "`"]);
}
}
@ -391,10 +393,10 @@ export default class Action {
// Prevent scrolling on body during fullscreen active
if(cm.getOption("fullScreen")) {
if (cm.getOption("fullScreen")){
this.saved_overflow = document.body.style.overflow;
document.body.style.overflow = "hidden";
} else {
} else{
document.body.style.overflow = this.saved_overflow;
}
@ -402,9 +404,9 @@ export default class Action {
// Update toolbar class
let wrap = cm.getWrapperElement();
if(!/fullscreen/.test(wrap.previousSibling.className)) {
if (!/fullscreen/.test(wrap.previousSibling.className)){
wrap.previousSibling.className += " fullscreen";
} else {
} else{
wrap.previousSibling.className = wrap.previousSibling.className.replace(/\s*fullscreen\b/, "");
}
@ -412,16 +414,16 @@ export default class Action {
// Update toolbar button
let toolbarButton = editor.toolbarElements.fullscreen;
if(!/active/.test(toolbarButton.className)) {
if (!/active/.test(toolbarButton.className)){
toolbarButton.className += " active";
} else {
} else{
toolbarButton.className = toolbarButton.className.replace(/\s*active\s*/g, "");
}
// Hide side by side if needed
const sidebyside = cm.getWrapperElement().nextSibling;
if(/editor-preview-active-side/.test(sidebyside.className))
if (/editor-preview-active-side/.test(sidebyside.className))
this.toggleSideBySide(editor);
}
@ -435,18 +437,18 @@ export default class Action {
let preview = wrapper.nextSibling;
let toolbarButton = editor.toolbarElements["side-by-side"];
let useSideBySideListener = false;
if(/editor-preview-active-side/.test(preview.className)) {
if (/editor-preview-active-side/.test(preview.className)){
preview.className = preview.className.replace(
/\s*editor-preview-active-side\s*/g, ""
);
toolbarButton.className = toolbarButton.className.replace(/\s*active\s*/g, "");
wrapper.className = wrapper.className.replace(/\s*CodeMirror-sided\s*/g, " ");
} else {
} else{
// When the preview button is clicked for the first time,
// give some time for the transition from editor.css to fire and the view to slide from right to left,
// instead of just appearing.
setTimeout(function() {
if(!cm.getOption("fullScreen"))
setTimeout(function (){
if (!cm.getOption("fullScreen"))
this.toggleFullScreen(editor);
preview.className += " editor-preview-active-side";
}, 1);
@ -457,7 +459,7 @@ export default class Action {
// Hide normal preview if active
let previewNormal = wrapper.lastChild;
if(/editor-preview-active/.test(previewNormal.className)) {
if (/editor-preview-active/.test(previewNormal.className)){
previewNormal.className = previewNormal.className.replace(
/\s*editor-preview-active\s*/g, ""
);
@ -467,18 +469,18 @@ export default class Action {
toolbar_div.className = toolbar_div.className.replace(/\s*disabled-for-preview*/g, "");
}
const sideBySideRenderingFunction = function() {
const sideBySideRenderingFunction = function (){
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
};
if(!cm.sideBySideRenderingFunction) {
if (!cm.sideBySideRenderingFunction){
cm.sideBySideRenderingFunction = sideBySideRenderingFunction;
}
if(useSideBySideListener) {
if (useSideBySideListener){
preview.innerHTML = editor.options.previewRender(editor.value(), preview);
cm.on("update", cm.sideBySideRenderingFunction);
} else {
} else{
cm.off("update", cm.sideBySideRenderingFunction);
}
@ -493,29 +495,29 @@ export default class Action {
let cm = editor.codemirror;
let wrapper = cm.getWrapperElement();
let toolbar_div = wrapper.previousSibling;
let toolbar = editor.options.toolbar ? editor.toolbarElements.preview : false;
let toolbar = editor.options.toolbar? editor.toolbarElements.preview: false;
let preview = wrapper.lastChild;
if(!preview || !/editor-preview/.test(preview.className)) {
if (!preview || !/editor-preview/.test(preview.className)){
preview = document.createElement("div");
preview.className = "editor-preview";
wrapper.appendChild(preview);
}
if(/editor-preview-active/.test(preview.className)) {
if (/editor-preview-active/.test(preview.className)){
preview.className = preview.className.replace(
/\s*editor-preview-active\s*/g, ""
);
if(toolbar) {
if (toolbar){
toolbar.className = toolbar.className.replace(/\s*active\s*/g, "");
toolbar_div.className = toolbar_div.className.replace(/\s*disabled-for-preview*/g, "");
}
} else {
} else{
// When the preview button is clicked for the first time,
// give some time for the transition from editor.css to fire and the view to slide from right to left,
// instead of just appearing.
setTimeout(function() {
setTimeout(function (){
preview.className += " editor-preview-active";
}, 1);
if(toolbar) {
if (toolbar){
toolbar.className += " active";
toolbar_div.className += " disabled-for-preview";
}
@ -524,7 +526,7 @@ export default class Action {
// Turn off side by side if needed
const sidebyside = cm.getWrapperElement().nextSibling;
if(/editor-preview-active-side/.test(sidebyside.className))
if (/editor-preview-active-side/.test(sidebyside.className))
this.toggleSideBySide(editor);
}
@ -542,10 +544,12 @@ export default class Action {
const cm = editor.codemirror;
Base.toggleHeading(cm, undefined, 1);
}
static toggleHeading2 (editor){
const cm = editor.codemirror;
Base.toggleHeading(cm, undefined, 2);
}
static toggleHeading3 (editor){
const cm = editor.codemirror;
Base.toggleHeading(cm, undefined, 3);
@ -598,10 +602,4 @@ export default class Action {
}
}

@ -4,7 +4,7 @@ import CodeMirrorSpellChecker from 'codemirror-spell-checker'
import marked from 'marked'
import 'codemirror/addon/edit/continuelist'
import 'codemirror/addon/display/fullscreen'
import 'codemirror/addon/mode/overla'
import 'codemirror/addon/mode/overlay'
import 'codemirror/addon/display/placeholder'
import 'codemirror/addon/selection/mark-selection'
import './codemirror/tablist'
@ -53,10 +53,14 @@ const createSep = () => {
}
const createTootlip = (title, action, shortcuts) => {
let actionName;
let tooltip = title;
if(action && shortcuts[utils.getBindingName(action)]) {
tooltip += " (" + utils.fixShortcut(shortcuts[actionName]) + ")"
if(action) {
actionName = utils.getBindingName(action);
if(shortcuts[actionName]) {
tooltip += " (" + utils.fixShortcut(shortcuts[actionName]) + ")";
}
}
return tooltip;
@ -69,6 +73,7 @@ const createTootlip = (title, action, shortcuts) => {
export class SimpleMDE extends Action {
constructor(options = {}) {
super()
// Used later to refer to it"s parent
options.parent = this;

Loading…
Cancel
Save