[ID CC-CC2022] Скрипт для гиперссылки на URL из клипборда

  • Автор темы Автор темы LeonidB
  • Дата начала Дата начала

LeonidB

Шпационный шмотритель
Топикстартер
10 лет на форуме
Сообщения
2 485
Реакции
1 536
Подскажите, пожалуйста, знает ли кто-нибудь (или можно ли написать, если несложно) скрипт, который бы выделенному тексту цеплял гиперссылку (URL) с заданными заранее параметрами, а в качестве назначения брал адрес из клипборда (если в клипборде ничего нет или неподдерживаемые данные, то либо выдавал бы ошибку, либо просто ничего не делал)?

Вот так:
Hyperlink1.jpg Hyperlink2.jpg Hyperlink3.jpg
 
Можно. Обожди немного, если не суперсрочно.
 
  • Спасибо
Реакции: LeonidB
JavaScript:
function clipboard2hyperlink () {
    if (!app.documents.length) {
        return false;
    }
    var doc = app.activeDocument;
    if (app.selection.length != 1 || !app.selection[0].hasOwnProperty('characters')) {
        return false;
    }
    var text = app.selection[0].getElements()[0];
    var shadow = doc.pages[0].textFrames.add(undefined, undefined, undefined, {geometricBounds: [0,0,1,1]});
    shadow.parentStory.insertionPoints[0].select();
    app.paste();
    if ((/[\w]/).test(shadow.parentStory.contents.toString())) {
        while (hiperlinkSources = text.findHyperlinks(), hiperlinkSources.length) {
            hiperlinkSources[hiperlinkSources.length - 1].remove();
        }
        var source = doc.hyperlinkTextSources.add(text);
        var dest = doc.hyperlinkURLDestinations.add(shadow.parentStory.contents.toString());
        var hyperlink = doc.hyperlinks.add(source, dest);
        if (charStyle = doc.characterStyles.itemByName('Hyperlink'), charStyle.isValid) {
            source.appliedCharacterStyle = charStyle;
        }
    }
    shadow.remove();
}

app.doScript(clipboard2hyperlink, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT, 'Hyperlink by Clipboard');
 
Супер!
'cooll)' 'alil''dans))'
 
JavaScript:
function clipboard2hyperlink () {
    if (!app.documents.length) {
        return false;
    }
    var doc = app.activeDocument;
    if (app.selection.length != 1 || !app.selection[0].hasOwnProperty('characters')) {
        return false;
    }
    var text = app.selection[0].getElements()[0];
    var shadow = doc.pages[0].textFrames.add(undefined, undefined, undefined, {geometricBounds: [0,0,1,1]});
    shadow.parentStory.insertionPoints[0].select();
    app.paste();
    if ((/[\w]/).test(shadow.parentStory.contents.toString())) {
        while (hiperlinkSources = text.findHyperlinks(), hiperlinkSources.length) {
            hiperlinkSources[hiperlinkSources.length - 1].remove();
        }
        var source = doc.hyperlinkTextSources.add(text);
        var dest = doc.hyperlinkURLDestinations.add(shadow.parentStory.contents.toString());
        var hyperlink = doc.hyperlinks.add(source, dest);
        if (charStyle = doc.characterStyles.itemByName('Hyperlink'), charStyle.isValid) {
            source.appliedCharacterStyle = charStyle;
        }
    }
    shadow.remove();
}

app.doScript(clipboard2hyperlink, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT, 'Hyperlink by Clipboard');

А можно ли как-то изменить этот скрипт, чтобы цеплял гиперссылку из клипборда не на выделенный текст, а на выделенный объект (фрейм)?
 

Вложения

  • Hyperlink2.jpg
    Hyperlink2.jpg
    29.8 КБ · Просм.: 14
А можно ли как-то изменить этот скрипт, чтобы цеплял гиперссылку из клипборда не на выделенный текст, а на выделенный объект (фрейм)?

Пока Олег не пришел, можно попробовать это вот ИИ-поделие. У меня сработало

JavaScript:
function clipboard2hyperlink() {
    if (!app.documents.length) {
        return false;
    }
    
    var doc = app.activeDocument;
    
    // Check if selection is a frame
    if (app.selection.length != 1 || !(app.selection[0] instanceof Rectangle ||
                                      app.selection[0] instanceof Oval ||
                                      app.selection[0] instanceof Polygon ||
                                      app.selection[0] instanceof TextFrame ||
                                      app.selection[0] instanceof GraphicFrame)) {
        alert("Please select a frame.");
        return false;
    }
    
    var selectedFrame = app.selection[0];
    
    // Create temporary text frame to get clipboard content
    var shadow = doc.pages[0].textFrames.add(undefined, undefined, undefined, {geometricBounds: [0,0,1,1]});
    shadow.parentStory.insertionPoints[0].select();
    app.paste();
    
    // Check if clipboard has valid content
    if ((/[\w]/).test(shadow.parentStory.contents.toString())) {
        // Remove any existing hyperlinks associated with the selected frame
        for (var i = doc.hyperlinks.length - 1; i >= 0; i--) {
            try {
                var hyperlink = doc.hyperlinks[i];
                var source = hyperlink.source;
                
                // Check if the source is a page item source and references our selected frame
                if (source instanceof HyperlinkPageItemSource && source.sourcePageItem == selectedFrame) {
                    hyperlink.remove();
                }
            } catch (e) {
                // Skip if there's an error checking this hyperlink
            }
        }
        
        // Create hyperlink source from the selected frame
        var source = doc.hyperlinkPageItemSources.add(selectedFrame);
        
        // Create hyperlink destination from clipboard content
        var dest = doc.hyperlinkURLDestinations.add(shadow.parentStory.contents.toString());
        
        // Create hyperlink
        var hyperlink = doc.hyperlinks.add(source, dest);
    }
    
    // Remove temporary text frame
    shadow.remove();
}

app.doScript(clipboard2hyperlink, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT, 'Hyperlink Frame by Clipboard');
 
Пока Олег не пришел, можно попробовать это вот ИИ-поделие. У меня сработало

JavaScript:
function clipboard2hyperlink() {
    if (!app.documents.length) {
        return false;
    }
   
    var doc = app.activeDocument;
   
    // Check if selection is a frame
    if (app.selection.length != 1 || !(app.selection[0] instanceof Rectangle ||
                                      app.selection[0] instanceof Oval ||
                                      app.selection[0] instanceof Polygon ||
                                      app.selection[0] instanceof TextFrame ||
                                      app.selection[0] instanceof GraphicFrame)) {
        alert("Please select a frame.");
        return false;
    }
   
    var selectedFrame = app.selection[0];
   
    // Create temporary text frame to get clipboard content
    var shadow = doc.pages[0].textFrames.add(undefined, undefined, undefined, {geometricBounds: [0,0,1,1]});
    shadow.parentStory.insertionPoints[0].select();
    app.paste();
   
    // Check if clipboard has valid content
    if ((/[\w]/).test(shadow.parentStory.contents.toString())) {
        // Remove any existing hyperlinks associated with the selected frame
        for (var i = doc.hyperlinks.length - 1; i >= 0; i--) {
            try {
                var hyperlink = doc.hyperlinks[i];
                var source = hyperlink.source;
               
                // Check if the source is a page item source and references our selected frame
                if (source instanceof HyperlinkPageItemSource && source.sourcePageItem == selectedFrame) {
                    hyperlink.remove();
                }
            } catch (e) {
                // Skip if there's an error checking this hyperlink
            }
        }
       
        // Create hyperlink source from the selected frame
        var source = doc.hyperlinkPageItemSources.add(selectedFrame);
       
        // Create hyperlink destination from clipboard content
        var dest = doc.hyperlinkURLDestinations.add(shadow.parentStory.contents.toString());
       
        // Create hyperlink
        var hyperlink = doc.hyperlinks.add(source, dest);
    }
   
    // Remove temporary text frame
    shadow.remove();
}

app.doScript(clipboard2hyperlink, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT, 'Hyperlink Frame by Clipboard');

Работает, спасибо!