IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Modifier le contenu d'un fichier textedit


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour,
    Je pense que tu fais effectivement une confusion entre des fichiers, des string représentant les chemins vers ses fichiers et leur noms.

    Bien qu'Applescript ne nécessite pas de déclaration de variable typée, il faut garder à l'esprit qu'en fait le compilateur le fait pour nous. Donc une variable peut être un texte ("string" ou "text"), un nombre ("real" ou "integer"), un boolean (true/false), une liste, {a,b,c}, un fichier (on dit aussi alias car en fait c'est un pointeur vers le fichier),...etc.

    Dans le cas ou l'ambiguïté existe, il faut choisir avec soin le nom de ses variables pour qu'elles ne laissent pas de doute lorsque tu écris ton programme. Par exemple :
    - Chemin_Fichier peut représenter une string contenant "Users:totoesktop:12345-MESDONNEES.srt"
    - Fichier peut représenter l'alias vers le fichier 12345-MESDONNEES.srt
    - Nom_Fichier sera une string contenant "12345-MESDONNES.srt"
    Je vois que tu as grandement progressé sur ce point !

    Ma seconde remarque concerne l'utilisation des blocs tell avec l'application "Finder".
    Applescript est un language défini en partie par lui-même, mais surtout pas les applications. Par exemple "name of Fichier" est inconnu d'Applescript, mais c'est une instruction du Finder. Donc pour fonctionner il doit être dans un bloc tell application "Finder".
    Dans le doute, ouvre l'éditeur de script, et dans la fenêtre bibliothèque, ouvre Finder pour avoir la liste des termes propres au Finder. (idem pour toutes autres applications).


    Dans ton script, pour extraite le nom, tu dois utiliser le "name of Fichier", dans un bloc tell Finder et surtout avec Fichier étant un alias.
    J'ajoute que un bloc tell appliqué à une seule instruction peut être simplifié avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tell application "Finder" to set Name_Srt to name of Le_Srt
    (ce qui évite le "end tell")

    Cordialement

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci beaucoup Philippe,

    Je dois bouger aujourd'hui et demain je reprendrai tout ce qui concerne la déclaration de ces srt...

    (grâce à toi, j'ai effectivement pu écrire tout un tas de petites applications pour les utilisateurs de FCP X : http://martingosset.com/boomerang-app/)
    Ton aide en aide plus d'un !!!
    Merci encore Philippe

    Martin

  3. #3
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir Martin,
    Compte tenu de la nouvelle structure (boucle principale et sous routine), tu n'aura pas de problème pour ajouter des marqueurs
    (Ils sont effectivement très utiles ! Pour info, j'utilise aussi FCP, mais je suis resté à la version 7 car 1) je suis amateur, 2) vu le prix !)

    Pour ce qui est de stocker des variables ou préférences utilisateurs, il y a 3 techniques propres et possibles :
    1) lorsque le script est enregistré sous forme d'application, tu peux mettre des fichiers ( texte, xml, ou autres) avec les préférences de l'utilisateur dans le paquet de l'application.
    Tu accèdes à l'emplacement via une instruction "path to me" dans le script lui-même.
    Avantage: c'est très simple pratique et l'utilisateur qui copie l'icône de l'application copie ses préférences avec !
    Inconvénient : si l'application est enregistrée dans le dossier /Applications il se peut que l'utilisateur non admin n'est pas les autorisations !!

    2) Tu utilises les propriétés des Property (souvent méconnues !). En effet tu peux définir leur valeur dans ton script, un peu comme des constantes, mais tu peux les changer et la nouvelle valeur est stockée dans ton script compilé,..tant que tu ne le re-compile pas !! J'ai cependant des doutes sur cette méthode avec Maverick et suivants car ces systèmes sont plus stricts en matière de sécurité et limitent l'autorisation des modification d'une application sur elle-même ! pas cool, mais plus secure !

    3) Le plus propre et conforme aux guides de développement Apple, tu enregistres et lis un fichier dans le dossier utilisateur / Bibliothèque / Préférences
    Accessible via le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set Mon_Fichier to (((path to preferences folder) as string) & "Nom_de_mon_Fichier_Pref")
    L'avantage est que l'utilisateur a toujours accès à ce ficher en lecture écriture.
    En plus tu peux combiner avec le 1, c'est à dire fournir ton application avec un fichier de préférence par défaut dans la paquet de l'application et le copier dans la bibliothèque si il n'y en a pas.
    J'ai fait ça pour quelques applications : c'est Nickel ! Simple et de bon goût !!

    Ton fichier de préférence peut contenir n'importe quel type de variable (des records, des listes, ...), donc à fortiori des attributs booléen (oui/non) !
    Je peux t'aider sur cette partie de gestion de préférences

    Voilà pour le côté positif !

    Mais je suis aussi tenu d'aborder la côté obscur de la Force,...pardon d'Applescript : Applescript est très limité en matière d'interface utilisateur.
    Une fenêtre avec des cases à cocher,...tu oublies ! sauf à passer via xCode (ce que j'ai du faire dans certains cas).
    Il existe bien des add-on type SATImage, mais le partage est moins souple.

    Il est toujours possible de contourner en partie cette limitation à condition de bien penser les questions à poser :dialogue à 3 boutons, dialogue avec liste de choix ?...
    Mais cela ne vaudra jamais une belle fenêtre de dialogue avec des cases bien organisées, des lignes de séparation et même une image adéquate !

    Cordialement

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci beaucoup Philippe,

    Je mets ce petit bout de script de côté pour la fin !!!

    Pour les marqueurs, j'ai réussi sans soucis. Et effectivement, ces petites routines, c'est super pratique.

    Et effectivement, à force de roder, j'ai commencé à travailler dans Xcode pour créer la fenêtre. Ce qui n'est pas difficile. le seul truc c'est que je n'arrive pas à chopper le scripte. Je vais trouver. Quelques tuto et je vais découvrir le truc.

    J'ai déjà bien compris que c'était un objet à part et que le script doit attraper des variable issues de la fenêtre. C'est un peu comme un cerf-volant. Le cerf volant c'est la fenêtre dans Xcode et nous on est dans le script et on tire un peu les ficelles.

    mouai, pas certain que ce soit l'image la plus adaptée.

    Je t'ai mis en MP le lien de mon PDF... au cas où tu veuilles te mettre un jour à FCP X.

    voici aussi un lien de l'application (zippé):
    http://gossetmartin.free.fr/BOOMERANG
    dans le dossier, il y a aussi des images, genre avant/ après. Je pense que ça ne demande pas beaucoup plus d'explication. Juste pour que tu vois un peu à quoi sert ton aide.

    Je retourne donc à Xcode pour créer cette fichue fenêtre.

    merci encore

    Martin

  5. #5
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour,
    Pour ceux qui se posent la question de la gestion de quelques préférences pour leur application Applescript, j'ai réuni les morceaux de codes que j'utilise pour en faire quelque chose de ré-utilisable par tous.
    Il s'agit des 2 routines Get_Pref et Save_Pref (lignes 1 à 54)

    Elles sont écrites de telle manière que n'importe quelle structure de données (record) dans la variable Mes_Pref pourra être gérée: lecture, écriture avec initialisation par variable ou fichier dans le paquet de l'application Applescript.
    Pour mémoire, un record est un ensemble de données Applescript pouvant combiner des valeurs, des listes avec ou sans étiquettes. Très pratique ! Souvent méconnu.

    J'ai adapté l'exemple à une partie des préférences souhaitées par Martin, (voir la variable Mes_Pref et la sous-routine Modif_Pref).
    La partie Modif_Pref donne un exemple des limites d'Applescript en matière d'interface utilisateur... Cela n'atteint pas la puissance et souplesse de Xcode, mais Applescript reste plus abordable pour des choses simples !
    J'espère que cela aidera certains.
    N'hésitez pas à faire des commentaires !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    global Mes_pref, Pref_Application, Pref_Bibli-- met en global ces variables pour pouvoir les appeler à niveau
    
    property Nom_Pref : "com.Perso.Appli" -- exemple de nom  de préférences (URL inversée)  possible en format PList!
    property Mes_pref : {Interview:"ITW", Lives:"Live", Illus:"ILL", Ambiances:"AMB", Coupe:"PCTIW", Synchro:"SYNCRO", Favori:true, Mot_Cle:true, Marqueurs:true, Roles:true, Signe_Note:"*", Niveau:3}
    
    
    -- initialisation des variables
    set Pref_Application to ((path to me) as string) & "Contents:Resources:" & Nom_Pref
    set Pref_Bibli to ((path to preferences folder) as string) & Nom_Pref
    
    
    
    
    -- programme principal
    Get_Pref() -- initialisation à lancer au début de l'application
    set Lives of Mes_pref to "LIVE"
    
    set R to display dialog "Voulez vous modifier les préférences" buttons {"Modifier", "Continuer"} default button "Continuer"
    if (button returned of R) is "Modifier" then Modif_Pref() -- sous routine de changement des préférences
    
    display dialog "fin du programme"
    -- fin du prgramme principal
    
    
    
    on Get_Pref() -- lit le fichier préférence à partir du fichier en bibliothèque, sinon, du paquet application, sinon à partir des valeur par défaut (et crée le fichier bibliothèque)
        set A_Sauver to false
        tell application "Finder"
            if (exists (filePref_Bibli)) then -- lecture du fichier via Pref_Bibli
                try
                    set Mes_pref to (read (file Pref_Bibli) as record)
                on error
    close access (filePref_Bibli)
                end try
            else if (exists (filePref_Application)) then -- lecture de Pref_Application et écriture vers Pref_Bibli
                set Mes_pref to (read (filePref_Application) asrecord)
                set A_Sauver to true
            else
                set A_Sauver to true-- 2criture des property par défaut
            end if
        end tell
        if A_Sauver then Save_Pref() -- appel à une sub-routine en dehors du bloc tell "Finder"
    end Get_Pref
    
    
    on Save_Pref() -- enregistre le record Mes_Pref dans le fichier préférences
        try
    open for access (filePref_Bibli) with write permission
    writeMes_prefasrecordto (filePref_Bibli) starting at 0
    close access (filePref_Bibli)
        on error
    close access (filePref_Bibli)
        end try
    end Save_Pref
    
    
    
    
    on Modif_Pref()
    -- exemple de gestion des préférences (malgré les limitations d'interface AppleScript). Cette partie gagnera à être faite via XCode
    -- choix des préférences : type de marqueurs ou abréviations ou signe et Niveau (un seul choix)
        set Change_Fait to false
        set M_Liste to {"Interview (" & Interview of Mes_pref & ")", "Lives (" & Lives of Mes_pref & ")", "Illustrations (" & Illus of Mes_pref & ")", "Ambiances (" & Ambiances of Mes_pref & ")", "Plan de coupes (" & Coupe of Mes_pref & ")", "Son Synchro (" & Synchro of Mes_pref & ")"}
        set Saisie to choose from listM_Listewith prompt "Valeurs et codes à modifier" with multiple selections allowed
        if Saisie is not false then
            repeat with Choix in Saisie
                if Choix contains "Interview" then
                    set Cur_Val to Interview of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les interviews" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Interview of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Interview of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Lives" then
                    set Cur_Val to Lives of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les Lives" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Lives of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Lives of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Illustrations" then
                    set Cur_Val to Illus of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les Illustrations" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Illus of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Illus of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Ambiances" then
                    set Cur_Val to Ambiances of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les ambiances" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Ambiances of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Ambiances of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Plan de coupes" then
                    set Cur_Val to Coupe of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les plans de coupe" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Coupe of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Coupe of Mes_pref is Cur_Val)
                    end if
                end if
                if Choix contains "Son Synchro" then
                    set Cur_Val to Synchro of Mes_pref
                    set N_Val to display dialog "Changement d'abréviation pour les sons syncrho" default answer Cur_Val buttons {"Enregistrer", "Adandonner"}
                    if (button returned of N_Val) is "Enregistrer" then
                        set Synchro of Mes_pref to text returned of N_Val
                        set Change_Fait to not (Synchro of Mes_pref is Cur_Val)
                    end if
                end if
            end repeat -- sur chaque valeur d'abréviation à modifier
        end if --si il faut changer les abréviations
    -- selection des types de records (Favori, Mot-clé, Marqueurs et Roles)
        set M_Liste to {"Favoris", "Mots-clé", "Marqueurs", "Roles"}
        set Pre_Liste to {}
        if Favori of Mes_pref then set Pre_Liste to Pre_Liste & {"Favoris"}
        if Mot_Cle of Mes_pref then set Pre_Liste to Pre_Liste & {"Mots-clés"}
        if Marqueurs of Mes_pref then set Pre_Liste to Pre_Liste & {"Marqueurs"}
        if Roles of Mes_pref then set Pre_Liste to Pre_Liste & {"Roles"}
        set Saisie to choose from listM_Listewith prompt "Types d'enregistrement à prendre en compte" default itemsPre_Liste with multiple selections allowed
        if Saisie is not false then
            set Favori of Mes_pref to (Saisie contains "Favori")
            set Mot_Cle of Mes_pref to (Saisie contains "Mots-Clés")
            set Marqueurs of Mes_pref to (Saisie contains "Marqueurs")
            set Roles of Mes_pref to (Saisie contains "Roles")
            set Change_Fait to true-- on pourrai ici vérifier quel attribut a été changé ou non !
        end if --si il faut changer les types de records
        if Change_Fait then Save_Pref()
    end Modif_Pref
    Cordialement

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Bonjour Philippe,

    J'ai encore beaucoup appris

    et ça fonctionne parfaitement

    je suis maintenant en train d'essayer de tout faire dans Xcode en cocoa applescript (un truc comme ça) pour avoir une fenêtre unique.
    J'ai réussi à paramtrer la fenêtre et à la connecter au script.
    Je m'en vois par contre pour la partie fichier (créer un second fichier _Nouv.fcpxml)
    Je pense que la suite sera pls simple.
    En encore beaucoup à apprendre

    Je vais aller voir le site qe tu m'as indiqué pour le Xcode

    merci encore à toi

    Martin

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Bonjour Philippe,

    J'ai donc bien réussi à créer cette petite application avec ses préférences. J'ai ajouté quelques possibilités supplémentaires mais il m'a semblé que les options se multipliant, la trop nombreuse succession de fenêtres pour paramétrer l'application devenait rédhibitoire. Pour n'en avoir qu'une seule, j'ai donc appris à la créer dans Xcode. Et j'y suis parvenu. J'ai enfin compris comment connecter les boutons, les cases à cocher et les champs à remplir au code lui-m^me.

    J'ai tenté de transposer le script en applescriptobjc mais je me rends compte que c'est une autre montagne.

    ça me chagrine parce que l'application est là et plus je la ""développe" plus j'en vois l'intérêt. Tout ça pour une fenêtre !!! Brrrr...

    Je pars une quinzaine de jours promener mes gars dans les montagnes et reviendrais vaillant pour une dernière tentative.
    Je crois qu'il va falloir que j'achète un livre d'apprentissage ou que j'admette qu'on ne peut tout faire soi-même... ce qui est une autre résolution tout aussi envisageable.

    Merci encore à toi Philippe et à ce forum qui m'a permis de faire mes tout premiers (retours) pas dans ce monde de la programmation.

    à bientôt je l'espère

    et belle fin d'aout.

    Martin

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Déterrage
    Bonjour à tous,

    je me remets à cette petite application.

    J'aimerais après recherche d'un terme de type "mot1_mot2_mot3_mot4" créer 4 lignes de type:

    "blablalbbla "mot1" blablabla"
    "blablalbbla "mot2" blablabla"
    "blablalbbla "mot3" blablabla"
    "blablalbbla "mot4" blablabla"

    mon soucis est donc de saucissonner le mot "mot1_mot2_mot3_mot4" en 4 mots.

    donc réussir à detecter un premier tiret bas (_) et d'attribuer la valeur mot1 qui précède à une première variable, detecter le second tiret bas et attribuer la valeur mot2 à une seconde variable, etc...

    une fois que j'ai réussi ça, pas de soucis pour fabriquer les 4 lignes...

    donc ma question consiste à comprendre comment saucissonner une phrase selon des séparateurs ...

    et je n'y parviens pas !!!

    quelqu'un d'entre vous saurait-il me mettre sur une piste de boucle sachant qu'avec ce que PBELL m'a appris j'ai surement déjà presque tout...

    en vous remerciant d'avance pour vos idées (en applescript) ...

    martin

  9. #9
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Si le srt est bien un utf8, j'ai regardé sur le site Apple le format fcpxml.
    Il s'agit apparement d'un fichier texte Unicode, formaté de telle façon que c'est un fichier html.

    La balise de début est de type : <fcpxml version="1.6">
    Puis des balises classiques de type : <xxxx> et pour terminer </xxxx>

    Ceci étant, je crois avoir compris :
    1) tu ouvres un srt, tu lis toutes les lignes et tu en extrais une liste de textes
    2) tu ouvres un fcpxml et tu remplaces le contenu de certaines balises par l'un des textes du srt

    2 remarques:
    - le display alert est bien, mais l'instruction "log" est mieux car tu gardes dans l'Editeur de script, la liste des log qui te permettent de suivre ton programme (demander à afficher les messages dans l'éditeur avant de lancer le script).
    - un "write (la_ligne & return) to file destination" devrait suffire. Je me méfie du eof !

    Bon courage pour la suite !
    Cordialement

  10. #10
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci beaucoup Phillipe !
    "
    Ceci étant, je crois avoir compris :
    1) tu ouvres un srt, tu lis toutes les lignes et tu en extrais une liste de textes
    2) tu ouvres un fcpxml et tu remplaces le contenu de certaines balises par l'un des textes du srt
    "
    C'est exactement cela !!

    ton aide m'a aidé à terminer cette petite app. Et j'ai encore beaucoup appris...
    Je dois encore comprendre comment sont rééllement gaulés ces document (fcpxml et srt). Au fond, je me demande si ce ne sont pas tout simplement des sortes de "listes" avec des séparateurs. Ce serait ça en fait le formatage, juste le séparateur utilisé. Tandis que l'encodage serait le système de codage des charactères... et j'ai l'impression que Apple Script est capable de les reconnaitre et les convertir tout seul !?
    Bref, merci encore à toi.
    PS: si tu es intéressé par mes documents, dis le moi. Je te les enverrai. Ils comportent maintenant 1000 planches !!!
    martingsset.com

  11. #11
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonsoir Martin,
    Je ne comprends pas ce que tu souhaites faire avec les ligne1, ligne2,...
    Donc il m'est difficile de t'aider sur cette partie sans comprendre plus.

    Sur le fichier str, je te confirme que c'est un fichier de type texte en UTF8. Si tu ne précise pas UTF8, par défaut, je crois que Applescript utilise de l'Unicode: cela va te donner des caractères erronés sur les lettres avec des accents.

    Hormis ce format, les fichiers "str" que j'ai lu ne contiennent aucun caractères spéciaux.
    - les passages à la ligne suivante sont un "retour chariot" classique (ascii number = 13)
    - les espaces sont des espaces standard (ascii 32)

    Le format de set que tu indiques en exemple est correct.
    Il faut bien sûr que les séquences de sous-titres soient dans l'ordre de diffusion, donc avec des valeurs de compteur croissantes, et qui ne se chevauchent pas: le compteur de la fin du x doit être inférieure au compteur de début du (x+1).

    Pour terminer, voici un exemple de lecture en utf8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set F to choose fileset X to characters of (read F as «class utf8»)
    Cordialement

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Mmm...
    Le problème est assez simple en fait, maintenant que j'ai contourné des choses.
    J'ai une ligne à écrire de type <text-style ref= "ts12"> le texte d'une des ligne du srt </text-style>
    le texte en rouge étant celui que je tire du srt donc et le noir celui que je tire du fcpxml.
    Dans l'absolu, je l'ai déjà fait à plusieurs reprises et avec un "display alert" je m'assure que j'ai bien réussi à capturer le texte voulu dans le srt. La petite alerte qui apparait alors me le montre parfaitement sans problème de caractère d'ailleurs.
    Une fois l'application lancée et le nouveau .fcpxml obtenu, je l'ouvre dans TextEdit mais il ne veut pas à cause d'un problème de utf-8
    Je parviens sans problème à l'ouvrir avec Atom qui me montre effectivement que tout est là. MAIS, au lieu d'y avoir autant de lignes qu'il est sensé y avoir (je fais des write (la_ligne & return) to file Destination at eof), Atom ne m'affiche qu'une seul ligne. C'est un peu comme s'il avait perdu les séparateur en route...

    Je vais chercher

    Merci Philippe pour tes réponses.

    Martin

  13. #13
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour Martin,
    Il faut utiliser les délimiteurs de texte prévus par Applescript. Voici un exemple de script qui réponds à ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    -- texte dans lequel il faut chercherset mon_texte to "voici les mots recherchés : mot1_mot2_mot3_mot4, au milieu d'un texte"
    
    -- la cible de recherche
    set mot1 to "mot1"
    set mot2 to "mot2"
    set mot3 to "mot3"
    set mot4 to "mot4"
    set cible to mot1 & "_" & mot2 & "_" & mot3 & "_" & mot4
    -- la valeur de remplacement de la cible
    set Remplace to "bla1 " & mot1 & " bla1" & return
    set Remplace to Remplace & "bla2 " & mot2 & " bla2" & return
    set Remplace to Remplace & "bla3 " & mot3 & " bla3" & return
    set Remplace to Remplace & "bla4" & mot4 & " bla4" & return
    
    
    set Position to offset of cible in mon_texte
    if (Position is 0) then return -- la chaine mot1,2, 3, 4 n'est pas dans le texte : fin du script
    set AppleScript's text item delimiters to cible
    set ma_liste to every text item of mon_texte
    set texte_final to (item 1 of ma_liste) & Remplace & (item 2 of ma_liste)
    display dialog texte_final
    Cordialement

  14. #14
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    Merci beaucoup m'sieur !!!

    Je vais étudier cela. Cela parait beaucoup moins laborieux que ce que j'avais commencé à écrire.

    Cela va beaucoup m'aider.

    Merci, merci et ... super merci

    Martin

  15. #15
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Fin de partie ;)
    Un petit mot pour te dire que je ne devais pas être le seul a trouver qu'il était urgent d'écrire une petit application comme celle à laquelle je souhaitais me coller

    quelqu'un l'a sortie quelques jour après ces messages.

    http://fcpxpert.net/2015/07/15/geekc...l-audio-roles/

    cela fait que je ne plus besoin de m'y atteler !!!

    merci encore à toi pour ta disponibilité et ta générosité.

    Martin

  16. #16
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Un petit écueil
    Bonjour,

    j'ai écrit plusieurs petit AppleScript avec l'aide de PBELL il y a qq temps déjà.
    Le principe est à chaque fois de lire ligne par ligne un paragraphe. on créer un nouveau document en ayant d'abord mis toutes les lignes du document original dans Mes_lignes .... Chaque ligne est lu puis une ligne s'en inspirant est écrite dans le nouveau document ("write (Ligne & return) to file Fichier starting at eof". Et on lit la suivante dans l'originale (Mes_lignes) etc...
    Donc le nouveau document s'écrit ligne par ligne.
    Cette fois j'ai un petit souci car pour modifier une ligne, j'ai besoin d'une donné qui se trouve dans la ligne juste en dessous.
    J'ai imaginé qu'on pouvait transposer la commande qui consiste a attribuer le texte d'un partie de ligne à une variable
    >>>set MONTEXTE to (text ((offset of CECI in Ligne)-3) thru (text of (offset of CELA in Ligne)+5) of Ligne)
    à un ligne dans un paragraphe (Mes-Lignes) mais cela ne fonctionne pas.
    Du genre >>> set LIGNESUIVANTE to (text (offset of Ligne) in Mes_Ligne) + 1) masi j'ai m'impression que ce n'est pas la bonne idée peut-être ...

    donc l'idée serait de pouvoir
    1.lire le contenu de la ligne suivante.
    2. y débusquer un bout de texte (ça je sais faire grâce à toi)
    3. récrire la Ligne (pas la suivante où on a été chercher le petit bout de texte hein !) avec entre autre le petit bout de texte qu'on a trouvé (ça aussi a priori je sais faire.

    Par ailleurs si cela peut aider, je sais que cette fameuse ligne suivante commence toujours par "<video offset" ...

    J'imagine que cette question est très simple pour vous. Votre aide m'aiderait à franchir ce petit écueil...
    En vous remerciant encore par avance si vous pouvez me donner ce petit coup de pouce.

    Martin Gosset

  17. #17
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut
    Bonjour,
    Le.srt est vraiment un fichier texte standard, en UTF8, avez des "return" (ASCII 13) en fin de chaque ligne. Le format est très simple, constitué de plusieurs groupes de 4 lignes chacun:
    ligne 1 = un nombre entier en séquence de 1 à n
    ligne 2 = Les compteurs début/fin séparés par " --> ". Un compteur est heure(en entier):minute(en entier):seconde (en décimale avec 3 chiffres après la virgule)
    exemple: hh:mm:ss,xxx --> hh:mm:ss,xxx
    ligne 3 = une ligne de texte
    ligne 4 = ligne vide (seulement return)

    Donc il peut être lu et écrit simplement.

    Le fcpxml ressemble à un xml standard (je ne l'ai pas étudié à fond !).
    Par chance, l'application "System Events" dispose des instructions de lecture/ecriture d'un fichier xml, du moment que l'on connait ses balises.
    Voici un exemple de script qui lit un fichier xml.
    Ce xml contient une balise "<General>" et, dans cette balise, il y a 2 sous-balises "- nom", "- Container" dont on lit les valeurs.
    Puis une balise "Audio" qui contient une sous balise "-Format".
    L'avantage est que l'on peut lire seulement que ce qui nous intéresse.
    En effet, la balise "Audio" peut contenir bien d'autres sous-balises ou toute autres structures, je veux ici seulement lire la valeur de la balise "- Format" sans me préoccuper des autres !
    C'est System Events qui va se charger de chercher cette valeur parmi le reste des données xml.
    Bien sur cela doit être adapté pour tes formats xml de Final Cut Pro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set Mon_xml to "Users:iac27:Desktop:Test_xml.xml"
    
    tell application "System Events"
        tell contents of XML file Mon_xml
            set X_Nom to value of XML element "- Nom : " of XML element "General" of XML element 1
            set X_Container to value of XML element "- Container : " of XML element "General" of XML element 1
            set X_Format to value of XML element "- Format : " of XML element "Audio" of XML element 1
        end tell
    end tell
    Cordialement

  18. #18
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut
    J'ai encore appris quelque chose Philippe !

    J'ai découvert les Apple Event il y a très peu de temps. Du coup, cela ouvre des perspectives en effet. Du moins lorsqu'il s'agit de seulement modifier des XML. Dans mon cas, il faudra que je creuse davantage car j'ajoute des lignes créées de toutes pièces pour l'ossature (les balises) mais effectivement nourris de "valeurs" puisée dans un autre XML et dans les .srt....
    Bon beh c'est très prometteur en tout cas.
    Merci merci Philippe. Tout ça est bien chouette de ta part.

    Martin

    PS: je vais réétudier le code que tu m'avais suggéré pour créer des préférences utilisateur aussi !!! il y a loooongtemps

  19. #19
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Par défaut Déclarer et utiliser les listes
    Bonjour,

    Je continue à écrire des petites app en AppleScript. L'une d'elle me pose problème depuis 3 mois que j'ai tenté de la complexifier un peu.
    A mon avis, cela vient de la façon dont je déclare et nourris ma liste principale.

    Au fil du programme l'application nourrit donc une liste (appelons-la LA_LISTE):
    LA_LISTE = {item1,item2, item3, etc...} donc cette liste peut avoir un nombre d'item qui n'est pas fixé au départ.
    Mais chaque item est par contre forcément structuré ainsi :
    item N = {item N1, item N2, item N3, item N4}
    où :
    item N1 est un string non vide (exemple "jean-pierre")
    les 3 autres items sont eux mêmes des listes de strings:
    item N2 est une liste de string : {itemN21, item N22, itemN23,...}
    item N3 est une liste de string : {itemN31, item N32, itemN33,...}
    item N4 est une liste de string : {itemN41, item N42, itemN43,...}


    Donc la liste pourra ressembler à cela :
    LA_LISTE = { {Item11,{item111,item112,item113}, {item121,item122,item123}, {item131,item132,item133}}, {Item21,{item211,item212,item213}, {item221,item222,item223}, {item231,item232,item233}}, {Item31,{item311,item312,item313}, {item321,item322,item323}, {item331,item332,item333}}, ect }


    Je crois que j'ai un problème pour déclarer cette liste ...
    Faut il que je la déclare ainsi : LA_LISTE = { {"",{""},{""},{""}} }

    Ensuite lorsque je rencontre tel string, il faut que j'ouvre un nouvel item avec ce même format : {"",{""},{""},{""}}

    J'imagine alors qu'il faut que j'écrive LA_LISTE = LA_LISTE & {"tel string",{""},{""},{""}}


    Je crois que cela induit des soucis ensuite. Par exemple si aucune info destinée à l'item 3 n'a encore été trouvé (l'item 3 est donc vide à ce stade) mais que la première info trouvé soit destiné à nourri l'item 4, il me semble que l'app va me dire qu'elle ne peut pas trouve l'item 4 . Comme si déclarer un item vide ne le faisait pas vraiment exister... quelque chose comme ça.

    Si je savais comment bien déclarer la liste au départ, je crois que je n'aurais pas de souci ensuite... Je crois que je ne sais pas comment déclarer (formater) une liste dont les éléments sont vides, en attendant d'être remplis au fur et à mesure que l'app avance dans sa recherche...

    Merci d'avance pour votre aide

    Martin

    PS: je vais reposter ceci sur un post à part entière car peut-être que ce déterrage-ci va passer inaperçu... merci de votre compréhension.

Discussions similaires

  1. Modifier le contenu d'un fichier PDF en PHP
    Par Ghunter59 dans le forum Langage
    Réponses: 6
    Dernier message: 17/03/2020, 13h27
  2. Modifier le contenu d'un fichier
    Par karim_usthb dans le forum C
    Réponses: 2
    Dernier message: 28/05/2008, 09h42
  3. Modifier le contenu d'un fichier
    Par sconrad dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2008, 17h00
  4. modifier le contenu d'un fichier
    Par progamer54 dans le forum ANT
    Réponses: 1
    Dernier message: 06/12/2007, 11h31
  5. Modifier le contenu d'un fichier
    Par Core8 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/01/2007, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo