Найти адреса сайта и преобразовать в гиперссылки.

  • Автор темы Автор темы Dorm
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
Это две большие одесские разницы - селекшн и массив объектов класса Text
foundText = foundText.characters.itemByRange(foundText.characters[0], foundText.characters[foundText.characters.length - 2]);
Ну я ж говорю - нетривиально То есть, по русски,заднепроходно ;)
А эта операция не смертельно опасна для индизайна применительно к массиву, возвращаемому findGrep?
 
А эта операция не смертельно опасна для индизайна применительно к массиву, возвращаемому findGrep?
Я прямо-таки ошарашен такой постановкой вопроса! 'stick'
Операции с массивами, строками и т.п. объектами не смертельны. Проблемы могут быть (и бывают) от манипуляций с объектами непосредственно внутри документа. А в массиве чисто ссылки на определенный кусок текста.
 
Проблемы могут быть (и бывают) от манипуляций с объектами непосредственно внутри документа.
А чего оно рушит индизайн в вышеопиcанном (гораздо более безобидном) случае? 'hmmm'
 
Потому, что добавление destination не есть безобидный случай.
 
Потому, что добавление destination не есть безобидный случай.
Так там же все равно из него дистинэйшн будет создаваться
Пробовать надо в любом случае
С расовым индософтом никогда ничего нельзя сказать наверняка
 
Похоже, мне удалось-таки решить проблему конечных точек при помощи греп-запросов:

Код:
#target Indesign
// --- Assumptions --- //
//https://forums.adobe.com/message/3187356
// One document open
// Hyperlinks not necessarily labeled by character style
// You want all hyperlinks to be live
// Typesetter sometimes inserts a space or return in middle of URL to force a line break
// Space or return comes before period or slash per style manual
var doc=app.activeDocument;
try{
var cshyp = doc.characterStyles.add({name:"hyper"});
alert("Создан символьный стиль hyper");
}
catch (e){
var cshyp = doc.characterStyles.item("hyper");
}
// Compress stray www .'s
fn_grepChange (doc, "www(\\s|\\n)\\.", "www.", "hyper");
// Normalize to http://
fn_grepChange (doc, "(?<!\\/\\/)(www\\.([\\w\\-\\?\\=\\&]+([\\.\\/]?[\\%\\+]?)+)+)([\\l\\u\\d\\?\\%\\/])+", "http://$0", "hyper");
// Remove ( space or return ) before ( period or slash )
fn_grepChange (doc, "(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+[\\.\\/]?)+)(\\s|\\n)(\\.|\\/)", "$1$4", "hyper");
fn_grepChange (doc, "(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+([\\.\\/\\%\\+])*)+)([\\l\\u\\d\\?\\%\\/])+", "$0", "hyper");

// ---- Main ---- //
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeFootnotes = true;
// Regardless of character styles, find hyperlinks
app.findGrepPreferences.findWhat = '(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+([\\.\\/\\%\\+])*)+)([\\l\\u\\d\\?\\%\\/])+';
var found = app.findGrep();
var report = "found and activated "+String(found.length)+" links\n";
// make hyperlinks
for(i=0; i<found.length; i++)
    {
        var report = report+found[i].contents+"\n";
        
        var source = doc.hyperlinkTextSources.add(found[i]);   
        var dest=doc.hyperlinkURLDestinations.add(found[i].contents);
            
        doc.hyperlinks.add(source,dest, {visible:false, name:found[i].contents+"("+(i+1)+")"});
    
    }
// If exporting to PDF set include hyperlinks to true
PDFExportPreset.includeHyperlinks = true;
// To export to html, choose File-->Export for Dreamweaver
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
alert ( report );
function fn_grepChange (myDocument, regexFind, regexChange, cStyle) {
    // purpose: execute a grep change, otherwise known as a regex s///;
    //Initialize.
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    //Set the find options.
    app.findChangeGrepOptions.includeFootnotes = true;
    app.findChangeGrepOptions.includeHiddenLayers = false;
    app.findChangeGrepOptions.includeLockedLayersForFind = false;
    app.findChangeGrepOptions.includeLockedStoriesForFind = false;
    app.findChangeGrepOptions.includeMasterPages = false;
    //Search and change
    app.findGrepPreferences.findWhat = regexFind;
    app.changeGrepPreferences.changeTo = regexChange;
    app.changeGrepPreferences.appliedCharacterStyle= cStyle;
    myDocument.changeGrep();
  
    //Clear the find/change preferences.
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    }

// --- end of script --- //
 
Последнее редактирование:
Так там же все равно из него дистинэйшн будет создаваться
Проблема не в наличии или отсутствии точки. Проблема в попытке создать дестинейшн из текста, содержащего маркер дестинейшн. Что может (не утверждаю, но допускаю) поломать чуткий механизм так называемой интерактивности текста.
С расовым индософтом никогда ничего нельзя сказать наверняка
"Наговариваете вы на нашу семью. Грех это!" (с) Манька Облигация 'hell'
 
