6 changes: 6 additions & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ Alexandre Bique
alexey-k
Alex Piggott
Amsul
amuntean
Amy
Ananya Sen
anaran
AndersMad
Anders Nawroth
Anderson Mesquita
Andreas Reischuck
Andre von Houck
Andrey Lushnikov
Andy Joslin
Expand Down Expand Up @@ -128,6 +130,7 @@ Gabriel Horner
Gabriel Nahmias
galambalazs
Gautam Mehta
gekkoe
Gergely Hegykozi
Glenn Jorde
Glenn Ruehle
Expand All @@ -138,6 +141,7 @@ greengiant
Guillaume Massé
Guillaume Massé
Gustavo Rodrigues
Hakan Tunc
Hans Engel
Hardest
Hasan Karahan
Expand Down Expand Up @@ -268,6 +272,7 @@ nextrevision
nguillaumin
Ng Zhi An
Nicholas Bollweg
Nick Small
Niels van Groningen
Nikita Beloglazov
Nikita Vasilyev
Expand Down Expand Up @@ -334,6 +339,7 @@ Takuji Shimokawa
Tarmil
tfjgeorge
Thaddee Tyl
TheHowl
think
Thomas Dvornik
Thomas Schmid
Expand Down
4 changes: 2 additions & 2 deletions addon/comment/comment.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,12 @@
// Positions of the last startString before the start of the selection, and the first endString after it.
var lastStart = startLine.lastIndexOf(startString, from.ch);
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length);
if (lastStart != -1 && firstEnd != -1) return false;
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false;
// Positions of the first endString after the end of the selection, and the last startString before it.
firstEnd = endLine.indexOf(endString, to.ch);
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch);
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart;
if (firstEnd != -1 && lastStart != -1) return false;
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false;

self.operation(function() {
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)),
Expand Down
40 changes: 26 additions & 14 deletions addon/dialog/dialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
var wrap = cm.getWrapperElement();
var dialog;
dialog = wrap.appendChild(document.createElement("div"));
if (bottom) {
if (bottom)
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";
} else {
else
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top";
}

if (typeof template == "string") {
dialog.innerHTML = template;
} else { // Assuming it's a detached DOM element.
Expand All @@ -35,8 +35,11 @@
}

CodeMirror.defineExtension("openDialog", function(template, callback, options) {
if (!options) options = {};

closeNotification(this, null);
var dialog = dialogDiv(this, template, options && options.bottom);

var dialog = dialogDiv(this, template, options.bottom);
var closed = false, me = this;
function close(newVal) {
if (typeof newVal == 'string') {
Expand All @@ -45,34 +48,43 @@
if (closed) return;
closed = true;
dialog.parentNode.removeChild(dialog);
me.focus();

if (options.onClose) options.onClose(dialog);
}
}

var inp = dialog.getElementsByTagName("input")[0], button;
if (inp) {
if (options && options.value) inp.value = options.value;
if (options.value) inp.value = options.value;

if (options.onInput)
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);});
if (options.onKeyUp)
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});

CodeMirror.on(inp, "keydown", function(e) {
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }
if (e.keyCode == 13 || e.keyCode == 27) {
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {
inp.blur();
CodeMirror.e_stop(e);
close();
me.focus();
if (e.keyCode == 13) callback(inp.value);
}
if (e.keyCode == 13) callback(inp.value);
});
if (options && options.onKeyUp) {
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);});
}
if (options && options.value) inp.value = options.value;

if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close);

inp.focus();
CodeMirror.on(inp, "blur", close);
} else if (button = dialog.getElementsByTagName("button")[0]) {
CodeMirror.on(button, "click", function() {
close();
me.focus();
});

if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close);

button.focus();
CodeMirror.on(button, "blur", close);
}
return close;
});
Expand Down
4 changes: 4 additions & 0 deletions addon/edit/closetag.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@
replacements[i] = "/" + state.context.tagName + ">";
}
cm.replaceSelections(replacements);
ranges = cm.listSelections();
for (var i = 0; i < ranges.length; i++)
if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line)
cm.indentLine(ranges[i].head.line);
}

function indexOf(collection, elt) {
Expand Down
3 changes: 2 additions & 1 deletion addon/fold/xml-fold.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,9 @@
if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return;
var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch);
var start = end && toTagStart(iter);
if (!end || end == "selfClose" || !start || cmp(iter, pos) > 0) return;
if (!end || !start || cmp(iter, pos) > 0) return;
var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]};
if (end == "selfClose") return {open: here, close: null, at: "open"};

if (start[1]) { // closing tag
return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"};
Expand Down
110 changes: 53 additions & 57 deletions addon/hint/sql-hint.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

function getKeywords(editor) {
var mode = editor.doc.modeOption;
if(mode === "sql") mode = "text/x-sql";
if (mode === "sql") mode = "text/x-sql";
return CodeMirror.resolveMode(mode).keywords;
}

Expand All @@ -32,12 +32,12 @@
}

