Jeudi 13 mars 2008.


Dernière mise à jour: mardi 25/03/2008.

En français dans le texte...


Pour l'illustration d'un autre article à paraître prochainement sur ce site, j'ai eu à faire des recherches dans les disques images de la série GS Infos, une revue française contenant plein d'articles intéressants en français autour de l'Apple IIGS.
Une bonne partie de ces disques images est disponible en ligne sur le site Apple IIGS Infos de mon ami Arnaud sous forme de fichiers .2mg. On les trouve aussi dans le CD-ROM du GS Club paru il y a une dizaine d'année.
Détail étonnant pour ceux que ça intéresse, j'ai appris que le GS Club existe toujours - si si!!! - Cette information m'étant arrivée par le biais de deux anciens collaborateurs à cette revue: Paul L. et Vincent 'Xter' H. D'ailleurs je ne devrais peut-être pas dire "ancien" pour Paul car il utilise toujours ses machines Apple II et si ça se trouve en est toujours membre...

Pour en revenir à ma recherche initiale, mon objectif était de parcourir rapidement de contenu de chacun des fichiers .2mg et de lire les articles que j'avais repéré dans l'index général.
Je ne savais pas encore réellement si le contenu de chacun de ces fichiers allait m'être utile ou pas aussi mon souhait était de les lire en direct avec un outil de manipulation de disques images et pour ceux retenus d'obtenir (par extraction) des fichiers propres exploitables sur ma machine moderne de travail.

Ce type d'outil de visualisation/extraction existe mais pour le format .2mg (surtout utilisé pour le monde GS), il n'y a que des produits anglosaxons aussi pour les caractères accentués français ce n'était pas gagné...

Je ne voulais pas m'embêter à faire des éventuels pré-traitements au niveau d'un vrai GS ou d'un émulateur pour avoir des fichiers en français propres compatibles avec une machine moderne (Toinet m’a dit qu’il avait écrit 2 finder extras à l’époque de Brutal Deluxe pour faciliter les échanges). De même je ne voulais pas avoir à appliquer des correctifs (post-traitements) sur les éventuels fichiers extraits (aussi je n'ai pas mené plus en avant le développement d'un petit script bash utilisant la commande unix sed ou awk que j'avais commencé pour faire des substitutions de caractères).

J'ai donc fait le tour des principaux outils disponibles pour regarder le degré de compatibilité avec ces fichiers aux caractères accentués et voir éventuellement les actions à mener pour les rendre compatibles.
Vous trouverez ainsi le point pour les logiciels FishWings, CiderPress et AppleCommander.

J'ai du écarter de cette sélection Tiny Apple II Image Disk Browser version béta 7.3 (30/12/2005) par Blacky (Cochonou Crack Band) car ce programme, bien qu'étant le meilleur pour les fichiers en français issus du monde Apple II 8 bits, ne sait pas traiter les fichiers .2mg.
Par ailleurs, je ne suis pas du tout persuadé qu'il évolue. Son auteur aimant varier les plaisirs (Commodore 64, Nintendo DS, ...), on ne sait pas trop quand il reviendra dans la sphère Apple II.
Les sources du développement, réalisé avec Delphi (à présent intégré dans CodeGear RAD Studio) de Borland, ne sont pas disponibles pour la dernière version.
Il fonctionne bien sous Windows mais il y a de temps en temps des ratés chez moi sous Linux avec Wine. Aussi c'est quand je boote mon disk dur extractible sous Vista que c'est un sans faute.
Rappelons au passage que Kylix (le Delphi linux) n'aura pas fait long feu et la version était moins complète que son homologue Windows: j'avais essayé de compiler les sources de Tiny Win et il y avait des erreurs à la pelle.


Pour faire ces tests, j'ai utilisé plusieurs fichiers et .2mg.
Voici ce que l'on obtient comme caractères accentués quand on boote un d'entre eux:

GS Infos
GS Infos

L'affichage se fait via un menu propre à chaque numéro. Les accents sont présents dans quasiment tous les fichiers écrits par les collaborateurs (ceci dit il y a aussi des fichiers en anglais quand le produit est d'origine étrangère).
Les fichiers peuvent être consultés avec d'autres outils GS.
Ici avec le traitement de texte NDA Hermès (anciennement ShadowWrite).

Hermes

Sur GS on trouve principalement 2 types de fichiers texte.
Des fichiers de type TXT simple (type auxiliaire $0000) = ASCII TEXT et des fichiers de type texte générique IIGS GWP (simple avec un type auxiliaire $0000 et plus évolué - le format Teach - avec un type auxiliaire $5445). Pour le format Teach, il est possible de faire varier la couleur, le style, les polices, etc...
Avec le NDA, en fonction du type du fichier que l'on veut ouvrir, on peut être amené à cocher l'option "Load file as raw data" (c'est le cas pour Teach et Generic IIgs).

Comme dans cette dernière production signée Toinet:

Teach

A noter qu'outre les caractères accentués classiques, on trouve aussi des caractères spéciaux comme le "trademark" ou le "registered". Par exemple ici dans un fichier Teach text mais on en trouve aussi dans des fichiers TXT classiques:

Teach
Teach

Dans les .2mg du GS Club, les articles sont au format TXT classiques, et comme nous le verrons, cela peut poser certains problèmes.

FishWings

FishWings version 0.87 (20/02/2006) par Charlie Danemark.

Il s'agit d'un programme 100% Windows livré sous forme de .exe uniquement.
La lecture de l'aide ne laisse pas présager un résultat optimiste:

FishWings
FishWings

Et en effet, en ouvrant un fichier TXT simple ou un GWP Teach Text, tous les caractères accentués ou spéciaux ne sont pas supportés (affichage d'un espace à la place):

FishWings
FishWings

Voici pour comparaison le fichier Teach Text affiché en émulation GS:

Teach

Ce programme bien que de qualité ne me donne pas satisfaction pour réaliser mon objectif.
Ceci pour 2 raisons principales: sa limitation à Windows et l'absence des sources pour essayer d'ajouter ces caractères manquants.
Non seulement dans la même catégorie CiderPress est plus puissant et plus ouvert mais en plus l'auteur de FishWings n'a plus l'air de s'occuper de son bébé.

Je ne vois qu'une seule possibilité pour réussir à visualiser les caractères correctement.
C'est ajouter une font correspondante à celle du GS.
En effet FishWings permet de sélectionner la police à utiliser pour l'affichage:

FishWings
FishWings

CiderPress

CiderPress version 3.0.0 par Andy McFadden (FaddenSoft).

Il s'agit d'un programme à interface graphique pour Windows (application Win32 MFC=Microsoft Foundation Class) pouvant néanmoins fonctionner sous Linux avec Wine ou TransGaming Cedega mais en fonction de la version il peut y avoir des instabilités: ça crashe régulièrement chez moi (surtout quand j'essaie d'ouvrir un fichier ShrinkIt .shk encapsulé dans un autre objet), aussi je préfère l'utiliser avec un autre disque sous Vista.
J'ai lu il y a quelques mois (sur le forum comp.sys.apple2) qu'une personne essayait de mener un projet de portage sous Mac OS X mais rien de concret n'est sorti pour le moment.

Les sources C++ (licence BSD) sont disponibles depuis mars 2007. Il y a un répertoire linux dans les sources avec un makefile et d'autres fichiers mais je n'ai pas approfondi la question.
Bien que l'auteur n'ayant plus le temps de le mettre à jour (explication officielle de la mise à disposition des sources), il intervient régulièrement sur comp.sys.apple2 et reste donc de ce fait toujours actif sur Apple II.
Le programme a beaucoup d'atouts mais maitriser les arcanes de son source reste complexe en plus de la nécessité d'avoir le produit Microsoft MS Visual C++ 6.0 pour la compilation sous Windows.

Le programme reconnait beaucoup de formats dont le .2mg qui m'intéresse ici.

Essayons avec un fichier TXT d'un GS Infos.
Quand on double clique dessus, il affiche le contenu du fichier dans le mode qu'il juge le plus opportun (ici "converted Text"). On constate que les caractères français ne passent pas du tout.
Il remplace tous les accents par un caractère en forme de carré:

CiderPress

A noter que le programme propose de visualiser le contenu dans 2 autres modes (hex dump et raw) dont l'illustration est donnée ci-dessous:

CiderPress
CiderPress
CiderPress

Le mode Hex Dump permet de consulter les codes des caractères ne passant pas. Le mode Raw quant à lui ne nous avance pas plus, le résultat étant aussi inexploitable que le "Converted Text".


Dans l'exemple précédant, j'avais pris un fichier avec seulement quelques caractères accentués.
Pour avoir un panel complet, j'ai créé un fichier TXT sous ProDOS contenant les valeurs hexa de $00 à $FF. Voici l'affichage normal par un GS:

CiderPress

Résultat guère folichon avec CiderPress:

CiderPress
CiderPress
CiderPress
CiderPress

En fait, il y a une solution pour obtenir un résultat parfait.

Je le comprends de la façon suivante: CiderPress est un outil pour Apple II 8 bits ET pour GS.
Il doit donc faire une différence entre un fichier TXT et un fichier GWP dans le cas où les 2 aux types valent $0000.
Pour CiderPress un fichier TXT vient du monde 8 bits et les caractères spécifiques du GS n'ont rien à faire là. Ce n'est que pour le type GWP qu'il s'en préoccupe.
Par contre pour les auteurs de GS Infos, leur "monde" étant le GS, ils ont sauvegardé tous leurs fichiers en TXT classique sans se préoccuper des conséquences futures; leur outil d'affichage fonctionnant très bien sans faire cette distinction.
Je suis donc tenté de dire que dans l'absolu, CiderPress fait bien son boulot et que la problématique vient des GS Infos.

Essayons de passer un fichier TXT en GWP pour voir le résultat.
Rien de plus simple: un clic droit sur le fichier, et transformation de son type:

CiderPress
CiderPress
CiderPress
CiderPress
CiderPress
CiderPress

Le résultat est parfait!! On notera que CiderPress utilise par défaut cette fois ci non plus "converted Text" mais le type adapté "Generic IIGS text document":

CiderPress

Refaisons le test avec le petit fichier de tout à l'heure (les valeurs croissantes de $00 à $FF):

CiderPress
CiderPress

On a bien ce que l'on attendait.

A noter que les fichiers Teach Text passent quant à eux très bien:

CiderPress
CiderPress
CiderPress

Quand on double clique sur un fichier GWP avec un aux type $5445, on a par défaut le type "Teach Text":

CiderPress


Ce mode est bien entendu plus complexe qu'un simple GWP avec aux type $0000, aussi s'amuser à changer un aux type $0000 en $5445 donnera des résultats peu concluants (idem que le mode Raw):

CiderPress
CiderPress

Pour le format Teach text, CiderPress est capable de mapper certaines polices (charsets) quand elles sont connues dans le système.

Si vous voulez bidouiller CiderPress pour qu'il propose le mode Generic IIgs (et donc ne pas avoir à changer le file type) quand vous choisissez un fichier TXT, c'est toujours possible.

Consultez dans le répertoire reformat les fichiers Text8.* pour le TXT et teach.* qui traitent les formats GWP incluant Teach.
Une table de mapping est présente dans ReformatBase.cpp.
Elle réalise l'opération suivante: "Convert IIgs high-ASCII characters to Windows equivalents (when available)".
Le code windows est à gauche et le contenu du charset IIgs à droite en commentaire.
Pour voir cette table, cliquez -> ici <-.


Concernant les exports de fichiers, il ne faut pas oublier 2 points importants: l'encodage des caractères et les terminateurs de fin de ligne qui sont généralement définis par le système d'exploitation. Sur plateforme Windows XP, l'encodage du texte par défaut est fait avec cp1252 (windows, europe de l'ouest) et sous linux en UTF-8 (unicode rules!)
Avec win, les fins de lignes correspondent à un CR + LF alors que sur plateforme unix/linux, il n'y a que $0A (LF).
Heureusement tout éditeur de textes digne de ce nom (Ultra Edit sous win ou KWrite sous linux par exemple) permet de configurer ces points et donc de se "comprendre" mutuellement.

AppleCommander

AppleCommander version 1.3.4 (mars 2007) par Rob Green et John B. Matthews.

Le développement de ce programme se fait par intermittence et par au moins 2 auteurs.
"Au moins" car il me semble que l'auteur d'ADTPro a aussi apporté quelques modifications.
Le projet étant sur Sourceforge, n'importe qui peut reprendre le flambeau... Pourquoi pas vous demain?

Comme ses concurrents, ce programme reconnait le format .2mg qui m'intéresse pour les GS Infos.

A mon sens, son point fort est qu'il est écrit en java, donc fonctionne sur toutes les plateformes dotées d'une machine virtuelle: Windows, Mac OS X et Linux... ainsi qu'une archive .jar pour le support de SWT (on y reviendra plus loin).
Concernant java, je me marre au sujet d'Apple. Alors que les aficionados sont toujours à vanter l'avance de leur chouchou sur ses concurrents, Apple se contente de proposer la version 5 de la machine virtuelle (certes en standard) alors que pour tous les autres la version 6 est dispo depuis un bon bout de temps. Ils pourraient rétorquer qu'une version développeur est disponible sur Apple Developer Connection, mais ça me fait une belle jambe vu que même après l'enregistrement sur ce site, le java téléchargé ne sera pas la version sélectionnée par défaut. Et c'est du béta donc à vos risques et périls...

Voici ce que j'ai fait pour avoir une version fonctionnelle d'AppleCommander:

Tout d'abord pour windows (et linux mais ça dépend de votre distribution), il faut récupérer la dernière version de J2SE (Java 2 Standard Edition) sur le site de SUN, à l'url http://java.sun.com.

J'ai récupéré une version complète du JDK 6 (=Java SE Development Kit contenant la machine virtuelle java et le compilateur javac) car le source d'AppleCommander est disponible et je préfère toujours recompiler à partir du source que d'utiliser un binaire issu d'une machine dont je ne sais rien. Pour résumer rapidos, javac permet de compiler un ensemble de fichiers sources ayant l'extension .java pour donner un/des fichiers en bytecode (pseudo-code) avec l'extension .class.
C'est la machine virtuelle java (JRE=Java Runtime Environment) qui permet l'exécution des .class (commande: java programme.class) ainsi que les jar (java archive.jar, une archive pouvant être exécutable grâce au fichier Manifest.mf, contenu dans le répertoire META-INF, qui indique le chemin où se trouve les .jar SWT et la classe principale). Oui il n'y a pas forcément qu'une seule archive .jar comme l'indique la page web du programme. (Pour voir le contenu d'une archive .jar, il suffit de renommer l'extension en .zip et d'utiliser votre logiciel d'archivage favori - s'il ne sait pas l'ouvrir directement).

En lisant les fichiers d'AppleCommander, on apprend qu'il s'agit d'un projet sous Eclipse.
Eclipse est un environnement de développement intégré (EDI en français et IDE en anglais) open-source et multi-langages mené par IBM. Il est le concurrent de celui de Sun (NetBeans, projet aussi en open source). A noter que des IDE il y en a plein d'autres...

L'auteur d'AppleCommander précise aussi que ce projet était pour lui l'occasion d'apprendre à utiliser SWT (Standard Widget Toolkit).
Quelques précisions à ce sujet: Java a été inventé par Sun qui l'encadre toujours.
Sun écrit les spécifications du langage, produit du service mais chacun est libre d'apporter sa pierre à l'édifice. Sun a mis à disposition sa solution pour l'interface graphique utilisateur (GUI) qui permet de gérer tout ce qui touche à cet aspect. Ces briques GUI s'appellent AWT (Abstract Window Toolkit) et SWING (apparu plus tard à l'initiative de Netscape et se basant sur AWT en apportant des composants d'interface plus performants).
IBM en a eu assez d'attendre que Sun corrige ses bogues et a sorti sa propre brique graphique: SWT. Son environnement de développement Eclipse se base complètement sur SWT. Quand on conçoit une appli faisant intervenir des composants graphiques, on a le choix de faire du AWT/SWING ou du SWT (mais aussi bien d'autres...)

