Je viens de découvrir que l'objet Footnote fournit depuis la nuit des temps une méthode convertToText. Celle-ci convertit la note de bas de page en fragment de texte et place ledit fragment à la position originale qu'occupait l'appel de note dans le texte principal. Voilà une bien étrange chose, car j'ignore souverainement où se trouve l'hypothétique fonction Reconvertir la note de bas de page en texte dans l'interface d'InDesign. (Peut-être sera-ce l'objet d'une future rubrique « Fonctionnalité méconnue de la semaine » dans le podcast d'InDesignSecrets...)

Toujours est-il qu'InDesign JavaScript peut facilement réinjecter une note de bas de page au sein de son article parent, à l'emplacement exact de l'appel de note. Utile fonction pour les auteurs ou maquettistes souhaitant réarticuler du texte provenant d'un document Word ou RTF. Utile également dans l'optique d'un traitement avant export ou conversion XML. Remarquez en passant que si votre objectif est de transformer des notes de bas de page en notes de fin (les fameuse endnotes anglo-américaines), le mieux sera de vous tourner vers le script « foot_to_end » de Peter Kahrel. L'astuce et la méthodologie utilisées sont expliquées dans un célèbre article de Bob Bringhurst : « Endnotes in InDesign CS4 ».

Pour l'heure, voici un petit script (UnFoot.js) permettant de réinjecter les notes au sein du texte. Il améliore à plusieurs égards la méthode Footnote.convertToText. Premièrement, le texte réinjecté s'accompagne de balises d'ouverture et de fermeture personnalisables (ajustez en conséquence la ligne UNFOOT_MARKS = ["<",">"];). Ensuite, le script sait travailler sur plusieurs notes d'un seul coup, selon le contexte : si rien n'est sélectionné dans le document actif, toutes les notes de bas de page sont converties. Pour cibler les notes d'un article particulier, sélectionnez un bloc-texte ou placez le point d'insertion à l'intérieur. Enfin, pour convertir seulement une note de bas de page (et pas ses voisines), placez le point d'insertion dans la note elle-même.

var UNFOOT_MARKS = ["<",">"];
 
/*arr*/ Object.prototype.getFootnotes = function()
//----------------------------------------------------------
{
if ( this.constructor.name == 'Footnote' )
    return([this]);
if ( 'footnotes' in this )
    return(this.footnotes.everyItem().getElements());
if ( 'stories' in this )
    return(this.stories.everyItem().
    footnotes.everyItem().getElements());
return([]);
}
 
/*void*/    Footnote.prototype.unFoot = function()
//----------------------------------------------------------
{
var txt = this.convertToText();
var p = txt.parent;
var iEnd = txt.insertionPoints.item(-1).index +
    UNFOOT_MARKS[0].length;
txt.insertionPoints.item(0).contents = UNFOOT_MARKS[0];
p.insertionPoints.item(iEnd).contents = UNFOOT_MARKS[1];
}
 
/*void*/    Application.prototype.main = function()
//----------------------------------------------------------
{
if ( this.documents.length <= 0 ) return;
var tg = this.selection[0] || this.activeDocument;
 
if ( 'appliedFont' in tg ) tg = tg.parent;
tg = tg.getFootnotes();
 
for ( var i = tg.length-1 ; i>=0 ; i-- )
    {
    tg[i].unFoot();
    }
}
 
app.doScript('app.main();', ScriptLanguage.javascript,
undefined, UndoModes.entireScript, app.activeScript.displayName);
 

Notez que dans la dernière instruction, la procédure principale app.main() est lancée indirectement, via la méthode doScript. Cette astuce permet d'envoyer à l'interpréteur l'option UndoModes.entireScript permettant d'annuler tout en une seule fois.

• Voir aussi : ReFoot.js.