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

Статус
Закрыто для дальнейших ответов.

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Это две большие одесские разницы - селекшн и массив объектов класса Text
foundText = foundText.characters.itemByRange(foundText.characters[0], foundText.characters[foundText.characters.length - 2]);
Ну я ж говорю - нетривиально То есть, по русски,заднепроходно ;)
А эта операция не смертельно опасна для индизайна применительно к массиву, возвращаемому findGrep?
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
А эта операция не смертельно опасна для индизайна применительно к массиву, возвращаемому findGrep?
Я прямо-таки ошарашен такой постановкой вопроса! 'stick'
Операции с массивами, строками и т.п. объектами не смертельны. Проблемы могут быть (и бывают) от манипуляций с объектами непосредственно внутри документа. А в массиве чисто ссылки на определенный кусок текста.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Проблемы могут быть (и бывают) от манипуляций с объектами непосредственно внутри документа.
А чего оно рушит индизайн в вышеопиcанном (гораздо более безобидном) случае? 'hmmm'
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Потому, что добавление destination не есть безобидный случай.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Потому, что добавление destination не есть безобидный случай.
Так там же все равно из него дистинэйшн будет создаваться
Пробовать надо в любом случае
С расовым индософтом никогда ничего нельзя сказать наверняка
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 469
Реакции
1 528
Похоже, мне удалось-таки решить проблему конечных точек при помощи греп-запросов:

Код:
#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 --- //
 
Последнее редактирование:

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Так там же все равно из него дистинэйшн будет создаваться
Проблема не в наличии или отсутствии точки. Проблема в попытке создать дестинейшн из текста, содержащего маркер дестинейшн. Что может (не утверждаю, но допускаю) поломать чуткий механизм так называемой интерактивности текста.
С расовым индософтом никогда ничего нельзя сказать наверняка
"Наговариваете вы на нашу семью. Грех это!" (с) Манька Облигация 'hell'
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
при помощи греп-запросов
"Я вот что-то не пойму, понимаешь". Зачем сперва искать грепом и помечать стилем тексты ссылок, а потом искать грепом же уже найденное и помеченное стилем. Почему не искать уже тупо по стилю?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Зачем сперва искать грепом и помечать стилем тексты ссылок, а потом искать грепом же уже найденное и помеченное стилем.
Если честно, я в данный метод даже не вникал, дабы сохранить незамутненность мышления '))'
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 469
Реакции
1 528
"Я вот что-то не пойму, понимаешь". Зачем сперва искать грепом и помечать стилем тексты ссылок, а потом искать грепом же уже найденное и помеченное стилем. Почему не искать уже тупо по стилю?
Я об этом как раз и говорил тут. Но я этого делать не умею (о чём тоже там сказал), поэтому и откатил на тот этап, когда мы только вносили поправки дополнения в скрипт от azz, кардинальным образом его не переделывая.

А ошибка уже не выскакивает? Обвязка try-catch не нужна?
Нет, ошибка не вылезает.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Ну, может, azz объявится и сделает в собственном скрипте по уму ;)
Хотя, для начала, надо топикстартера дождаться, как у него работает.
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 469
Реакции
1 528
Ну, может, azz объявится и сделает в собственном скрипте по уму ;)

Да, это правильно. Я в эту тему вклинился только потому, что хотел с грепами повозиться. А всё, что касается скрипта как такового, - для меня тёмный лес.
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 469
Реакции
1 528
А вот когда вы пишете интересные грепы для выкусывания адресов, то в принципе учитываете то, что в URL не бывает пробелов? Вам это никак не облегчит задачу, нет?
А это, насколько я понимаю, ещё из этого первоисточника пришло. И, видать, реальной жизнью навеяно :)
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 469
Реакции
1 528
А ошибка уже не выскакивает? Обвязка 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 --- //
 

Dorm

Топикстартер
10 лет на форуме
Сообщения
574
Реакции
1
Я все внимательно прочел и буду тестить на конкретных примерах. Через пару дней отпишусь о результатах...
 

LeonidB

Их бин
10 лет на форуме
Сообщения
2 469
Реакции
1 528
Я все внимательно прочел и буду тестить на конкретных примерах.

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

Код:
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 --- //
 

Dorm

Топикстартер
10 лет на форуме
Сообщения
574
Реакции
1
А уже не стал на этом заострять внимание. Но для чистоты эксперимента надо указать, что в ссылках бывает и 2 двоеточия:
Код:
http://opil.ouplaw.com/view/10.1093/law:epil/9780199231690/law-9780199231690-e873
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Я, если честно, уже и не понимаю, как при таком подходе ссылку от нессылки отличить. По идее, у вас получается, что внутри ссылки могут быть все символы, включая пробелы и практически все знаки препинания? Так как тогда определить конец ссылки? 'otbline'
 
Статус
Закрыто для дальнейших ответов.