при помощи греп-запросов
"Я вот что-то не пойму, понимаешь". Зачем сперва искать грепом и помечать стилем тексты ссылок, а потом искать грепом же уже найденное и помеченное стилем. Почему не искать уже тупо по стилю?
 
Зачем сперва искать грепом и помечать стилем тексты ссылок, а потом искать грепом же уже найденное и помеченное стилем.
Если честно, я в данный метод даже не вникал, дабы сохранить незамутненность мышления '))'
 
"Я вот что-то не пойму, понимаешь". Зачем сперва искать грепом и помечать стилем тексты ссылок, а потом искать грепом же уже найденное и помеченное стилем. Почему не искать уже тупо по стилю?
Я об этом как раз и говорил тут. Но я этого делать не умею (о чём тоже там сказал), поэтому и откатил на тот этап, когда мы только вносили поправки дополнения в скрипт от azz, кардинальным образом его не переделывая.

А ошибка уже не выскакивает? Обвязка try-catch не нужна?
Нет, ошибка не вылезает.
 
Ну, может, azz объявится и сделает в собственном скрипте по уму ;)
Хотя, для начала, надо топикстартера дождаться, как у него работает.
 
Ну, может, azz объявится и сделает в собственном скрипте по уму ;)

Да, это правильно. Я в эту тему вклинился только потому, что хотел с грепами повозиться. А всё, что касается скрипта как такового, - для меня тёмный лес.
 
А вот когда вы пишете интересные грепы для выкусывания адресов, то в принципе учитываете то, что в URL не бывает пробелов? Вам это никак не облегчит задачу, нет?
А это, насколько я понимаю, ещё из этого первоисточника пришло. И, видать, реальной жизнью навеяно :)
 
А ошибка уже не выскакивает? Обвязка try-catch не нужна?
И всё-таки выскочила.

Так что апдейтим с Вашей поправкой:

Код:
#target Indesign
// --- Assumptions --- //
//https://forums.adobe.com/message/3187356
// One document open
// Hyperlinks not necessarily labeled by character style
// You want all hyperlinks to be live
// Typesetter sometimes inserts a space or return in middle of URL to force a line break
// Space or return comes before period or slash per style manual
var doc=app.activeDocument;
try{
var cshyp = doc.characterStyles.add({name:"hyper"});
alert("Создан символьный стиль hyper");
}
catch (e){
var cshyp = doc.characterStyles.item("hyper");
}
// Compress stray www .'s
fn_grepChange (doc, "www(\\s|\\n)\\.", "www.", "hyper");
// Normalize to http://
fn_grepChange (doc, "(?<!\\/\\/)(www\\.([\\w\\-\\?\\=\\&]+([\\.\\/]?[\\%\\+]?)+)+)([\\l\\u\\d\\?\\%\\/])+", "http://$0", "hyper");
// Remove ( space or return ) before ( period or slash )
fn_grepChange (doc, "(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+[\\.\\/]?)+)(\\s|\\n)(\\.|\\/)", "$1$4", "hyper");
// Символьный стиль hyper на все интернет-адреса
fn_grepChange (doc, "(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+([\\.\\/\\%\\+])*)+)([\\l\\u\\d\\?\\%\\/])+", "$0", "hyper");

// ---- Main ---- //
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeFootnotes = true;
// Regardless of character styles, find hyperlinks
app.findGrepPreferences.findWhat = '(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+([\\.\\/\\%\\+])*)+)([\\l\\u\\d\\?\\%\\/])+';
var found = app.findGrep();
var report = "found and activated "+String(found.length)+" links\n";
// make hyperlinks
for(i=0; i<found.length; i++)
try    {
        var report = report+found[i].contents+"\n";
        
        var source = doc.hyperlinkTextSources.add(found[i]);   
        var dest=doc.hyperlinkURLDestinations.add(found[i].contents);
            
        doc.hyperlinks.add(source,dest, {visible:false, name:found[i].contents+"("+(i+1)+")"});
    
    } catch ( err) {};
// If exporting to PDF set include hyperlinks to true
PDFExportPreset.includeHyperlinks = true;
// To export to html, choose File-->Export for Dreamweaver
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
alert ( report );
function fn_grepChange (myDocument, regexFind, regexChange, cStyle) {
    // purpose: execute a grep change, otherwise known as a regex s///;
    //Initialize.
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    //Set the find options.
    app.findChangeGrepOptions.includeFootnotes = true;
    app.findChangeGrepOptions.includeHiddenLayers = false;
    app.findChangeGrepOptions.includeLockedLayersForFind = false;
    app.findChangeGrepOptions.includeLockedStoriesForFind = false;
    app.findChangeGrepOptions.includeMasterPages = false;
    //Search and change
    app.findGrepPreferences.findWhat = regexFind;
    app.changeGrepPreferences.changeTo = regexChange;
    app.changeGrepPreferences.appliedCharacterStyle= cStyle;
    myDocument.changeGrep();
  
    //Clear the find/change preferences.
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    }

