2015-12-02 5 views
0

Я пытаюсь исправить все гиперссылки в своих файлах indesign и заменить https на http. прямо сейчас, для того, чтобы работать, я запускаю этот скрипт ..Indesign Script: замена всех случаев (https) на (http) без дублирования

var 
 
    i; 
 
hls = app.activeDocument.hyperlinkURLDestinations; 
 
for (i = 0; i < hls.length; i++) { 
 
    if (!hls[i].destinationURL.match('http://')) { 
 
    hls[i].destinationURL = 'http://' + hls[i].destinationURL; 
 
    } 
 
}

следуют этому сценарию, выбирая протокол HTTPS, который будет заменен на HTTP ...

Menu for find/replace

main(); 
 
function main(){ 
 
\t var d = app.dialogs.add({name:"Replace Hyperlink URL Values"}); 
 
\t var col1 = d.dialogColumns.add(); 
 
\t var col2 = d.dialogColumns.add(); 
 
\t col1.staticTexts.add({staticLabel:"Find (GREP):"}); 
 
\t col1.staticTexts.add({staticLabel:"Replace:"}); 
 
\t var find = col2.textEditboxes.add({minWidth:100}); 
 
\t var change = col2.textEditboxes.add({minWidth:100}); 
 
\t var result = d.show(); 
 
\t if(!result){ 
 
\t \t d.destroy(); 
 
\t \t return; 
 
\t } 
 
\t var grepForFind = RegExp(find.editContents,"g"); 
 
\t var grepForReplace = change.editContents; 
 
\t d.destroy(); 
 
\t var dests = app.documents[0].hyperlinkURLDestinations.everyItem().getElements(); 
 
\t for(var i=0;i<dests.length;i++){ 
 
\t \t dests[i].destinationURL = dests[i].destinationURL.replace(grepForFind,grepForReplace); 
 
\t } 
 
}

Как только оба из них были запущены, я заметил, что «http: //» дублируется в гиперссылках, которые уже содержат «http: //».

Итак, я запускаю второй скрипт, снова заменяя (http: // + http: //) на «http: //», который решает проблему.

Мой вопрос заключается в том, как сделать его одним сценарием, который будет работать в первый раз.

** Примечание: ** Второй скрипт представляет this error, если первый не запущен, что также меня озадачивает.

Любая помощь будет оценена по достоинству.

ответ

2

В первом скрипте вы получаете дубликат http: //, потому что добавляете его к своей собственной ссылке, то есть «http: //» + «http: // ...». Вы должны заменить строку, чтобы не добавить:

var 
 
    i; 
 
hls = app.activeDocument.hyperlinkURLDestinations; 
 
for (i = 0; i < hls.length; i++) { 
 
    if (!hls[i].destinationURL.match('http://')) { 
 
    hls[i].destinationURL = hls[i].destinationURL.replace(/^https/,"http"); 
 
    } 
 
}

Другой подход:

Hyperlink.prototype.grep = function(findString,repString, specifiers){ 
 
\t var r, dests = this.destination, url, dest, n = dests.length; 
 
\t 
 
\t if (!n 
 
\t || !findString 
 
\t || !repString 
 
\t || typeof (findString) != "string" 
 
\t || typeof (repString) != "string" 
 
\t || (specifiers && typeof (specifiers)!="string") 
 
\t) return; 
 
\t 
 
\t r = new RegExp (findString, specifiers? specifiers:"gi"); 
 
\t 
 
\t while (n--) { 
 
\t \t dest = dests[n]; 
 
\t \t if (dest instanceof HyperlinkURLDestination) { 
 
\t \t \t url = dest.destinationURL; 
 
\t \t \t dest.destinationURL = url.replace (r, repString); 
 
\t \t } 
 
\t } 
 
} 
 

 
main(); 
 
function main(){ 
 
\t var d = app.dialogs.add({name:"Replace Hyperlink URL Values"}); 
 
\t var col1 = d.dialogColumns.add(); 
 
\t var col2 = d.dialogColumns.add(); 
 
\t col1.staticTexts.add({staticLabel:"Find (GREP):"}); 
 
\t col1.staticTexts.add({staticLabel:"Replace:"}); 
 
\t var find = col2.textEditboxes.add({minWidth:100, editContents:"^https"}); 
 
\t var change = col2.textEditboxes.add({minWidth:100, editContents:"http"}); 
 
\t var result = d.show(); 
 
\t if(!result){ 
 
\t \t d.destroy(); 
 
\t \t return; 
 
\t } 
 

 
\t var grepForFind = RegExp(find.editContents,"g"); 
 
\t var grepForReplace = change.editContents; 
 
\t app.documents[0].hyperlinks.everyItem().grep(find.editContents, change.editContents, "g"); 
 
\t d.destroy(); 
 
}

+1

хорошо видно Jongware;) – Loic

+0

Я проверяю, как она работает прямо сейчас! Заранее спасибо. –

+0

Когда я запускаю скрипт, появляется [эта ошибка] (https://gyazo.com/128d4717dec55c00d0fae7454ccfbf13). –

0

Bass

Я подбежала всеконфигураций и за исключением пустого адреса URL, который действительно выдает ошибку, я не могу воспроизвести то, с чем вы сталкиваетесь. Возможно, попробуйте этот новый фрагмент? Если все еще не удается, вы можете поделиться файлом? Перейдите на ozalto.com на странице контактов, если хотите.

Hyperlink.prototype.grep = function(findString,repString, specifiers){ 
 
\t var r, dests = this.destination, url, dest, n = dests.length; 
 
\t 
 
\t if (!n 
 
\t || !findString 
 
\t || !repString 
 
\t || typeof (findString) != "string" 
 
\t || typeof (repString) != "string" 
 
\t || (specifiers && typeof (specifiers)!="string") 
 
\t) return; 
 
\t 
 
\t r = new RegExp (findString, specifiers? specifiers:"gi"); 
 
\t 
 
\t while (n--) { 
 
\t \t dest = dests[n]; 
 
\t \t if (dest instanceof HyperlinkURLDestination) { 
 
\t \t \t url = dest.destinationURL; 
 
\t \t \t url!="" && dest.destinationURL = url.replace (r, repString); 
 
\t \t } 
 
\t } 
 
} 
 

 
main(); 
 
function main(){ 
 
\t var d = app.dialogs.add({name:"Replace Hyperlink URL Values"}); 
 
\t var col1 = d.dialogColumns.add(); 
 
\t var col2 = d.dialogColumns.add(); 
 
\t col1.staticTexts.add({staticLabel:"Find (GREP):"}); 
 
\t col1.staticTexts.add({staticLabel:"Replace:"}); 
 
\t var find = col2.textEditboxes.add({minWidth:100, editContents:"^https"}); 
 
\t var change = col2.textEditboxes.add({minWidth:100, editContents:"http"}); 
 
\t var result = d.show(); 
 
\t if(!result){ 
 
\t \t d.destroy(); 
 
\t \t return; 
 
\t } 
 

 
\t var grepForFind = RegExp(find.editContents,"g"); 
 
\t var grepForReplace = change.editContents; 
 
\t app.documents[0].hyperlinks.everyItem().grep(find.editContents, change.editContents, "g"); 
 
\t d.destroy(); 
 
}

+0

К сожалению, я не могу поделиться ни одним из наших файлов, но все они очень большие, со страницами из других файлов ссылок. Этот фрагмент генерирует ту же ошибку и открывает один из файлов справки. –