function addMatches(result, search, wordlist, formatter) {
for(var word in wordlist) {
if(!wordlist.hasOwnProperty(word)) continue;
if(Array.isArray(wordlist)) {
for (var word in wordlist) {
if (!wordlist.hasOwnProperty(word)) continue;
if (Array.isArray(wordlist)) {
word = wordlist[word];
}
if(match(search, word)) {
if (match(search, word)) {
result.push(formatter(word));
}
}
Expand All @@ -49,33 +49,30 @@
var string = token.string.substr(1);
var prevCur = Pos(cur.line, token.start);
var table = editor.getTokenAt(prevCur).string;
if( !tables.hasOwnProperty( table ) ){
if (!tables.hasOwnProperty(table))
table = findTableByAlias(table, editor);
}
var columns = tables[table];
if(!columns) {
return;
}
addMatches(result, string, columns,
function(w) {return "." + w;});
if (!columns) return;

addMatches(result, string, columns, function(w) {return "." + w;});
}

function eachWord(lineText, f) {
if( !lineText ){return;}
if (!lineText) return;
var excepted = /[,;]/g;
var words = lineText.split( " " );
for( var i = 0; i < words.length; i++ ){
f( words[i]?words[i].replace( excepted, '' ) : '' );
var words = lineText.split(" ");
for (var i = 0; i < words.length; i++) {
f(words[i]?words[i].replace(excepted, '') : '');
}
}

function convertCurToNumber( cur ){
function convertCurToNumber(cur) {
// max characters of a line is 999,999.
return cur.line + cur.ch / Math.pow( 10, 6 );
return cur.line + cur.ch / Math.pow(10, 6);
}

function convertNumberToCur( num ){
return Pos(Math.floor( num ), +num.toString().split( '.' ).pop());
function convertNumberToCur(num) {
return Pos(Math.floor(num), +num.toString().split('.').pop());
}

function findTableByAlias(alias, editor) {
Expand All @@ -86,79 +83,78 @@
var table = "";
var separator = [];
var validRange = {
start: Pos( 0, 0 ),
end: Pos( editor.lastLine(), editor.getLineHandle( editor.lastLine() ).length )
start: Pos(0, 0),
end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length)
};

//add separator
var indexOfSeparator = fullQuery.indexOf( CONS.QUERY_DIV );
while( indexOfSeparator != -1 ){
separator.push( doc.posFromIndex(indexOfSeparator));
indexOfSeparator = fullQuery.indexOf( CONS.QUERY_DIV, indexOfSeparator+1);
var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV);
while(indexOfSeparator != -1) {
separator.push(doc.posFromIndex(indexOfSeparator));
indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1);
}
separator.unshift( Pos( 0, 0 ) );
separator.push( Pos( editor.lastLine(), editor.getLineHandle( editor.lastLine() ).text.length ) );
separator.unshift(Pos(0, 0));
separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length));

//find valieRange
//find valid range
var prevItem = 0;
var current = convertCurToNumber( editor.getCursor() );
for( var i=0; i< separator.length; i++){
var _v = convertCurToNumber( separator[i] );
if( current > prevItem && current <= _v ){
validRange = { start: convertNumberToCur( prevItem ), end: convertNumberToCur( _v ) };
var current = convertCurToNumber(editor.getCursor());
for (var i=0; i< separator.length; i++) {
var _v = convertCurToNumber(separator[i]);
if (current > prevItem && current <= _v) {
validRange = { start: convertNumberToCur(prevItem), end: convertNumberToCur(_v) };
break;
}
prevItem = _v;
}

var query = doc.getRange(validRange.start, validRange.end, false);

for(var i=0; i < query.length; i++){
for (var i = 0; i < query.length; i++) {
var lineText = query[i];
eachWord( lineText, function( word ){
eachWord(lineText, function(word) {
var wordUpperCase = word.toUpperCase();
if( wordUpperCase === aliasUpperCase && tables.hasOwnProperty( previousWord ) ){
if (wordUpperCase === aliasUpperCase && tables.hasOwnProperty(previousWord)) {
table = previousWord;
}
if( wordUpperCase !== CONS.ALIAS_KEYWORD ){
if (wordUpperCase !== CONS.ALIAS_KEYWORD) {
previousWord = word;
}
});
if( table ){ break; }
if (table) break;
}
return table;
}

function sqlHint(editor, options) {
CodeMirror.registerHelper("hint", "sql", function(editor, options) {
tables = (options && options.tables) || {};
keywords = keywords || getKeywords(editor);
var cur = editor.getCursor();
var token = editor.getTokenAt(cur), end = token.end;
var result = [];
var search = token.string.trim();

var token = editor.getTokenAt(cur), start, end, search;
if (token.string.match(/^[.\w@]\w*$/)) {
search = token.string;
start = token.start;
end = token.end;
} else {
start = end = cur.ch;
search = "";
}
if (search.charAt(0) == ".") {
columnCompletion(result, editor);
if (!result.length) {
while (token.start && search.charAt(0) == ".") {
while (start && search.charAt(0) == ".") {
token = editor.getTokenAt(Pos(cur.line, token.start - 1));
start = token.start;
search = token.string + search;
}
addMatches(result, search, tables,
function(w) {return w;});
addMatches(result, search, tables, function(w) {return w;});
}
} else {
addMatches(result, search, keywords,
function(w) {return w.toUpperCase();});
addMatches(result, search, tables,
function(w) {return w;});
addMatches(result, search, tables, function(w) {return w;});
addMatches(result, search, keywords, function(w) {return w.toUpperCase();});
}

return {
list: result,
from: Pos(cur.line, token.start),
to: Pos(cur.line, end)
};
}
CodeMirror.registerHelper("hint", "sql", sqlHint);
return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)};
});
});
6 changes: 6 additions & 0 deletions addon/merge/merge.css
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@
color: #44c;
}

.CodeMirror-merge-copy-reverse {
position: absolute;
cursor: pointer;
color: #44c;
}

.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; }
.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; }

Expand Down
Loading