Override Parent Pages

Script for Adobe InDesign

Override all parent page items on every page of a document.

  • Override all parent pages or a single parent page
  • Override all layers or a single layer
  • Option to resolve text marker 'Current Page Number'
  • Option to remove parent page items overridden
  • Adapt open source to customize or create other scripts
Download
Override Parent Pages
Help me keep making new scripts by supporting my work. Click the PayPal button to contribute any amount you choose. Thank you. William Campbell

How-to Video

How to use the script

The options to override parent pages apply to all pages of the document including parent pages that have other parent pages applied.

The interface has three sections: Parent pages, Layers, and Options. Set options as desired and click the OK button to proceed.

Section 1: Parent pages

All — parent page items from every parent page are overridden. If not all layers, only parent page items on the selected layer are overridden.

Parent page — only parent page items from the selected parent page are overridden. Choose the desired parent page in the drop-down list. If not all layers, only parent page items on the selected layer are overridden.

Section 2: Layers

All — parent page items on every layer are overridden. If not all parent pages, only parent page items on the selected parent page are overridden.

Layer — parent page items on the selected layer are overridden. Choose the desired layer in the drop-down list. If not all parent pages, only parent page items on the selected parent page are overridden.

Section 3: Options

Resolve text marker 'Current Page Number' — once all parent page items are overridden, all instances of the text marker Current Page Number are replaced with the actual page number on which the text frame appears. Any parent page items not overridden remain unaffected.

Remove parent page items overridden — all parent page items overridden are removed from the parent page. If items to override are limited to a parent page or layer, items not overridden remain unaffected.

Source code

(download button below)

