1
0
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:
chylex 2017-06-11 01:05:15 +02:00
parent 2a51371aca
commit d800ee2d28

View File

@ -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;
}); });
} }