mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-04-18 15:15:48 +02:00
Fix template plugin to handle combining {ajax} and {cursor} together
This commit is contained in:
parent
2a51371aca
commit
d800ee2d28
@ -82,20 +82,30 @@ enabled(){
|
|||||||
|
|
||||||
// template implementation
|
// template implementation
|
||||||
|
|
||||||
var readTemplateToken = (contents, token, replacement) => {
|
var readTemplateTokens = (contents, tokenData) => {
|
||||||
let tokenStart = "{"+token;
|
|
||||||
let currentIndex = -1;
|
let currentIndex = -1;
|
||||||
let startIndex = -1;
|
let startIndex = -1;
|
||||||
let endIndex = -1;
|
let endIndex = -1;
|
||||||
|
|
||||||
let data = [];
|
let data = [];
|
||||||
|
let tokenNames = Object.keys(tokenData);
|
||||||
|
|
||||||
while((currentIndex = contents.indexOf(tokenStart, currentIndex)) !== -1){
|
while((currentIndex = contents.indexOf('{', currentIndex)) !== -1){
|
||||||
let entry = [ currentIndex ];
|
startIndex = currentIndex+1;
|
||||||
|
|
||||||
|
for(; startIndex < contents.length; startIndex++){
|
||||||
|
if (!tokenNames.some(name => contents[startIndex] === name[startIndex-currentIndex-1])){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
startIndex = currentIndex+tokenStart.length;
|
|
||||||
endIndex = startIndex;
|
endIndex = startIndex;
|
||||||
|
|
||||||
|
let token = contents.substring(currentIndex+1, startIndex);
|
||||||
|
let replacement = tokenData[token] || "";
|
||||||
|
|
||||||
|
let entry = [ token, currentIndex ];
|
||||||
|
|
||||||
if (contents[endIndex] === '#'){
|
if (contents[endIndex] === '#'){
|
||||||
++endIndex;
|
++endIndex;
|
||||||
|
|
||||||
@ -125,7 +135,9 @@ enabled(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
data.push(entry);
|
data.push(entry);
|
||||||
contents = contents.substring(0, currentIndex)+(replacement || "")+contents.substring(endIndex+1);
|
|
||||||
|
contents = contents.substring(0, currentIndex)+replacement+contents.substring(endIndex+1);
|
||||||
|
currentIndex += replacement.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [ contents, data ];
|
return [ contents, data ];
|
||||||
@ -151,53 +163,65 @@ enabled(){
|
|||||||
if (ele.length === 0)return;
|
if (ele.length === 0)return;
|
||||||
|
|
||||||
let value = append ? ele.val()+contents : contents;
|
let value = append ? ele.val()+contents : contents;
|
||||||
let tokensCursor = null;
|
let prevLength = value.length;
|
||||||
let tokensAjax = null;
|
|
||||||
|
|
||||||
[value, tokensCursor] = readTemplateToken(value, "cursor");
|
let tokens = null;
|
||||||
[value, tokensAjax] = readTemplateToken(value, "ajax", "(...)");
|
|
||||||
|
[value, tokens] = readTemplateTokens(value, {
|
||||||
|
"cursor": "",
|
||||||
|
"ajax": "(...)"
|
||||||
|
});
|
||||||
|
|
||||||
ele.val(value);
|
ele.val(value);
|
||||||
ele.focus();
|
ele.focus();
|
||||||
|
|
||||||
if (tokensCursor.length === 1){
|
ele[0].selectionStart = ele[0].selectionEnd = value.length;
|
||||||
let [ index, length ] = tokensCursor[0];
|
|
||||||
ele[0].selectionStart = index;
|
let promises = [];
|
||||||
ele[0].selectionEnd = index+(length | 0 || 0);
|
let indexOffset = 0;
|
||||||
}
|
|
||||||
else{
|
for(let token of tokens){
|
||||||
ele[0].selectionStart = ele[0].selectionEnd = value.length;
|
switch(token[0]){
|
||||||
|
case "cursor":
|
||||||
|
let [, index1, length ] = token;
|
||||||
|
ele[0].selectionStart = index1;
|
||||||
|
ele[0].selectionEnd = index1+(length | 0 || 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ajax":
|
||||||
|
let [, index2, evaluator, url ] = token;
|
||||||
|
|
||||||
|
if (!url){
|
||||||
|
url = evaluator;
|
||||||
|
evaluator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
promises.push(doAjaxRequest(url, evaluator).then(result => {
|
||||||
|
let diff = result.length-5; // "(...)".length
|
||||||
|
let realIndex = indexOffset+index2;
|
||||||
|
|
||||||
|
let val = ele.val();
|
||||||
|
ele.val(val.substring(0, realIndex)+result+val.substring(realIndex+5));
|
||||||
|
|
||||||
|
indexOffset += diff;
|
||||||
|
}));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tokensAjax.length > 0){
|
if (promises.length > 0){
|
||||||
let promises = [];
|
let selStart = ele[0].selectionStart;
|
||||||
let indexOffset = 0;
|
let selEnd = ele[0].selectionEnd;
|
||||||
|
|
||||||
for(let token of tokensAjax){
|
|
||||||
let [ index, evaluator, url ] = token;
|
|
||||||
|
|
||||||
if (!url){
|
|
||||||
url = evaluator;
|
|
||||||
evaluator = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
promises.push(doAjaxRequest(url, evaluator).then(result => {
|
|
||||||
let diff = result.length-5; // "(...)".length
|
|
||||||
let realIndex = indexOffset+index;
|
|
||||||
|
|
||||||
let val = ele.val();
|
|
||||||
ele.val(val.substring(0, realIndex)+result+val.substring(realIndex+5));
|
|
||||||
|
|
||||||
ele[0].selectionStart += diff;
|
|
||||||
ele[0].selectionEnd += diff;
|
|
||||||
indexOffset += diff;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
ele.prop("disabled", true);
|
ele.prop("disabled", true);
|
||||||
|
|
||||||
Promise.all(promises).then(() => {
|
Promise.all(promises).then(() => {
|
||||||
ele.prop("disabled", false);
|
ele.prop("disabled", false);
|
||||||
|
ele.focus();
|
||||||
|
|
||||||
|
ele[0].selectionStart = selStart+indexOffset;
|
||||||
|
ele[0].selectionEnd = selEnd+indexOffset;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user