// --- end of script --- //
 
Я все внимательно прочел и буду тестить на конкретных примерах. Через пару дней отпишусь о результатах...
 
Я все внимательно прочел и буду тестить на конкретных примерах.

Я тоже потестил. Оказалось, что при обработке адресов мы забыли, что они могут содержать знак октоторпа (#):

Код:
http://forum.rudtp.ru/threads/najti-adresa-sajta-i-preobrazovat-v-giperssylki.63656/page-5#post-889682

Вот последняя китайская очередная версия нашего многострадального скрипта, которая это учитывает:

Код:
#target Indesign
// --- Assumptions --- //
//https://forums.adobe.com/message/3187356 (original)
//http://forum.rudtp.ru/threads/najti-adresa-sajta-i-preobrazovat-v-giperssylki.63656 (edited by azz, _MBK_, Eugenyus, LeonidB)
// One document open
// Hyperlinks not necessarily labeled by character style
// You want all hyperlinks to be live
// Typesetter sometimes inserts a space or return in middle of URL to force a line break
// Space or return comes before period or slash per style manual
var doc=app.activeDocument;
try{
var cshyp = doc.characterStyles.add({name:"hyper"});
alert("Создан символьный стиль hyper");
}
catch (e){
var cshyp = doc.characterStyles.item("hyper");
}
// Compress stray www .'s
fn_grepChange (doc, "www(\\s|\\n)\\.", "www.", "hyper");
// Normalize to http://
fn_grepChange (doc, "(?<!\\/\\/)(www\\.([\\w\\-\\?\\=\\&]+([\\.\\/]?[\\%\\+\\#]?)+)+)([\\l\\u\\d\\?\\%\\/])+", "http://$0", "hyper");
// Remove ( space or return ) before ( period or slash ) - запускается 3 раза на случай, если в одном адресе не один, а несколько (до 3-х) пробелов
fn_grepChange (doc, "(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+[\\.\\/]?)+)(\\s|\\n)(\\.|\\/)", "$1$4", "hyper");
fn_grepChange (doc, "(https?\\:\\/\\/.+)([\\s\\n]+)([\\.\\/])", "$1$3", "hyper");
fn_grepChange (doc, "(https?\\:\\/\\/.+)([\\s\\n]+)([\\.\\/])", "$1$3", "hyper");
// Символьный стиль hyper на все интернет-адреса
fn_grepChange (doc, "(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+([\\.\\/\\%\\+\\#])*)+)([\\l\\u\\d\\?\\%\\/])+", "$0", "hyper");

// ---- Main ---- //
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeFootnotes = true;
// Regardless of character styles, find hyperlinks
app.findGrepPreferences.findWhat = '(https?\\:\\/\\/([\\w\\-\\?\\=\\&]+([\\.\\/\\%\\+\\#])*)+)([\\l\\u\\d\\?\\%\\/])+';
var found = app.findGrep();
var report = "found and activated "+String(found.length)+" links\n";
// make hyperlinks
for(i=0; i<found.length; i++)
try    {
        var report = report+found[i].contents+"\n";
        
        var source = doc.hyperlinkTextSources.add(found[i]);   
        var dest=doc.hyperlinkURLDestinations.add(found[i].contents);
            
        doc.hyperlinks.add(source,dest, {visible:false, name:found[i].contents+"("+(i+1)+")"});
    
    } catch ( err) {};
// If exporting to PDF set include hyperlinks to true
PDFExportPreset.includeHyperlinks = true;
// To export to html, choose File-->Export for Dreamweaver
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
alert ( report );
function fn_grepChange (myDocument, regexFind, regexChange, cStyle) {
    // purpose: execute a grep change, otherwise known as a regex s///;
    //Initialize.
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    //Set the find options.
    app.findChangeGrepOptions.includeFootnotes = true;
    app.findChangeGrepOptions.includeHiddenLayers = false;
    app.findChangeGrepOptions.includeLockedLayersForFind = false;
    app.findChangeGrepOptions.includeLockedStoriesForFind = false;
    app.findChangeGrepOptions.includeMasterPages = false;
    //Search and change
    app.findGrepPreferences.findWhat = regexFind;
    app.changeGrepPreferences.changeTo = regexChange;
    app.changeGrepPreferences.appliedCharacterStyle= cStyle;
    myDocument.changeGrep();
  
    //Clear the find/change preferences.
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    }

// --- end of script --- //
 
А уже не стал на этом заострять внимание. Но для чистоты эксперимента надо указать, что в ссылках бывает и 2 двоеточия:
Код:
http://opil.ouplaw.com/view/10.1093/law:epil/9780199231690/law-9780199231690-e873
 
Я, если честно, уже и не понимаю, как при таком подходе ссылку от нессылки отличить. По идее, у вас получается, что внутри ссылки могут быть все символы, включая пробелы и практически все знаки препинания? Так как тогда определить конец ссылки? 'otbline'
 
Статус
Закрыто для дальнейших ответов.