1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-20 05:37:58 +01:00

Adjust buffer.currentWord not to modify the selection. Add 'isk', undocumented until we decide on an interface.

This commit is contained in:
Kris Maglione
2011-02-01 12:13:15 -05:00
parent 0229d12472
commit b81a7c662f
2 changed files with 57 additions and 47 deletions

View File

@@ -517,33 +517,27 @@ var Buffer = Module("buffer", {
* null, it tries to guess the word that the caret is
* positioned in.
*
* NOTE: might change the selection
*
* @returns {string}
*/
getCurrentWord: function (win) {
win = win || this.focusedFrame || content;
let selection = win.getSelection();
if (selection.rangeCount == 0)
return "";
let range = selection.getRangeAt(0);
if (selection.isCollapsed) {
let controller = util.selectionController(win);
let caretmode = controller.getCaretEnabled();
controller.setCaretEnabled(true);
// Only move backwards if the previous character is not a space.
if (range.startOffset > 0 && !/\s/.test(range.startContainer.textContent[range.startOffset - 1]))
controller.wordMove(false, false);
controller.wordMove(true, true);
controller.setCaretEnabled(caretmode);
return String.match(selection, /\w*/)[0];
let range = selection.getRangeAt(0).cloneRange();
if (range.collapsed) {
let re = options.get("iskeyword").regexp;
util.dump(String.quote(range));
Editor.extendRange(range, true, re, true);
util.dump(String.quote(range));
Editor.extendRange(range, false, re, true);
util.dump(String.quote(range) + "\n\n\n");
}
return util.domToString(range);
},
get currentWord() this.getCurrentWord(this.focusedFrame),
/**
* Returns true if a scripts are allowed to focus the given input
* element or input elements in the given window.
@@ -1836,7 +1830,7 @@ var Buffer = Module("buffer", {
mappings.add(myModes, ["Y", "<yank-word>"],
"Copy selected text or current word",
function () {
let sel = buffer.getCurrentWord();
let sel = buffer.currentWord;
dactyl.assert(sel);
dactyl.clipboardWrite(sel, true);
});
@@ -1902,6 +1896,17 @@ var Buffer = Module("buffer", {
function () { buffer.showPageInfo(true); });
},
options: function () {
options.add(["iskeyword", "isk"],
"Regular expression defining which characters constitute word characters",
"string", '[^\\s.,!?:;/"\'^$%&?()[\\]{}<>#*+|=~_-]',
{
setter: function (value) {
this.regexp = util.regexp(value);
return value;
},
validator: function (value) RegExp(value)
});
options.add(["nextpattern"],
"Patterns to use when guessing the next page in a document sequence",
"regexplist", UTF8("'\\bnext\\b',^>$,^(>>|»)$,^(>|»),(>|»)$,'\\bmore\\b'"),

View File

@@ -387,6 +387,38 @@ var Editor = Module("editor", {
}
},
}, {
extendRange: function extendRange(range, forward, re, sameWord) {
// FIXME: This could be so much simpler if I had more sleep.
function advance(positive) {
let tmp = range.cloneRange();
while (tmp.endOffset < nodeRange.endOffset) {
tmp.setEnd(tmp.endContainer, tmp.endOffset + 1);
if (!re.test(String.slice(tmp, -1)) == positive)
break;
range.setEnd(tmp.endContainer, tmp.endOffset);
}
}
function retreat(positive) {
let tmp = range.cloneRange();
while (tmp.startOffset > 0) {
tmp.setStart(tmp.startContainer, tmp.startOffset - 1);
if (re.test(String(tmp)[0]) == positive)
break;
range.setStart(tmp.startContainer, tmp.startOffset);
}
}
let nodeRange = range.cloneRange();
nodeRange.selectNodeContents(range.startContainer);
let charge = forward ? advance : retreat;
charge(true);
if (!sameWord || !forward)
charge(false);
return range;
},
getEditor: function (elem) {
if (arguments.length === 0) {
dactyl.assert(dactyl.focusedElement);
@@ -520,35 +552,8 @@ var Editor = Module("editor", {
}
function updateRange(editor, forward, re, modify) {
// FIXME: This could be so much simpler if I had more sleep.
function advance(positive) {
let tmp = range.cloneRange();
while (tmp.endOffset < nodeRange.endOffset) {
tmp.setEnd(tmp.endContainer, tmp.endOffset + 1);
if (!re.test(String.slice(tmp, -1)) == positive)
break;
range.setEnd(tmp.endContainer, tmp.endOffset);
}
}
function retreat(positive) {
let tmp = range.cloneRange();
while (tmp.startOffset > 0) {
tmp.setStart(tmp.startContainer, tmp.startOffset - 1);
if (re.test(String(tmp)[0]) == positive)
break;
range.setStart(tmp.startContainer, tmp.startOffset);
}
}
let range = editor.selection.getRangeAt(0).cloneRange();
let nodeRange = range.cloneRange();
nodeRange.selectNodeContents(range.startContainer);
let charge = forward ? advance : retreat;
charge(true);
charge(false);
let range = Editor.extendRange(editor.selection.getRangeAt(0),
forward, re, false);
modify(range);
editor.selection.removeAllRanges();
editor.selection.addRange(range);
@@ -749,7 +754,7 @@ var Editor = Module("editor", {
modes.pop();
}
else
dactyl.clipboardWrite(buffer.getCurrentWord(), true);
dactyl.clipboardWrite(buffer.currentWord, true);
});
mappings.add([modes.VISUAL, modes.TEXT_EDIT],