J'ai donc récupéré Eclipse classic 3.3.2 (www.eclipse.org). Sur Mac il s'agit d'une version Carbon.
L'EDI contient déjà 2 .jar SWT (je n'ai rien eu à charger en plus). Puis j'ai réglé comme classe principale com.webcodepro.applecommander.ui.swt.SwtAppleCommander et l'emplacement des 2 .jar (ainsi que junit utilisé dans certaines classes pour réaliser des tests unitaires) et ai définit le class-path:

Eclipse


A noter que si les .jar ne sont pas dans le répertoire attendu ou n’existent pas du tout, il n'y a pas de démarrage d’AppleCommander.

Voici le soft en version mac OS X Leopard: sans rien faire, il n'y a pas de caractères accentués.

Mac OS X Leopard
AppleCommander mac
AppleCommander mac

Idem après export et chargement avec TextEdit. Le programme d'édition HexEdit maintenu par Lane Roathe (ancien programmeur et plombeur Apple II) permet de visualiser les codes qui ne passent pas:

TextEdit mac
HexEdit mac

Même topo sous Linux. Le soft propose comme CiderPress plusieurs modes d'affichage: Text, Hex Dump et Raw:

AppleCommander Linux
AppleCommander Linux
AppleCommander Linux

Résultat identique sous Windows, ce qui quelque part est rassurant:

AppleCommander Windows XP
AppleCommander Windows XP
AppleCommander Windows XP
AppleCommander Windows XP
AppleCommander Windows XP

Bon, ça marche pas terrible pour les caractères français.
Mais ce n'est pas grave. On a le source.
Et hop un petit patch de la classe TextFileFilter.java dans com.webcodepro.applecommander.storage.filters (peu élégant mais fonctionnel), ici sous linux:

/*
 * AppleCommander - An Apple ][ image utility.
 * Copyright (C) 2002 by Robert Greene
 * robgreene at users.sourceforge.net
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 * Patch : 20080311 Deckard
 *         Get correct french characters.
 */
package com.webcodepro.applecommander.storage.filters;

import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;

import com.webcodepro.applecommander.storage.FileEntry;
import com.webcodepro.applecommander.storage.FileFilter;

/**
 * Filter the given file data for text.
 * <p>
 * Date created: Nov 2, 2002 9:11:27 PM
 * @author Rob Greene
 */
public class TextFileFilter implements FileFilter {
    /**
     * Constructor for TextFileFilter.
     */
    public TextFileFilter() {
        super();
    }

    /**
     * Process the given FileEntry and return a byte array
     * with filtered data; use PrintWriter to get platform
     * agnostic line endings.
     */
    public byte[] filter(FileEntry fileEntry) {
        byte[] fileData = fileEntry.getFileData();
        int offset = 0;
        char c;
       
        ByteArrayOutputStream byteArray = new ByteArrayOutputStream(fileData.length);
        PrintWriter printWriter = new PrintWriter(byteArray, true);
       
        while (offset < fileData.length) {
           
            byte orig = fileData[offset];           

            // Mapping GS/OS - characters
            switch (orig) {
            case (byte) 0x88 : c = 'à';
                        break;
            case (byte) 0x89 : c = 'â';
                        break;
            case (byte) 0x8A : c = 'ä';
                        break;
            case (byte) 0x8D : c = 'ç';
                        break;
            case (byte) 0x8E : c = 'é';
                        break;
            case (byte) 0x8F : c = 'è';
                        break;
            case (byte) 0x90 : c = 'ê';
                        break;
            case (byte) 0x91 : c = 'ë';
                        break;
            case (byte) 0x94 : c = 'î';
                        break;
            case (byte) 0x95 : c = 'ï';
                        break;
            case (byte) 0x99 : c = 'ô';
                        break;
            case (byte) 0x9A : c = 'ö';
                        break;
            case (byte) 0x9D : c = 'ù';
                        break;
            case (byte) 0x9E : c = 'û';
                        break;
            case (byte) 0x9F : c = 'ü';
                        break;
            case (byte) 0xA8 : c = '®'; // Registered
                        break;
            case (byte) 0xA9 : c = '©'; // Copyright
                        break;
            case (byte) 0xAA : c = '™'; // Trademark alt+0153
                        break;
            case (byte) 0xD5 : c = '\''; // Apostrophe
                        break;
                       
            default   : c = (char)(fileData[offset] & 0x7f);
            }
            if (c != 0) {
                if (c == 0x0d) printWriter.println(); //Apple line end
                else printWriter.print(c);
            }

            offset++;
        }
        return byteArray.toByteArray();
    }


    /**
     * Give suggested file name.
     */
    public String getSuggestedFileName(FileEntry fileEntry) {
        String fileName = fileEntry.getFilename().trim();
        if (!fileName.toLowerCase().endsWith(".txt")) { //$NON-NLS-1$
            fileName = fileName + ".txt"; //$NON-NLS-1$
        }
        return fileName;
    }
}

Si vous n'arrivez pas à avoir certains caractères, utilisez Open Office ou Neoffice pour choisir les caractères spéciaux comme ™, © et ®.

Un coup d'exécution en temps qu'application java et hop impecc:

AppleCommander Linux

On essaie l'extraction qui utilise la même routine:

AppleCommander Linux
AppleCommander Linux
AppleCommander Linux

Il faut régler votre éditeur favori pour être en phase avec l'encodage. Ici choix de l'UTF-8 (il m'arrive de régler KWrite avec le charset Européen de l'Ouest ISO-8859-15 =euro pour certains autres fichiers...)

Encodage KWrite
Encodage KWrite

Résultat identique à l'affichage en temps réel:

AppleCommander Linux

Pour les exports, la taille d'un même fichier peut varier en fonction de votre operating system; chaque caractère d'origine étant transformé en 1 ou plusieurs octets d'après la config de votre machine.

Exemple:

GS/OS Caractère  ISO-8859-15  UTF8
 88      à          E0        C3A0
 89      â          E2        C3A2
 8A      ä          E4        C3A4
 8D      ç          E7        C3A7
 8E      é          E9        C3A9
 8F      è          E8        C3A8
 90      ê          EA        C3AA
 91      ë          EB        C3AB
 94      î          EE        C3AE
 95      ï          EF        C3AF
 99      ô          F4        C3B4
 9A      ö          F6        C3B6
 9D      ù          F9        C3B9
 9E      û          FB        C3BB
 9F      ü          FC        C3BC


Il n'y a plus qu'à se faire un jar exécutable, ce qui se fait en 2 coups de cuillère à pot...

Conclusion

Si votre plateforme de travail est Windows, téléchargez CiderPress qui est à présent gratuit.
il s'agit de l'outil le plus complet pour manipuler des disques images.
Au prix d'un minimum d'effort (changement du type de fichier), vous pourrez visualiser les articles de GS Infos. Si vous êtez programmeur, les sources disponibles n'attendent que votre bon vouloir pour un affichage simplifié de ces fichiers TXT.

Si votre créneau est plutôt le multi-OS (mon cas de figure), AppleCommander fonctionne sur Mac OS X Leopard, Linux et Windows. Plus limité que CiderPress, ce soft n'en reste pas moins ma préférence: la modification du code source dispo est minim pour obtenir les caractères accentués et l'apprentissage de java ne peut que vous être bénéfique.
Ce projet peut être un point de départ intéressant pour créer d'autres formats de disk image ou pour ajouter un filesystem non actuellement supporté (formats propriétaires d'éditeurs après rétro-engineering par exemple).
Il est aussi possible de travailler sa maitrise des GUI en programmant une version Swing (qui serait encore plus appréciée...) A bon entendeur!