/*

Override Parent Pages
Copyright 2023 William Campbell
All Rights Reserved
https://www.marspremedia.com/contact

Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/

(function () {

    var title = "Override Parent Pages";

    if (!/indesign/i.test(app.name)) {
        alert("Script for InDesign", title, false);
        return;
    }

    // Script variables.
    var doc;
    var error;
    var layer;
    var layerNames;
    var parent;
    var parentNames;

    // Reusable UI variables.
    var g; // group
    var p; // panel
    var w; // window

    // Permanent UI variables.
    var btnCancel;
    var btnOk;
    var cbRemoveParentItems;
    var cbResolvePageNumbers;
    var g1;
    var listLayer;
    var listParent;
    var rbAllLayers;
    var rbAllParents;
    var rbOneLayer;
    var rbOneParent;

    // SETUP

    // Script requires open document.
    if (!app.documents.length) {
        alert("Open a document", title, false);
        return;
    }
    doc = app.activeDocument;
    layerNames = doc.layers.everyItem().name;
    parentNames = doc.masterSpreads.everyItem().name;

    // CREATE USER INTERFACE

    w = new Window("dialog", title);
    w.alignChildren = "fill";
    g1 = w.add("group");
    // Panel 'Parent pages'
    p = g1.add("panel", undefined, "Parent pages");
    p.alignChildren = "left";
    p.margins = [12, 20, 12, 12];
    rbAllParents = p.add("radiobutton", undefined, "All");
    rbAllParents.value = true;
    g = p.add("group");
    rbOneParent = g.add("radiobutton");
    listParent = g.add("dropdownlist", undefined, parentNames);
    listParent.enabled = false;
    listParent.preferredSize.width = 100;
    listParent.selection = 0;
    // Panel 'Layers'
    p = g1.add("panel", undefined, "Layers");
    p.alignChildren = "left";
    p.margins = [12, 20, 12, 12];
    rbAllLayers = p.add("radiobutton", undefined, "All");
    rbAllLayers.value = true;
    g = p.add("group");
    rbOneLayer = g.add("radiobutton");
    listLayer = g.add("dropdownlist", undefined, layerNames);
    listLayer.enabled = false;
    listLayer.preferredSize.width = 100;
    listLayer.selection = 0;
    // Panel 'Options'
    p = w.add("panel", undefined, "Options");
    p.alignChildren = "left";
    p.margins = [12, 20, 12, 12];
    cbResolvePageNumbers = p.add("checkbox", undefined, "Resolve text marker 'Current Page Number'");
    cbRemoveParentItems = p.add("checkbox", undefined, "Remove parent page items overridden");
    // Action Buttons
    g = w.add("group");
    g.alignment = "center";
    btnOk = g.add("button", undefined, "OK");
    btnCancel = g.add("button", undefined, "Cancel");
    // Panel Copyright
    p = w.add("panel");
    p.add("statictext", undefined, "Copyright 2023 William Campbell");

    // UI ELEMENT EVENT HANDLERS

    rbAllParents.onClick = function () {
        rbOneParent.value = false;
        listParent.enabled = false;
    };
    rbOneParent.onClick = function () {
        rbAllParents.value = false;
        listParent.enabled = true;
    };
    rbAllLayers.onClick = function () {
        rbOneLayer.value = false;
        listLayer.enabled = false;
    };
    rbOneLayer.onClick = function () {
        rbAllLayers.value = false;
        listLayer.enabled = true;
    };
    btnOk.onClick = function () {
        w.close(1);
    };
    btnCancel.onClick = function () {
        w.close(0);
    };

    // DISPLAY THE DIALOG

    if (w.show() == 1) {
        try {
            app.doScript(process, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, title);
            alert("Done");
        } catch (e) {
            error = error || e;
            alert("An error has occurred.\nLine " + error.line + ": " + error.message, title, true);
        }
    }

    //====================================================================
    //               END PROGRAM EXECUTION, BEGIN FUNCTIONS
    //====================================================================

    function ignoreWrap(pageItems) {
        var i;
        var pageItem;
        for (i = 0; i < pageItems.length; i++) {
            pageItem = pageItems[i];
            if (pageItem.getElements()[0].constructor.name == "Group") {
                // Is a group.
                // Recurse (call self)
                ignoreWrap(pageItem.pageItems);
            } else {
                // Not a group.
                if ("textFramePreferences" in pageItem) {
                    pageItem.textFramePreferences.ignoreWrap = true;
                }
            }
        }
    }

    function overrideParentPage(page) {
        var appliedMaster;
        var gb;
        var i;
        var pageItem1;
        var pageItem2;
        var rulerOrigin;
        // Requires ruler set to page origin.
        rulerOrigin = doc.viewPreferences.rulerOrigin;
        doc.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN;
        appliedMaster = page.appliedMaster;
        if (appliedMaster) {
            // Loop backwards to keep stacking order.
            for (i = appliedMaster.pageItems.length - 1; i > -1; i--) {
                pageItem1 = appliedMaster.pageItems[i];
                try {
                    gb = pageItem1.geometricBounds;
                    pageItem2 = pageItem1.override(page);
                    pageItem2.move([gb[1], gb[0]]);
                } catch (_) {
                    // Ignore.
                }
            }
        }
        // Restore ruler origin.
        doc.viewPreferences.rulerOrigin = rulerOrigin;
    }

    function process() {
        var i;
        var ii;
        var masterSpread;
        var page;
        var pageItem;
        var textFrame;
        // Preserve preferences.
        var preserve = {
            findChangeGrepPreferences: app.findGrepPreferences.properties,
            rulerOrigin: doc.viewPreferences.rulerOrigin
        };
        app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT;
        doc.viewPreferences.rulerOrigin = RulerOrigin.PAGE_ORIGIN;
        try {
            if (rbOneParent.value) {
                parent = doc.masterSpreads[listParent.selection.index];
            }
            if (rbOneLayer.value) {
                layer = doc.layers[listLayer.selection.index];
            }
            // Set ignore wrap true for parent page items to override.
            for (i = 0; i < doc.masterSpreads.length; i++) {
                masterSpread = doc.masterSpreads[i];
                if (!parent || masterSpread == parent) {
                    for (ii = 0; ii < masterSpread.pages.length; ii++) {
                        ignoreWrap(masterSpread.pages[ii].pageItems);
                    }
                }
            }
            // Override parent pages.
            for (i = 0; i < doc.masterSpreads.length; i++) {
                masterSpread = doc.masterSpreads[i];
                for (ii = 0; ii < masterSpread.pages.length; ii++) {
                    overrideParentPage(masterSpread.pages[ii]);
                }
            }
            // Override document pages.
            for (i = 0; i < doc.pages.length; i++) {
                overrideParentPage(doc.pages[i]);
            }
            if (cbResolvePageNumbers.value) {
                app.findGrepPreferences.findWhat = "~N";
                for (i = 0; i < doc.pages.length; i++) {
                    page = doc.pages[i];
                    app.changeGrepPreferences.changeTo = String(page.name);
                    for (ii = 0; ii < page.textFrames.length; ii++) {
                        textFrame = page.textFrames[ii];
                        if (textFrame.contents) {
                            textFrame.changeGrep();
                        }
                    }
                }
            }
            if (cbRemoveParentItems.value) {
                for (i = 0; i < doc.masterSpreads.length; i++) {
                    masterSpread = doc.masterSpreads[i];
                    if (!parent || masterSpread == parent) {
                        for (ii = masterSpread.pageItems.length - 1; ii > -1; ii--) {
                            pageItem = masterSpread.pageItems[ii];
                            if (!layer || pageItem.itemLayer == layer) {
                                pageItem.remove();
                            }
                        }
                    }
                }
            }
        } catch (e) {
            error = e;
            throw e;
        } finally {
            // Restore preferences.
            doc.viewPreferences.rulerOrigin = preserve.rulerOrigin;
            app.findGrepPreferences.properties = preserve.findChangeGrepPreferences;
            app.scriptPreferences.userInteractionLevel = UserInteractionLevels.INTERACT_WITH_ALL;
        }
    }

})();
Help me keep making new scripts by supporting my work. Click the PayPal button to contribute any amount you choose. Thank you. William Campbell
Download
Override Parent Pages

For help installing scripts, see How to Install and Use Scripts in Adobe Creative Cloud Applications.

IMPORTANT: scripts are developed for the latest Adobe Creative Cloud applications. Many scripts work in CC 2018 and later, even some as far back as CS6, but may not perform as expected, or run at all, when used in versions prior to 2018. Photoshop features Select Subject and Preserve Details 2.0 definitely fail prior to CC 2018 (version 19) as the features do not exist in earlier versions. For best results use the latest versions of Adobe Creative Cloud applications.

IMPORTANT: by downloading any of the scripts on this page you agree that the software is provided without any warranty, express or implied. USE AT YOUR OWN RISK. Always make backups of important data.

IMPORTANT: fees paid for software products are the purchase of a non-exclusive license to use the software product and do not grant the purchaser any degree of ownership of the software code. Author of the intellectual property and copyright holder William Campbell retains 100% ownership of all code used in all software products regardless of the inspiration for the software product design or functionality.