[ID CC-CC2022] Удаление ссылок

  • Автор темы Автор темы efodin
  • Дата начала Дата начала
Выдрал из своего скрипта кусок с кодом обработки выделения, много чего может прятаться в обычном выделении
...
.forEach сделал через мозилловский полифилл. Уж очень удобно.
и это не весь список. А вместо .forEach накидал map. Мне этого оказалось достаточным
Код:
Array.prototype.map = function(callback) {
    var len = this.length;
    while (len--) {
        callback(this[len]);
    }
}
 
Последнее редактирование:
Да, не весь. Я список конструкторов не гуглил, набросал только те типы, которые были нужны для конкретной задачи.
Полифилл для .map() тоже использую, в другом скрипте есть.
 
Ладно уговорили
JavaScript:
if (app.activeDocument.selection.length) {
 app.activeDocument.selection.forEach(function (obj) {
     if (obj.hasOwnProperty("findHyperlinks" )) obj.findHyperlinks().forEach(function (obj1) {
         obj1.remove();
     });
 });
 
forEach забыл прописать и скобку потерял
Ладно уговорили
JavaScript:
#target Indesign
Array.prototype.forEach = function(callback) {
    var len = this.length;
    while (len--) {
        callback(this[len]);
    }
}

if (app.activeDocument.selection.length) {
app.activeDocument.selection.forEach(function (obj) {
     if (obj.hasOwnProperty("findHyperlinks" )) obj.findHyperlinks().forEach(function (obj1) {
         obj1.remove();
     });
});
}
 
Последнее редактирование:
А можно и без forEach еще интереснее сделать:
JavaScript:
function removeHyper(obj1)
{
if (obj1.hasOwnProperty("findHyperlinks" ))
for (var obj1 in obj.findHyperlinks()) obj1.remove();
}
removeHyper(app.selection);
for (var obj in app.activeDocument.selection)
{
removeHyper(obj);
    
  
}
 
Последнее редактирование:
А можно и без forEach еще интереснее сделать:
А можно ещё поиздеваться
JavaScript:
#target Indesign
Array.prototype.map = function(callback) {
    var len = this.length;
    while (len--) {
        callback(this[len]);
    }
}

function removeHyperLinks(obj) {
    if (!obj.hasOwnProperty("findHyperlinks")) return;
    obj.findHyperlinks()
        .map(
            function(obj) {
                obj.remove()
            }
        )
}
app.selection.map(removeHyperLinks);
 
Резонно
 

Нет предела ) Можно пойти ещё дальше. Нормализовать работу как с выделениями инструментом "T", так и с текстовыми фреймами.
Всё. Хватит на сегодня - пойду, поработаю )
JavaScript:
#target Indesign
/**
 Скрипт удаляет гиперссылки в выбранных фреймах или выбраных тестовых областях
*/

Array.prototype.map = function(callback) {
    var len = this.length;
    while (len--) {
        callback(this[len]);
    }
}

Text.prototype.removeHyperLinks = function() {
    this.findHyperlinks()
        .map(
            function(obj) {
                if (!obj.hasOwnProperty("remove")) {
                    try { obj=obj[0]; }
                    catch(err) { return; }
                }
                obj.remove()
            }
        )
}

function removeHyperLinks(obj) {
    switch (obj.constructor.name) {
        case 'Text': 
            obj.removeHyperLinks();
            break;
        case 'TextFrame':
            obj.texts.everyItem().removeHyperLinks();
            break;
        default:
            break;
    }
}
app.selection.map(removeHyperLinks);
 
Осталось только прикрутить обход групп.
 
Осталось только прикрутить обход групп.
Групп, вставленных в текст как инлайн объекты?
Имхо, можно попробовать через фильтрацию Group.AllPageItems. Но на вскидку решения не вижу - там много мелких нюансов. А Group.texts какой-то чудной.
 
А что разве Text.findHyperlinks гиперлинки во встроенных в него объектах не находит?
 
А что разве Text.findHyperlinks гиперлинки во встроенных в него объектах не находит?
Я пишу - что-то странное, разбираться сейчас не стал
Texts в фрейме и группе ведёт себя по-разному. Ну, или я накосячил на скорую руку.
 
1572016699572.png
 
Последнее редактирование модератором:
Имхо, можно попробовать через фильтрацию Group.AllPageItems. Но на вскидку решения не вижу - там много мелких нюансов. А Group.texts какой-то чудной.
Я вот так сделал.
Добавил в свич код обработки группы.
JavaScript:
function processSelection(){
    if (app.activeDocument.selection.length) {
        app.activeDocument.selection.forEach(function (obj) {
            switch(obj.constructor.name){
                case "Group":
                    processGroup(obj);
                    break;
                   
                case "TextFrame":
                case "TextColumn":
                case "Text":
                case "Paragraph":
                    processPgfs(obj);
                    break;
                   
                case "TextStyleRange":
                case "Word":
                case "Line":
                case "Character":
                    performTransformation(obj);
                    break;
                   
                case "Table":
                    processTable(obj);
                    break;
                   
                case "Cell":
                    processCell(obj);
            }
        });
    }
}

function processGroup(myObj){
    var myItems = myObj.allPageItems;
    myItems.forEach(function (obj) {
        if (obj.constructor.name == "TextFrame")
            processTextFrame(obj);
    });
}
А уже внутри processTextFrame() работать так, как вы ранее описали в сообщении 68.
 
Последнее редактирование:
Это очевидное решение - обработать группу отдельно.
Повторяю - поймал баг и плюнул. Не хочу вечер после работы тратить.
 
А у меня вообще индизайна нет
 
А у меня вообще индизайна нет
Там где-то всплывает фигня из серии selection[0] - в одном случае передается полноценный объект, в другом кастрат с len=1 c доступом к свойствам через object[0]
В TextFrame.texts.everyItem().removeHyperLinks();
я поставил костыль
JavaScript:
                if (!obj.hasOwnProperty("remove")) {
                    try { obj=obj[0]; }
                    catch(err) { return; }
                }
В группе ещё один нужен. Но, ИМНХО, лучше понять суть.
Хочется попробовать собрать не просто работающий код - это можно в лоб, а красивый - хорошо читаемый.
Один костыль можно отмазать - хак. Два и более - не выйдет ;)
 
Последнее редактирование:
А конструктор то какой?
 
Последнее редактирование: