From dcad0cc45b2c1eeda32cc42f3b40dd8e666e5dc3 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 4 Dec 2014 23:06:06 +0100 Subject: [PATCH 01/16] ... --- functions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/functions.py b/functions.py index 1e8141f..f38a5c5 100644 --- a/functions.py +++ b/functions.py @@ -708,6 +708,7 @@ def progressbar(self, maxi) : style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT ) prog.SetIcon(ira._icon) + prog.SetSize((400,150)) return prog -- 2.7.4 From 3d1a621b481e251f8a086af586c7eb0bb87b0004 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Fri, 5 Dec 2014 18:51:10 +0100 Subject: [PATCH 02/16] ... --- guifunct.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guifunct.py b/guifunct.py index c20ee70..822f213 100644 --- a/guifunct.py +++ b/guifunct.py @@ -329,7 +329,7 @@ class PrefSimi ( wx.Dialog ): self.m_staticline40 = wx.StaticLine( self.m_panel2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) fgSizer3.Add( self.m_staticline40, 0, wx.EXPAND |wx.ALL, 5 ) - self.m_staticText321 = wx.StaticText( self.m_panel2, wx.ID_ANY, _(u"Edge curved"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText321 = wx.StaticText( self.m_panel2, wx.ID_ANY, _(u"Edge curved").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText321.Wrap( -1 ) fgSizer3.Add( self.m_staticText321, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) -- 2.7.4 From 22382f493bc8cc5b2621126c9738ead284e68d87 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Fri, 5 Dec 2014 18:59:45 +0100 Subject: [PATCH 03/16] 0.7 alpha 1 ? --- configuration/global.cfg | 4 ++-- configuration/iramuteq.cfg | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configuration/global.cfg b/configuration/global.cfg index 6c92be5..6fc7c20 100644 --- a/configuration/global.cfg +++ b/configuration/global.cfg @@ -6,6 +6,6 @@ copyright = (c) 2008-2014 Pierre Ratinaud author = Pierre Ratinaud gpl-fr = gpl-2.0-fr.txt dev = Pierre Ratinaud (Université de Toulouse - Laboratoire LERASS - ratinaud@univ-tlse2.fr);Sébastien Déjean (Université de Toulouse);David Skalinder (Mash Strategy - davids@mash.uk.com); -version = 0.6 alpha 14 +version = 0.7 alpha 1 licence = GNU GPL (v2) -version_nb = 0.6.a14 \ No newline at end of file +version_nb = 0.7.a1 \ No newline at end of file diff --git a/configuration/iramuteq.cfg b/configuration/iramuteq.cfg index 6f1b59e..647f6d6 100644 --- a/configuration/iramuteq.cfg +++ b/configuration/iramuteq.cfg @@ -5,7 +5,7 @@ language=french guilanguage=french R_mem = false R_max_mem = 1535 -version_nb = 0.6.a14 +version_nb = 0.7.a1 rlibs = false libsvdc = false libsvdc_path = /usr/bin/svd -- 2.7.4 From 42499e5db4394973bd0761d40ea09e515925ed4b Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Fri, 5 Dec 2014 19:00:19 +0100 Subject: [PATCH 04/16] ... --- images/splash.png | Bin 36506 -> 36215 bytes images/splash.svg | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/images/splash.png b/images/splash.png index 9b6d61ae9e14ee0646584a72fdf543104bef303d..0e6059841435a05ab09531ddc0a73e3538b3924c 100644 GIT binary patch literal 36215 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 UjtoNu2><{907*qoM6N<$f`Nj3TL1t6 literal 36506 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 diff --git a/images/splash.svg b/images/splash.svg index c17ed19..cf09a24 100644 --- a/images/splash.svg +++ b/images/splash.svg @@ -167,10 +167,10 @@ inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" - inkscape:window-width="2837" - inkscape:window-height="1776" - inkscape:window-x="43" - inkscape:window-y="24" + inkscape:window-width="2878" + inkscape:window-height="1778" + inkscape:window-x="0" + inkscape:window-y="20" inkscape:window-maximized="1" showguides="true" inkscape:guide-bbox="true"> @@ -332,7 +332,7 @@ x="110.10663" y="146.45171" style="font-size:14px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#1c1010;fill-opacity:1;font-family:gargi;-inkscape-font-specification:gargi Medium" />Version 0.6 alpha 14 Version 0.7 alpha 1 Date: Tue, 9 Dec 2014 00:29:59 +0100 Subject: [PATCH 05/16] ... --- PrintRScript.py | 2 +- ProfList.py | 13 +---- dialog.py | 16 +++--- iramuteq_fr_FR.po | 100 ++++++++++++++++++++--------------- locale/es_ES/LC_MESSAGES/iramuteq.mo | Bin 378 -> 378 bytes locale/fr_FR/LC_MESSAGES/iramuteq.mo | Bin 21324 -> 21324 bytes locale/it_IT/LC_MESSAGES/iramuteq.mo | Bin 378 -> 378 bytes locale/pt_PT/LC_MESSAGES/iramuteq.mo | Bin 18166 -> 18166 bytes messages.pot | 92 ++++++++++++++++++-------------- 9 files changed, 119 insertions(+), 104 deletions(-) diff --git a/PrintRScript.py b/PrintRScript.py index deaddf5..fbcf5cf 100644 --- a/PrintRScript.py +++ b/PrintRScript.py @@ -1189,7 +1189,7 @@ class ProtoScript(PrintRScript) : open_file_graph("%s",height=800, width=1000) prototypical(mat, mfreq = %s, mrank = %s, cloud = FALSE, cexrange=c(1,2.4), cexalpha= c(0.4, 1), type = '%s') dev.off() - """ % (self.analyse.pathout['table.csv'], self.analyse.pathout['proto.png'], self.parametres['limfreq'], self.parametres['limrang'], self.parametres['typegraph']) + """ % (ffr(self.analyse.pathout['table.csv']), ffr(self.analyse.pathout['proto.png']), self.parametres['limfreq'], self.parametres['limrang'], self.parametres['typegraph']) self.add(txt) self.write() diff --git a/ProfList.py b/ProfList.py index 1ecb47a..7bf1290 100644 --- a/ProfList.py +++ b/ProfList.py @@ -14,10 +14,8 @@ #---------------------------------------------------------------------------- import os -import sys import wx import wx.lib.mixins.listctrl as listmix -#from tabsimi import DoSimi from listlex import ListForSpec from chemins import ConstructPathOut, ffr from dialog import PrefUCECarac, SearchDial, message, BarFrame @@ -28,9 +26,6 @@ import webbrowser import tempfile import codecs from functions import progressbar, treat_var_mod, doconcorde -from PrintRScript import barplot -from textclassechd import ClasseCHD -from shutil import copyfile from operator import itemgetter from copy import copy @@ -372,9 +367,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col parametres['type'] = 'clustercloud' parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl] del parametres['uuid'] - #if not os.path.exists(self.Source.pathout['actprof_classe_%i.csv' % self.lc]) : - # with open(self.Source.pathout['actprof_classe_%i.csv' % self.lc], 'w') as f : - # f.write('\n'.join(prof).encode(self.parent.syscoding)) self.parent.OnClusterCloud(self.Source.corpus, parametres = parametres) def onexport(self, evt) : @@ -388,9 +380,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], u"Export", wx.OK|wx.ICON_INFORMATION) dial.ShowModal() dial.Destroy() - #if 'corpus' in dir(self.Source): - # corpus = self.Source.corpus - #ClasseCHD(self.parent, corpus, self.cl) def onexporttropes(self, evt) : if 'corpus' in dir(self.Source): @@ -596,7 +585,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col if dial.ShowModal() == wx.ID_OK : limite = dial.spin_eff.GetValue() atype = dial.radio_type.GetSelection() - dlg = progressbar(self,maxi = 4) + dlg = progressbar(self.ira,maxi = 4) corpus = self.Source.corpus uces = corpus.lc[self.cl-1] if self.Source.parametres['classif_mode'] != 2 : diff --git a/dialog.py b/dialog.py index e063cda..751f888 100755 --- a/dialog.py +++ b/dialog.py @@ -3082,7 +3082,7 @@ class SubTextFromMetaDial ( wx.Dialog ): class BarGraphDialog ( wx.Dialog ): def __init__( self, parent, width, height ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Preferences", pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE ) + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"Preferences").decode('utf8'), pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE ) self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) @@ -3090,11 +3090,11 @@ class BarGraphDialog ( wx.Dialog ): bSizer2 = wx.BoxSizer( wx.HORIZONTAL ) - self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"Size", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, _(u"Size").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText1.Wrap( -1 ) bSizer2.Add( self.m_staticText1, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - sizeradioChoices = [ u"automatic", u"manual" ] + sizeradioChoices = [ _(u"automatic").decode('utf8'), _(u"manual").decode('utf8') ] self.sizeradio = wx.RadioBox( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, sizeradioChoices, 1, wx.RA_SPECIFY_COLS ) self.sizeradio.SetSelection( 0 ) bSizer2.Add( self.sizeradio, 0, wx.ALIGN_TOP|wx.ALL, 5 ) @@ -3103,14 +3103,14 @@ class BarGraphDialog ( wx.Dialog ): fgSizer1.SetFlexibleDirection( wx.BOTH ) fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"width", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, _(u"width").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText2.Wrap( -1 ) fgSizer1.Add( self.m_staticText2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) self.widthsp = wx.SpinCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 1000000, 600 ) fgSizer1.Add( self.widthsp, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) - self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"height", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, _(u"height").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText3.Wrap( -1 ) fgSizer1.Add( self.m_staticText3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) @@ -3125,7 +3125,7 @@ class BarGraphDialog ( wx.Dialog ): bSizer3 = wx.BoxSizer( wx.HORIZONTAL ) - self.m_staticText4 = wx.StaticText( self, wx.ID_ANY, u"Image format", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText4 = wx.StaticText( self, wx.ID_ANY, _(u"Image format").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText4.Wrap( -1 ) bSizer3.Add( self.m_staticText4, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) @@ -3219,7 +3219,7 @@ class MessageImage(wx.Frame): def OnSaveImage(self, event) : dlg = wx.FileDialog( - self, message="Enregistrer sous...", defaultDir=os.getcwd(), + self, message=_(u"Save as...").decode('utf8'), defaultDir=os.getcwd(), defaultFile= self.imagename, wildcard=self.parametres['wildcard'], style=wx.SAVE | wx.OVERWRITE_PROMPT ) dlg.SetFilterIndex(2) @@ -3263,7 +3263,7 @@ class BarFrame : with open(tmpscript,'w') as f : f.write(txt) exec_rcode(ira.RPath, tmpscript, wait = True) - win = MessageImage(ira, parametres, u"Graphique", size=(700, 500)) + win = MessageImage(ira, parametres, _(u"Graphic").decode('utf8'), size=(700, 500)) if svg == 'FALSE' : txt = "" % tmpgraph else : diff --git a/iramuteq_fr_FR.po b/iramuteq_fr_FR.po index be3646a..064b0d6 100644 --- a/iramuteq_fr_FR.po +++ b/iramuteq_fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: iramuteq 0.6 alpha 1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-02 18:12+0100\n" +"POT-Creation-Date: 2014-12-09 00:28+0100\n" "PO-Revision-Date: 2014-12-02 18:17+0200\n" "Last-Translator: Pierre Ratinaud \n" "Language-Team: LANGUAGE \n" @@ -45,7 +45,7 @@ msgstr "Variables actives (au moins 3)" msgid "Add cluster size" msgstr "Ajouter la taille des classes" -#: ProfList.py:700 +#: ProfList.py:689 msgid "All segments" msgstr "Tous les segments" @@ -53,7 +53,7 @@ msgstr "Tous les segments" msgid "Antiprofiles" msgstr "Antiprofils" -#: ProfList.py:332 +#: ProfList.py:327 msgid "Antonym" msgstr "Antonyme" @@ -61,8 +61,8 @@ msgstr "Antonyme" msgid "Are you sure ?" msgstr "Êtes-vous sûr ?" -#: Liste.py:163 Liste.py:180 listlex.py:198 listlex.py:233 ProfList.py:313 -#: ProfList.py:754 +#: Liste.py:163 Liste.py:180 listlex.py:198 listlex.py:233 ProfList.py:308 +#: ProfList.py:743 msgid "Associated forms" msgstr "Formes associées" @@ -138,15 +138,15 @@ msgstr "" msgid "Chi2" msgstr "Chi2" -#: ProfList.py:314 ProfList.py:359 +#: ProfList.py:309 ProfList.py:354 msgid "Chi2 by cluster" msgstr "Chi2 par classe" -#: ProfList.py:315 +#: ProfList.py:310 msgid "Chi2 by cluster on dendrogram" msgstr "Chi2 par classe et dendrogramme" -#: ProfList.py:316 ProfList.py:360 +#: ProfList.py:311 ProfList.py:355 msgid "Chi2 modalities of variable" msgstr "Chi2 modalités de la variable" @@ -166,7 +166,7 @@ msgstr "Choisissez un répertoire" msgid "Cleaning" msgstr "Nettoyage" -#: ProfList.py:767 +#: ProfList.py:756 msgid "Close" msgstr "Fermer" @@ -203,8 +203,8 @@ msgstr "Communautés" msgid "Compute Tgen" msgstr "Calculer les TGen" -#: Liste.py:164 Liste.py:191 listlex.py:199 listlex.py:294 ProfList.py:326 -#: ProfList.py:688 ProfList.py:694 ProfList.py:700 +#: Liste.py:164 Liste.py:191 listlex.py:199 listlex.py:294 ProfList.py:321 +#: ProfList.py:677 ProfList.py:683 ProfList.py:689 msgid "Concordance" msgstr "Concordancier" @@ -224,7 +224,7 @@ msgstr "Miroir par défaut de R" msgid "Default values" msgstr "Valeurs par défaut" -#: ProfList.py:329 +#: ProfList.py:324 msgid "Definition" msgstr "Définition" @@ -276,7 +276,7 @@ msgstr "Largeur des arêtes proportionnelle à l'indice" msgid "Edition" msgstr "Edition" -#: ProfList.py:330 +#: ProfList.py:325 msgid "Etymology" msgstr "Etymologie" @@ -304,7 +304,7 @@ msgstr "Export terminé. Ouvrez ce lien dans un navigateur :" msgid "Export for ..." msgstr "Exporter pour ..." -#: ProfList.py:342 +#: ProfList.py:337 msgid "Export for Tropes" msgstr "Exporter pour Tropes" @@ -312,11 +312,11 @@ msgstr "Exporter pour Tropes" msgid "Export lemma dictionary" msgstr "Exporter le dictionnaire des lemmes" -#: ProfList.py:341 +#: ProfList.py:336 msgid "Export..." msgstr "Exporter..." -#: ProfList.py:343 +#: ProfList.py:338 msgid "Exporter for Owledge" msgstr "Exporter pour Owledge" @@ -404,7 +404,7 @@ msgstr "Général" msgid "Graph analysis" msgstr "Analyse de graphe" -#: ProfList.py:337 ProfList.py:362 +#: ProfList.py:332 ProfList.py:357 msgid "Graph of cluster" msgstr "Graphe de la classe" @@ -412,7 +412,7 @@ msgstr "Graphe de la classe" msgid "Graph settings" msgstr "Paramètres du graphe" -#: listlex.py:200 listlex.py:345 +#: dialog.py:3266 listlex.py:200 listlex.py:345 msgid "Graphic" msgstr "Graphique" @@ -444,7 +444,7 @@ msgstr "Historique" msgid "Home page" msgstr "Page d'accueil" -#: dialog.py:1869 +#: dialog.py:1869 dialog.py:3128 msgid "Image format" msgstr "Format de l'image" @@ -456,15 +456,15 @@ msgstr "Importer de TXM" msgid "Import from factiva" msgstr "Importer de factiva" -#: ProfList.py:325 +#: ProfList.py:320 msgid "In all segments" msgstr "Dans tous les segments" -#: ProfList.py:323 +#: ProfList.py:318 msgid "In segments of this cluster" msgstr "Dans les segments de cette classe" -#: ProfList.py:324 +#: ProfList.py:319 msgid "In segments of this clustering" msgstr "Dans les segments de cette classification" @@ -532,7 +532,7 @@ msgstr "Rang limite" msgid "List of not plotted points : " msgstr "Liste des points non-représentés" -#: listlex.py:210 ProfList.py:327 +#: listlex.py:210 ProfList.py:322 msgid "Make Tgen" msgstr "Faire un TGen" @@ -616,7 +616,7 @@ msgstr "Nombre minimum de segments de texte par classe (2 = automatique)" msgid "Modalities (one by line, with the *)" msgstr "Modalités (une par ligne, avec l'étoile (*))" -#: ProfList.py:333 +#: ProfList.py:328 msgid "Morphology" msgstr "Morphologie" @@ -772,7 +772,7 @@ msgstr "Taille de l'image" msgid "Play a sound at the end of analysis" msgstr "Jouer un son à la fin des analyses" -#: corpus.py:1622 iramuteq.py:581 iramuteq.py:626 layout.py:946 tree.py:739 +#: corpus.py:1624 iramuteq.py:581 iramuteq.py:626 layout.py:946 tree.py:739 #: tree.py:1063 msgid "Please wait..." msgstr "Patientez ..." @@ -785,7 +785,7 @@ msgstr "Patientez... Lecture du corpus" msgid "Potato mode (less precise, faster)" msgstr "Mode patate (moins précis, plus rapide)" -#: iramuteq.py:251 +#: dialog.py:3085 iramuteq.py:251 msgid "Preferences" msgstr "Préférences" @@ -793,7 +793,7 @@ msgstr "Préférences" msgid "Previous" msgstr "Précédent" -#: ProfList.py:428 ProfList.py:462 +#: ProfList.py:417 ProfList.py:451 msgid "Problem" msgstr "Problème" @@ -809,7 +809,7 @@ msgstr "Analyses Prototypiques" msgid "Prototypical analysis" msgstr "Analyses Prototypiques" -#: ProfList.py:334 +#: ProfList.py:329 msgid "Proxemy" msgstr "Proxémie" @@ -845,7 +845,7 @@ msgstr "Méthode Reinert" msgid "Rename" msgstr "Renommer" -#: ProfList.py:338 ProfList.py:590 +#: ProfList.py:333 ProfList.py:579 msgid "Repeated segments" msgstr "Segments répétés" @@ -877,6 +877,11 @@ msgstr "Résultats" msgid "Save as ..." msgstr "Enregistrer sous ..." +#: dialog.py:3222 +#, fuzzy +msgid "Save as..." +msgstr "Enregistrer sous ..." + #: dialog.py:1736 guifunct.py:219 msgid "Score" msgstr "Indice" @@ -889,11 +894,11 @@ msgstr "Indices sur les arêtes" msgid "Search ..." msgstr "Rechercher ..." -#: ProfList.py:249 +#: ProfList.py:244 msgid "Search..." msgstr "Rechercher ..." -#: ProfList.py:694 +#: ProfList.py:683 msgid "Segments of this clustering" msgstr "Segments de cette classe" @@ -938,6 +943,10 @@ msgstr "Voir les résultats" msgid "Similarities Analysis" msgstr "Analyses de similitudes" +#: dialog.py:3093 +msgid "Size" +msgstr "" + #: OptionAlceste.py:31 msgid "Size of rst1" msgstr "Taille de rst1" @@ -1006,7 +1015,7 @@ msgstr "Formes supplémentaires" msgid "Supplementary variables are marked with a *" msgstr "Les variables supplémentaires sont marquées par une *" -#: ProfList.py:331 +#: ProfList.py:326 msgid "Synonymous" msgstr "Synonymes" @@ -1083,11 +1092,11 @@ msgstr "Ce fichier n'existe pas : %s" msgid "This file will be delete : " msgstr "Ce fichier sera supprimer : " -#: ProfList.py:462 +#: ProfList.py:451 msgid "This is not a meta-data" msgstr "Ce n'est pas une méta-donnée" -#: ProfList.py:428 +#: ProfList.py:417 msgid "This is not a variable_modality form" msgstr "Ce n'est pas une forme du type variable_modalité" @@ -1095,7 +1104,7 @@ msgstr "Ce n'est pas une forme du type variable_modalité" msgid "Tools" msgstr "Outils" -#: ProfList.py:335 +#: ProfList.py:330 msgid "Tools from CNRTL (french only)" msgstr "Outils du CNTRL (français uniquement)" @@ -1103,7 +1112,7 @@ msgstr "Outils du CNTRL (français uniquement)" msgid "Total" msgstr "Total" -#: listlex.py:209 listlex.py:274 ProfList.py:339 ProfList.py:622 +#: listlex.py:209 listlex.py:274 ProfList.py:334 ProfList.py:611 msgid "Typical text segments" msgstr "Segments de texte caractéristiques" @@ -1163,11 +1172,11 @@ msgstr "Vue" msgid "Welcome" msgstr "Bienvenue" -#: ProfList.py:340 +#: ProfList.py:335 msgid "Word cloud of cluster" msgstr "Nuage de mots de la classe" -#: ProfList.py:317 +#: ProfList.py:312 msgid "Word graph" msgstr "Graphe du mot" @@ -1203,6 +1212,11 @@ msgstr "formes actives" msgid "antiprofiles" msgstr "antiprofils" +#: dialog.py:3097 +#, fuzzy +msgid "automatic" +msgstr "automatique (moyenne)" + #: dialog.py:2907 dialog.py:2927 msgid "automatic (mean)" msgstr "automatique (moyenne)" @@ -1291,7 +1305,7 @@ msgstr "à partir de fichiers xml" msgid "graphical" msgstr "Graphique" -#: dialog.py:554 dialog.py:1826 dialog.py:1979 guifunct.py:416 +#: dialog.py:554 dialog.py:1826 dialog.py:1979 dialog.py:3113 guifunct.py:416 msgid "height" msgstr "hauteur" @@ -1307,7 +1321,7 @@ msgstr "indexation" msgid "line classified on" msgstr "lignes classées sur" -#: dialog.py:2907 dialog.py:2927 +#: dialog.py:2907 dialog.py:2927 dialog.py:3097 msgid "manual" msgstr "manuelle" @@ -1316,7 +1330,7 @@ msgid "modalities" msgstr "modalités" #: dialog.py:46 dialog.py:56 dialog.py:349 dialog.py:364 dialog.py:921 -#: dialog.py:1259 dialog.py:1331 +#: dialog.py:1056 dialog.py:1259 dialog.py:1331 msgid "no" msgstr "non" @@ -1412,12 +1426,12 @@ msgstr "pourcentage total" msgid "variables" msgstr "variables" -#: dialog.py:552 dialog.py:1837 dialog.py:1991 guifunct.py:423 +#: dialog.py:552 dialog.py:1837 dialog.py:1991 dialog.py:3106 guifunct.py:423 msgid "width" msgstr "largeur" #: dialog.py:46 dialog.py:56 dialog.py:349 dialog.py:364 dialog.py:921 -#: dialog.py:1259 dialog.py:1331 +#: dialog.py:1056 dialog.py:1259 dialog.py:1331 msgid "yes" msgstr "oui" diff --git a/locale/es_ES/LC_MESSAGES/iramuteq.mo b/locale/es_ES/LC_MESSAGES/iramuteq.mo index d2b3c56dbfc3e62a47aa101c02e27d369d3c3655..219b0ef35590c6d16c92ef112b0dc1a2bc32260c 100644 GIT binary patch delta 17 Zcmeyx^owc21a?aW0|P4~i;2@80{}Y?28aLv delta 17 Zcmeyx^owc21a@NuLklYt!->-$0{}Y!28I9t diff --git a/locale/fr_FR/LC_MESSAGES/iramuteq.mo b/locale/fr_FR/LC_MESSAGES/iramuteq.mo index aabce4f9583928f2f9fbec9335180e055b9eb0b7..72cf44063473a2872aab4a7f59fb3913b1cfcfc0 100644 GIT binary patch delta 22 ecmX@JjPcAe#tm;x*ew+d46KYSHh(dRkOKf~8VGFw delta 22 ecmX@JjPcAe#tm;x*o_qoEv!roH-9mSkOKf~2ncHc diff --git a/locale/it_IT/LC_MESSAGES/iramuteq.mo b/locale/it_IT/LC_MESSAGES/iramuteq.mo index d2b3c56dbfc3e62a47aa101c02e27d369d3c3655..219b0ef35590c6d16c92ef112b0dc1a2bc32260c 100644 GIT binary patch delta 17 Zcmeyx^owc21a?aW0|P4~i;2@80{}Y?28aLv delta 17 Zcmeyx^owc21a@NuLklYt!->-$0{}Y!28I9t diff --git a/locale/pt_PT/LC_MESSAGES/iramuteq.mo b/locale/pt_PT/LC_MESSAGES/iramuteq.mo index 863054bcdad2f121abf0867c12267a6094dccf3f..56d2b12cc5ca5b13b38c2a8b7f52d3cbbdb2a653 100644 GIT binary patch delta 22 dcmey?%lNIAaYM5%yQPAGft8WP<}TeFNdRTj2fP3P delta 22 dcmey?%lNIAaYM5%yRm|yg_Vin<}TeFNdRTR2f6?N diff --git a/messages.pot b/messages.pot index e73ae25..b5ba85f 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-03 18:41+0100\n" +"POT-Creation-Date: 2014-12-09 00:28+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -45,7 +45,7 @@ msgstr "" msgid "Add cluster size" msgstr "" -#: ProfList.py:700 +#: ProfList.py:689 msgid "All segments" msgstr "" @@ -53,7 +53,7 @@ msgstr "" msgid "Antiprofiles" msgstr "" -#: ProfList.py:332 +#: ProfList.py:327 msgid "Antonym" msgstr "" @@ -61,8 +61,8 @@ msgstr "" msgid "Are you sure ?" msgstr "" -#: Liste.py:163 Liste.py:180 listlex.py:198 listlex.py:233 ProfList.py:313 -#: ProfList.py:754 +#: Liste.py:163 Liste.py:180 listlex.py:198 listlex.py:233 ProfList.py:308 +#: ProfList.py:743 msgid "Associated forms" msgstr "" @@ -134,15 +134,15 @@ msgstr "" msgid "Chi2" msgstr "" -#: ProfList.py:314 ProfList.py:359 +#: ProfList.py:309 ProfList.py:354 msgid "Chi2 by cluster" msgstr "" -#: ProfList.py:315 +#: ProfList.py:310 msgid "Chi2 by cluster on dendrogram" msgstr "" -#: ProfList.py:316 ProfList.py:360 +#: ProfList.py:311 ProfList.py:355 msgid "Chi2 modalities of variable" msgstr "" @@ -162,7 +162,7 @@ msgstr "" msgid "Cleaning" msgstr "" -#: ProfList.py:767 +#: ProfList.py:756 msgid "Close" msgstr "" @@ -199,8 +199,8 @@ msgstr "" msgid "Compute Tgen" msgstr "" -#: Liste.py:164 Liste.py:191 listlex.py:199 listlex.py:294 ProfList.py:326 -#: ProfList.py:688 ProfList.py:694 ProfList.py:700 +#: Liste.py:164 Liste.py:191 listlex.py:199 listlex.py:294 ProfList.py:321 +#: ProfList.py:677 ProfList.py:683 ProfList.py:689 msgid "Concordance" msgstr "" @@ -220,7 +220,7 @@ msgstr "" msgid "Default values" msgstr "" -#: ProfList.py:329 +#: ProfList.py:324 msgid "Definition" msgstr "" @@ -272,7 +272,7 @@ msgstr "" msgid "Edition" msgstr "" -#: ProfList.py:330 +#: ProfList.py:325 msgid "Etymology" msgstr "" @@ -300,7 +300,7 @@ msgstr "" msgid "Export for ..." msgstr "" -#: ProfList.py:342 +#: ProfList.py:337 msgid "Export for Tropes" msgstr "" @@ -308,11 +308,11 @@ msgstr "" msgid "Export lemma dictionary" msgstr "" -#: ProfList.py:341 +#: ProfList.py:336 msgid "Export..." msgstr "" -#: ProfList.py:343 +#: ProfList.py:338 msgid "Exporter for Owledge" msgstr "" @@ -400,7 +400,7 @@ msgstr "" msgid "Graph analysis" msgstr "" -#: ProfList.py:337 ProfList.py:362 +#: ProfList.py:332 ProfList.py:357 msgid "Graph of cluster" msgstr "" @@ -408,7 +408,7 @@ msgstr "" msgid "Graph settings" msgstr "" -#: listlex.py:200 listlex.py:345 +#: dialog.py:3266 listlex.py:200 listlex.py:345 msgid "Graphic" msgstr "" @@ -440,7 +440,7 @@ msgstr "" msgid "Home page" msgstr "" -#: dialog.py:1869 +#: dialog.py:1869 dialog.py:3128 msgid "Image format" msgstr "" @@ -452,15 +452,15 @@ msgstr "" msgid "Import from factiva" msgstr "" -#: ProfList.py:325 +#: ProfList.py:320 msgid "In all segments" msgstr "" -#: ProfList.py:323 +#: ProfList.py:318 msgid "In segments of this cluster" msgstr "" -#: ProfList.py:324 +#: ProfList.py:319 msgid "In segments of this clustering" msgstr "" @@ -528,7 +528,7 @@ msgstr "" msgid "List of not plotted points : " msgstr "" -#: listlex.py:210 ProfList.py:327 +#: listlex.py:210 ProfList.py:322 msgid "Make Tgen" msgstr "" @@ -610,7 +610,7 @@ msgstr "" msgid "Modalities (one by line, with the *)" msgstr "" -#: ProfList.py:333 +#: ProfList.py:328 msgid "Morphology" msgstr "" @@ -779,7 +779,7 @@ msgstr "" msgid "Potato mode (less precise, faster)" msgstr "" -#: iramuteq.py:251 +#: dialog.py:3085 iramuteq.py:251 msgid "Preferences" msgstr "" @@ -787,7 +787,7 @@ msgstr "" msgid "Previous" msgstr "" -#: ProfList.py:428 ProfList.py:462 +#: ProfList.py:417 ProfList.py:451 msgid "Problem" msgstr "" @@ -803,7 +803,7 @@ msgstr "" msgid "Prototypical analysis" msgstr "" -#: ProfList.py:334 +#: ProfList.py:329 msgid "Proxemy" msgstr "" @@ -839,7 +839,7 @@ msgstr "" msgid "Rename" msgstr "" -#: ProfList.py:338 ProfList.py:590 +#: ProfList.py:333 ProfList.py:579 msgid "Repeated segments" msgstr "" @@ -871,6 +871,10 @@ msgstr "" msgid "Save as ..." msgstr "" +#: dialog.py:3222 +msgid "Save as..." +msgstr "" + #: dialog.py:1736 guifunct.py:219 msgid "Score" msgstr "" @@ -883,11 +887,11 @@ msgstr "" msgid "Search ..." msgstr "" -#: ProfList.py:249 +#: ProfList.py:244 msgid "Search..." msgstr "" -#: ProfList.py:694 +#: ProfList.py:683 msgid "Segments of this clustering" msgstr "" @@ -932,6 +936,10 @@ msgstr "" msgid "Similarities Analysis" msgstr "" +#: dialog.py:3093 +msgid "Size" +msgstr "" + #: OptionAlceste.py:31 msgid "Size of rst1" msgstr "" @@ -1000,7 +1008,7 @@ msgstr "" msgid "Supplementary variables are marked with a *" msgstr "" -#: ProfList.py:331 +#: ProfList.py:326 msgid "Synonymous" msgstr "" @@ -1077,11 +1085,11 @@ msgstr "" msgid "This file will be delete : " msgstr "" -#: ProfList.py:462 +#: ProfList.py:451 msgid "This is not a meta-data" msgstr "" -#: ProfList.py:428 +#: ProfList.py:417 msgid "This is not a variable_modality form" msgstr "" @@ -1089,7 +1097,7 @@ msgstr "" msgid "Tools" msgstr "" -#: ProfList.py:335 +#: ProfList.py:330 msgid "Tools from CNRTL (french only)" msgstr "" @@ -1097,7 +1105,7 @@ msgstr "" msgid "Total" msgstr "" -#: listlex.py:209 listlex.py:274 ProfList.py:339 ProfList.py:622 +#: listlex.py:209 listlex.py:274 ProfList.py:334 ProfList.py:611 msgid "Typical text segments" msgstr "" @@ -1157,11 +1165,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: ProfList.py:340 +#: ProfList.py:335 msgid "Word cloud of cluster" msgstr "" -#: ProfList.py:317 +#: ProfList.py:312 msgid "Word graph" msgstr "" @@ -1197,6 +1205,10 @@ msgstr "" msgid "antiprofiles" msgstr "" +#: dialog.py:3097 +msgid "automatic" +msgstr "" + #: dialog.py:2907 dialog.py:2927 msgid "automatic (mean)" msgstr "" @@ -1285,7 +1297,7 @@ msgstr "" msgid "graphical" msgstr "" -#: dialog.py:554 dialog.py:1826 dialog.py:1979 guifunct.py:416 +#: dialog.py:554 dialog.py:1826 dialog.py:1979 dialog.py:3113 guifunct.py:416 msgid "height" msgstr "" @@ -1301,7 +1313,7 @@ msgstr "" msgid "line classified on" msgstr "" -#: dialog.py:2907 dialog.py:2927 +#: dialog.py:2907 dialog.py:2927 dialog.py:3097 msgid "manual" msgstr "" @@ -1406,7 +1418,7 @@ msgstr "" msgid "variables" msgstr "" -#: dialog.py:552 dialog.py:1837 dialog.py:1991 guifunct.py:423 +#: dialog.py:552 dialog.py:1837 dialog.py:1991 dialog.py:3106 guifunct.py:423 msgid "width" msgstr "" -- 2.7.4 From e4be76cb931f5c0935e4ea40c1f362805c1c93a6 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Tue, 9 Dec 2014 13:53:52 +0100 Subject: [PATCH 06/16] ... --- profile_segment.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/profile_segment.py b/profile_segment.py index b0ca4c4..e0f68b8 100644 --- a/profile_segment.py +++ b/profile_segment.py @@ -12,6 +12,7 @@ from functions import exec_rcode, check_Rresult, ReadProfileAsDico, ReadList from listlex import * from dialog import PrefSegProf, PrefProfTypes from time import sleep +from chemins import ffr class ProfileSegment() : def __init__(self, parent, pathout, parametres, corpus) : @@ -46,13 +47,13 @@ class ProfileSegment() : txt = """ load("%s") source("%s") - """ % (self.dictpathout['RData'], self.parent.RscriptsPath['chdfunct']) + """ % (ffr(self.dictpathout['RData']), ffr(self.parent.RscriptsPath['chdfunct'])) txt += """ dt <- read.csv2("%s", row.names = 1) to <- build.pond.prof(dt) PrintProfile(n1,to[4],NULL,to[5],NULL,clnb,"%s","%s") - """ % (self.corpus.dictpathout['segments_classes'], self.dictpathout['prof_seg'], self.dictpathout['antiprof_seg']) + """ % (ffr(self.corpus.dictpathout['segments_classes']), ffr(self.dictpathout['prof_seg']), ffr(self.dictpathout['antiprof_seg'])) fo = tempfile.mktemp(dir=self.parent.TEMPDIR) with open(fo, 'w') as f : f.write(txt) @@ -109,21 +110,21 @@ class ProfilType() : txt = """ load("%s") source("%s") - """ % (self.corpus.dictpathout['RData'], self.parent.RscriptsPath['chdfunct']) + """ % (ffr(self.corpus.dictpathout['RData']), ffr(self.parent.RscriptsPath['chdfunct'])) txt += """ dt <- read.csv2("%s", row.names = 1) - """ % self.corpus.dictpathout['type_cl'] + """ % ffr(self.corpus.dictpathout['type_cl']) if alceste : txt += """ to <- build.pond.prof(dt) PrintProfile(n1,to[4],NULL,to[5],NULL,clnb,"%s","%s") - """ % (self.outprof, self.corpus.dictpathout['antiprof_type']) + """ % (ffr(self.outprof), ffr(self.corpus.dictpathout['antiprof_type'])) else : txt += """ to <- AsLexico2(dt) write.csv2(to[[1]], file = "%s") - """ % (self.outprof) + """ % (ffr(self.outprof)) # write.csv2(to[[3]], file = "%s") # % (self.outprof) fo = tempfile.mktemp(dir=self.parent.TEMPDIR) -- 2.7.4 From 992d1e91b97a956ca2a7336e9f365ff8bea45e03 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Wed, 10 Dec 2014 17:43:36 +0100 Subject: [PATCH 07/16] ... --- dialog.py | 20 +++++-- iramuteq.py | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- tree.py | 131 ++++++++++++++++--------------------------- 3 files changed, 216 insertions(+), 117 deletions(-) diff --git a/dialog.py b/dialog.py index 751f888..66a427a 100755 --- a/dialog.py +++ b/dialog.py @@ -2676,9 +2676,8 @@ class message(wx.Frame): self.Destroy() def OnSub(self ,evt): - parametres = {'fromuceids' : True, 'uceids' : self.uceids} - self.ira.OnSubText(None, parametres) - + parametres = {'fromuceids' : True, 'uceids' : self.uceids, 'isempty' : True} + self.ira.OnSubText(wx.MenuEvent(), None, parametres) class ExtractDialog ( wx.Dialog ): @@ -3029,7 +3028,7 @@ class SimpleDialog ( wx.Dialog ): class SubTextFromMetaDial ( wx.Dialog ): def __init__( self, parent, parametres ): - wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Subcorpus from metadata", pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE ) + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"Subcorpus").decode('utf8'), pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE ) self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) @@ -3039,14 +3038,14 @@ class SubTextFromMetaDial ( wx.Dialog ): fgSizer1.SetFlexibleDirection( wx.BOTH ) fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) - self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"SubCorpus Name", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, _(u"Name").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText1.Wrap( -1 ) fgSizer1.Add( self.m_staticText1, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) self.subcorpusname = wx.TextCtrl( self, wx.ID_ANY, parametres['corpus_name'], wx.DefaultPosition, wx.Size( 300,-1 ), 0 ) fgSizer1.Add( self.subcorpusname, 0, wx.ALL, 5 ) - self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"Select one or more metadata", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, _(u"Select one or more metadata").decode('utf8'), wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText2.Wrap( -1 ) fgSizer1.Add( self.m_staticText2, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 ) @@ -3075,9 +3074,18 @@ class SubTextFromMetaDial ( wx.Dialog ): bSizer1.Fit( self ) self.Centre( wx.BOTH ) + self.Bind(wx.EVT_LISTBOX, self.onchoose, self.m_listBox1) + if not parametres.get('isempty', False) : + self.m_sdbSizer1OK.Enable(False) def __del__( self ): pass + + def onchoose(self, evt): + if len(self.m_listBox1.GetSelections()) > 0 : + self.m_sdbSizer1OK.Enable(True) + else : + self.m_sdbSizer1OK.Enable(False) class BarGraphDialog ( wx.Dialog ): diff --git a/iramuteq.py b/iramuteq.py index 9618316..c762bf8 100644 --- a/iramuteq.py +++ b/iramuteq.py @@ -90,6 +90,10 @@ ID_SimiTxt = wx.NewId() ID_proto = wx.NewId() ID_ImportTXM = wx.NewId() ID_FreqMulti = wx.NewId() +ID_Splitfromvar = wx.NewId() +ID_Subtxtfrommeta = wx.NewId() +ID_Subtxtfromthem = wx.NewId() +ID_WC = wx.NewId() ########################################################## #elements de configuration ########################################################## @@ -158,6 +162,27 @@ code_langues = {'french' : 'fr_FR', 'italian' : 'it_IT', 'spanish' : 'es_ES' } + +images_analyses = { + 'textroot' : 'textroot.png', + 'alceste' : 'reinert.png', + 'corpus' : 'textcorpus.png', + 'wordcloud' :'wordcloud.png', + 'stat' :'stats.png', + 'simitxt' : 'simitxt.png', + 'clustersimitxt' :'clustersimitxt.png', + 'clustercloud' : 'clustercloud.png', + 'spec' : 'spec.png', + 'matroot' : 'matroot.png', + 'matrix' : 'matrix.png', + 'freq' : 'frequences.png', + 'freqmulti' : 'frequences.png', + 'chi2' : 'chi2.png', + 'reinertmatrix' : 'reinertmatrix.png', + 'simimatrix' : 'simimatrix.png', + 'simiclustermatrix' : 'simimatrix.png', + 'proto' : 'proto.png', + } ##################################################################### class IraFrame(wx.Frame): @@ -199,15 +224,19 @@ class IraFrame(wx.Frame): self.x = 0 # create menu #-------------------------------------------------------------------------------- + self.images_analyses = images_analyses + for img in images_analyses : + self.images_analyses[img] = wx.Image(os.path.join(self.images_path, self.images_analyses[img]), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap() self.mb = wx.MenuBar() file_menu = wx.Menu() item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8')) - item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) + #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) + item.SetBitmap(self.images_analyses['matroot']) file_menu.AppendItem(item) item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8')) - item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) + item.SetBitmap(self.images_analyses['textroot']) file_menu.AppendItem(item) item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8')) @@ -256,17 +285,44 @@ class IraFrame(wx.Frame): view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8')) #view_menu.AppendSeparator() matrix_menu = wx.Menu() - matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8')) - matrix_menu.Append(ID_FreqMulti, _(u'Multiple frequencies').decode('utf8')) - matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8')) + matanalyses = [[ID_Freq, _(u"Frequencies").decode('utf8'), 'freq'], + [ID_Freq, _(u"Multiple Frequencies").decode('utf8'), 'freqmulti'], + [ID_Chi2, _(u"Chi2").decode('utf8'), 'chi2'], + {'name' : _(u"Clustering").decode('utf8'), + 'content' : [[ID_CHDReinert, _(u"Reinert's Method").decode('utf8'), 'reinertmatrix']]}, + [ID_SIMI, _(u"Similarities Analysis").decode('utf8'), 'simimatrix'], + [ID_proto, _(u"Prototypical Analysis").decode('utf8'), 'proto'], + [ID_Splitfromvar, _(u"Split from variable").decode('utf8'), '']] + + for analyse in matanalyses : + if not isinstance(analyse, dict) : + item = wx.MenuItem(matrix_menu, analyse[0], analyse[1]) + item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16))) + matrix_menu.AppendItem(item) + else : + nmenu = wx.Menu() + for subana in analyse['content'] : + item = wx.MenuItem(nmenu, subana[0], subana[1]) + item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16))) + nmenu.AppendItem(item) + matrix_menu.AppendMenu(-1, analyse['name'], nmenu) + #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Frequencies").decode('utf8')) + #item.SetBitmap(self.images_analyses['freq']) + #matrix_menu.AppendItem(item) + #matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8')) + #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Multiple Frequencies").decode('utf8')) + #item.SetBitmap(self.images_analyses['freqmulti']) + #matrix_menu.Append(ID_FreqMulti, _(u'Multiple frequencies').decode('utf8')) + #matrix_menu.AppendItem(item) + #matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8')) #matrix_menu.Append(ID_Student, u"t de Student") - menu_classif = wx.Menu() - menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8')) + #menu_classif = wx.Menu() + #menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8')) #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances") - matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif) + #matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif) #matrix_menu.Append(ID_AFCM, u"AFCM") - matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8')) - matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8')) + #matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8')) + #matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8')) ID_RCODE = wx.NewId() #matrix_menu.Append(ID_RCODE, u"Code R...") #menu_splittab = wx.Menu() @@ -277,17 +333,40 @@ class IraFrame(wx.Frame): self.matrix_menu = matrix_menu text_menu = wx.Menu() + analyses_text = [[ID_TEXTSTAT, _(u"Statistics").decode('utf8'), 'stat'], + [ID_ASLEX, _(u"Specificities and CA").decode('utf8'), 'spec'], + {'name' : _(u"Clustering").decode('utf8'), + 'content' : [[ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'), 'alceste']]}, + [ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'), 'simitxt'], + [ID_WC, _(u"WordCloud").decode('utf8'), 'wordcloud'], + {'name' : _(u"Sub corpus").decode('utf8'), + 'content' : [[ID_Subtxtfrommeta, _(u'Sub corpus from metadata').decode('utf8'), None], + [ID_Subtxtfromthem, _(u'Sub corpus from thematic').decode('utf8'), None]]}, + ] + + for analyse in analyses_text : + if not isinstance(analyse, dict) : + item = wx.MenuItem(text_menu, analyse[0], analyse[1]) + item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16))) + text_menu.AppendItem(item) + else : + nmenu = wx.Menu() + for subana in analyse['content'] : + item = wx.MenuItem(nmenu, subana[0], subana[1]) + item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16))) + nmenu.AppendItem(item) + text_menu.AppendMenu(-1, analyse['name'], nmenu) #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus") - text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8')) - text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8')) - #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire") - menu_classiftxt = wx.Menu() - menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8')) - #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances") - text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt) - text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) - ID_WC = wx.NewId() - text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8')) +# text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8')) +# text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8')) +# #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire") +# menu_classiftxt = wx.Menu() +# menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8')) +# #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances") +# text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt) +# text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) +# +# text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8')) self.text_menu = text_menu help_menu = wx.Menu() @@ -317,12 +396,31 @@ class IraFrame(wx.Frame): tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER) tb1.SetToolBitmapSize(wx.Size(16, 16)) - tb1.AddLabelTool(ID_OpenData, "OpenData", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16)), shortHelp="Questionnaire", longHelp="Ouvrir un questionnaire") + tb1.AddLabelTool(ID_OpenData, "OpenData", self.images_analyses['matroot'], shortHelp=_(u"Matrix").decode('utf8'), longHelp=_(u"Open a matrix").decode('utf8')) tb1.AddSeparator() - tb1.AddLabelTool(ID_OpenText, "OpenText", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16)), shortHelp="Texte", longHelp="Ouvrir un corpus texte") - + tb1.AddLabelTool(ID_OpenText, "OpenText", self.images_analyses['textroot'], shortHelp=_(u"Text").decode('utf8'), longHelp=_(u"Open a text corpus").decode('utf8')) + tb1.Realize() + tb_text = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, + wx.TB_FLAT | wx.TB_NODIVIDER) + for analyse in analyses_text : + if not isinstance(analyse, dict) : + tb_text.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1]) + else : + for subana in analyse['content'] : + tb_text.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1]) + tb_text.Realize() + + tb_mat = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, + wx.TB_FLAT | wx.TB_NODIVIDER) + for analyse in matanalyses : + if not isinstance(analyse, dict) : + tb_mat.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1]) + else : + for subana in analyse['content'] : + tb_mat.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1]) + tb_mat.Realize() #------------------------------------------------------------------------------------------------ self.text_ctrl_txt = wx.TextCtrl(self, -1, "", wx.Point(0, 0), wx.Size(200, 200), wx.NO_BORDER | wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY) @@ -372,7 +470,20 @@ class IraFrame(wx.Frame): self._mgr.AddPane(tb1, aui.AuiPaneInfo(). Name("tb1").Caption("Fichiers"). ToolbarPane().Top(). - LeftDockable(True).RightDockable(False)) + LeftDockable(True).RightDockable(False)) + + self._mgr.AddPane(tb_text, aui.AuiPaneInfo(). + Name("tb_text").Caption("analyse_text"). + ToolbarPane().Top(). + LeftDockable(True).RightDockable(False)) + + self._mgr.AddPane(tb_mat, aui.AuiPaneInfo(). + Name("tb_mat").Caption("analyse_matrix"). + ToolbarPane().Top(). + LeftDockable(True).RightDockable(False)) + + self._mgr.GetPane('tb_text').Hide() + self._mgr.GetPane('tb_mat').Hide() self.ShowAPane("Intro_Text") self._mgr.GetPane("lefttree").Show() @@ -402,6 +513,7 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert) self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM) self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto) + self.Bind(wx.EVT_MENU, self.OnSplitVar, id = ID_Splitfromvar) #self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE) #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR) #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS) @@ -412,6 +524,8 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM) self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt) self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC) + self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfrommeta) + self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfromthem) self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI) self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT) #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab) @@ -549,8 +663,16 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" def ShowMenu(self, menu, Show=True): if menu == 'text' : menu_pos = 4 + if Show : + self._mgr.GetPane('tb_text').Show() + else : + self._mgr.GetPane('tb_text').Hide() elif menu == 'matrix' : menu_pos = 3 + if Show : + self._mgr.GetPane('tb_mat').Show() + else : + self._mgr.GetPane('tb_mat').Hide() elif menu == 'view' : menu_pos = 2 else : @@ -560,7 +682,7 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" if not menu_pos is None : self.mb.EnableTop(menu_pos, Show) self.mb.UpdateMenus() - + self._mgr.Update() #-------------------------------------------------------------------- def OnClose(self, event): @@ -618,9 +740,13 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" self.ShowAPane(u"Text") self._mgr.Update() - def OnSubText(self, corpus, parametres = None): + def OnSubText(self, evt, corpus = None, parametres = None): if corpus is None : corpus = self.tree.getcorpus() + if evt.GetId() == ID_Subtxtfrommeta : + parametres = {'frommeta' : True} + elif evt.GetId() == ID_Subtxtfromthem : + parametres = {'fromtheme' : True} builder = SubBuilder(self, corpus, parametres) if builder.res == wx.ID_OK : busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self) @@ -845,8 +971,10 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" #Prototypical(self, {'type' : 'proto'}) def OnSplitVar(self, evt, matrix = None): + if matrix is None : + matrix = self.tree.getmatrix() self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3) - matrix = self.tree.getmatrix() + #matrix = self.tree.getmatrix() def OnSimiTxt(self, evt, corpus = None) : diff --git a/tree.py b/tree.py index 12627f4..5b4b616 100644 --- a/tree.py +++ b/tree.py @@ -22,6 +22,27 @@ from textreinert import TgenProf log = logging.getLogger('iramuteq.tree') +def buildmenu(menu, parent_menu): + for i in range(parent_menu.GetMenuItemCount()) : + item = parent_menu.FindItemByPosition(i) + itemid = item.GetId() + itemtext = item.GetText() + itemicon = item.GetBitmap() + nitem = wx.MenuItem(menu, itemid, itemtext) + nitem.SetBitmap(itemicon) + if item.IsSubMenu() : + nmenu = wx.Menu() + for val in item.GetSubMenu().GetMenuItems() : + itemid = val.GetId() + itemtext = val.GetText() + itemicon = val.GetBitmap() + nitem = wx.MenuItem(menu, itemid, itemtext) + nitem.SetBitmap(itemicon) + nmenu.AppendItem(nitem) + menu.AppendMenu(-1, item.GetText(), nmenu) + else : + menu.AppendItem(nitem) + class InfoDialog ( wx.Dialog ): def __init__( self, parent, txt, parametres ): @@ -110,26 +131,11 @@ class LeftTree(CT.CustomTreeCtrl): self.styles = treestyles self.item = None + self.il = wx.ImageList(16, 16) self.ild = {} - imgtextroot = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'textroot.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['alceste'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'reinert.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['corpus'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'textcorpus.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['wordcloud'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'wordcloud.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['stat'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'stats.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['simitxt'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'simitxt.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['clustersimitxt'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'clustersimitxt.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['clustercloud'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'clustercloud.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['spec'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'spec.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - imgmatroot = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'matroot.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['matrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'matrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['freq'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'frequences.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['freqmulti'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'frequences.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['chi2'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'chi2.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['reinertmatrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'reinertmatrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['simimatrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'simimatrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['simiclustermatrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'simimatrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) - self.ild['proto'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'proto.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()) + for img in self.ira.images_analyses : + self.ild[img] = self.il.Add(self.ira.images_analyses[img]) self.SetImageList(self.il) self.count = 0 @@ -146,8 +152,8 @@ class LeftTree(CT.CustomTreeCtrl): self.textroot = self.AppendItem(self.root, _(u'Textual corpus')) self.SetPyData(self.textroot, {'uuid': 'textroot'}) - self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Normal) - self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Expanded) + self.SetItemImage(self.textroot, self.ild['textroot'], CT.TreeItemIcon_Normal) + self.SetItemImage(self.textroot, self.ild['textroot'], CT.TreeItemIcon_Expanded) for corpus in reversed(self.h) : child = self.AppendItem(self.textroot, corpus['corpus_name']) @@ -168,8 +174,8 @@ class LeftTree(CT.CustomTreeCtrl): self.matroot = self.AppendItem(self.root, _(u'Matrix')) self.SetPyData(self.matroot, {'uuid': 'matroot'}) - self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Normal) - self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Expanded) + self.SetItemImage(self.matroot, self.ild['matroot'], CT.TreeItemIcon_Normal) + self.SetItemImage(self.matroot, self.ild['matroot'], CT.TreeItemIcon_Expanded) orphmat = [] for matrix in reversed(self.history.matrix) : @@ -391,54 +397,11 @@ class LeftTree(CT.CustomTreeCtrl): menu.AppendSeparator() if 'corpus_name' in pydata : - stat = menu.Append(wx.ID_ANY, _(u"Statistics").decode('utf8')) - spec = menu.Append(wx.ID_ANY, _(u"Specificities and CA").decode('utf8')) - classification = wx.Menu() - reinert = classification.Append(wx.ID_ANY, _(u"Reinert's Method").decode('utf8')) - #pam = classification.Append(wx.ID_ANY, u"Par matrice des distances") - menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), classification) - simi = menu.Append(wx.ID_ANY, _(u"Similarities Analysis").decode('utf8')) - wdc = menu.Append(wx.ID_ANY, _(u"WordCloud").decode('utf8')) - subcorpus = wx.Menu() - subcorpusfrommeta = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from metadata').decode('utf8')) - subcorpusfromtheme = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from thematic').decode('utf8')) - menu.AppendMenu(-1, _(u"Sub corpus").decode('utf8'), subcorpus) + buildmenu(menu, self.parent.text_menu) menu.AppendSeparator() - self.Bind(wx.EVT_MENU, self.OnReinert, reinert) - #self.Bind(wx.EVT_MENU, self.OnPam, pam) - self.Bind(wx.EVT_MENU, self.OnStat, stat) - self.Bind(wx.EVT_MENU, self.OnSpec, spec) - self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi) - self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc) - self.Bind(wx.EVT_MENU, self.OnSubTextFromMeta, subcorpusfrommeta) - self.Bind(wx.EVT_MENU, self.OnSubTextFromTheme, subcorpusfromtheme) elif 'matrix_name' in pydata : - for i in range(self.parent.matrix_menu.GetMenuItemCount()) : - item = self.parent.matrix_menu.FindItemByPosition(i) - itemid = item.GetId() - itemtext = item.GetText() - if item.IsSubMenu() : - nmenu = wx.Menu() - for val in item.GetSubMenu().GetMenuItems() : - nmenu.Append(val.GetId(), val.GetText()) - menu.AppendMenu(itemid, itemtext, nmenu) - else : - menu.Append(itemid, itemtext) - split = wx.Menu() - splitfromvar = split.Append(-1, _(u"Split from variable").decode('utf8')) - menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), split) - self.Bind(wx.EVT_MENU, self.OnSplitFromVar, splitfromvar) - #print item, itemid, itemtext - #menu = self.parent.matrix_menu - #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8')) - #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8')) - #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8')) - #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8')) + buildmenu(menu, self.parent.matrix_menu) menu.AppendSeparator() - #self.Bind(wx.EVT_MENU, self.OnFreq, freq) - #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2) - #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi) - #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert) elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened : openmenu = wx.Menu() antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8')) @@ -556,29 +519,29 @@ class LeftTree(CT.CustomTreeCtrl): def OnWordCloud(self, evt) : self.parent.OnWordCloud(evt, self.getcorpus()) - def OnFreq(self, evt): - self.parent.OnFreq(evt, self.getmatrix()) +# def OnFreq(self, evt): +# self.parent.OnFreq(evt, self.getmatrix()) - def OnChiSquare(self, evt): - self.parent.OnChi2(evt, self.getmatrix()) +# def OnChiSquare(self, evt): +# self.parent.OnChi2(evt, self.getmatrix()) - def OnSimiTab(self, evt): - self.parent.OnSimiTab(evt, self.getmatrix()) +# def OnSimiTab(self, evt): +# self.parent.OnSimiTab(evt, self.getmatrix()) - def OnProto(self, evt): - self.parent.OnProto(evt, self.getmatrix()) +# def OnProto(self, evt): +# self.parent.OnProto(evt, self.getmatrix()) - def OnSplitFromVar(self, evt): - self.parent.OnSplitVar(evt, self.getmatrix()) +# def OnSplitFromVar(self, evt): +# self.parent.OnSplitVar(evt, self.getmatrix()) - def OnCHDReinert(self, evt): - self.parent.OnCHDReinert(evt, self.getmatrix()) +# def OnCHDReinert(self, evt): +# self.parent.OnCHDReinert(evt, self.getmatrix()) - def OnSubTextFromMeta(self, evt): - self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True}) + #def OnSubTextFromMeta(self, evt): + # self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True}) - def OnSubTextFromTheme(self, evt): - self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True}) + #def OnSubTextFromTheme(self, evt): + # self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True}) def OnProfSR(self, evt) : ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus) @@ -746,7 +709,7 @@ class LeftTree(CT.CustomTreeCtrl): dial.Destroy() def OnSubCorpusFromClusters(self, evt): - self.parent.OnSubText(self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc}) + self.parent.OnSubText(evt, corpus = self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc}) def OnRename(self, event): pydata = self.itemdict['pydata'] -- 2.7.4 From 35feaa5dc8cbd055e732567e012780d88b92ffe5 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Wed, 10 Dec 2014 23:54:21 +0100 Subject: [PATCH 08/16] ... --- analysetxt.py | 37 ------------------------------------- functions.py | 5 ++--- iramuteq.py | 2 +- 3 files changed, 3 insertions(+), 41 deletions(-) diff --git a/analysetxt.py b/analysetxt.py index cf2b231..201e177 100644 --- a/analysetxt.py +++ b/analysetxt.py @@ -140,40 +140,3 @@ class AnalyseText : else : sleep(0.2) return check_Rresult(self.ira, pid) - - - - - - -# keys = {'art_def' : 2, -# 'pre' : 2, -# 'adj_dem' : 2, -# 'ono' : 2, -# 'pro_per' : 2, -# 'ver_sup' : 2, -# 'adv' : 1, -# 'ver' : 1, -# 'adj_ind' : 2, -# 'adj_pos' : 2, -# 'aux' : 2, -# 'adj_int' : 2, -# 'pro_ind' : 2, -# 'adj' : 1, -# 'pro_dem' : 2, -# 'nom' : 1, -# 'art_ind' : 2, -# 'pro_pos' : 2, -# 'nom_sup' : 2, -# 'adv_sup' : 2, -# 'adj_sup' : 2, -# 'adj_num' : 2, -# 'pro_rel' : 2, -# 'con' : 2, -# 'num' : 2, -# 'nr' : 1, -# 'sw' : 2, -# } -# -# gramact = [k for k in keys if keys[k] == 1] -# gramsup = [k for k in keys if keys[k] == 2] diff --git a/functions.py b/functions.py index f38a5c5..8cd7352 100644 --- a/functions.py +++ b/functions.py @@ -306,7 +306,7 @@ def write_tab(tab, fileout) : class BugDialog(wx.Dialog): def __init__(self, *args, **kwds): # begin wxGlade: MyDialog.__init__ - kwds["style"] = wx.DEFAULT_DIALOG_STYLE + kwds["style"] = wx.DEFAULT_DIALOG_STYLE | wx.STAY_ON_TOP kwds["size"] = wx.Size(500, 200) wx.Dialog.__init__(self, *args, **kwds) self.SetTitle(kwds['title']) @@ -707,11 +707,10 @@ def progressbar(self, maxi) : parent=parent, style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT ) - prog.SetIcon(ira._icon) prog.SetSize((400,150)) + prog.SetIcon(ira._icon) return prog - def treat_var_mod(variables) : var_mod = {} variables = list(set(variables)) diff --git a/iramuteq.py b/iramuteq.py index c762bf8..fdf2ba0 100644 --- a/iramuteq.py +++ b/iramuteq.py @@ -647,7 +647,7 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" def OnVerif(self, evt) : pack = CheckRPackages(self) if pack : - dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION) + dlg = wx.MessageDialog(self, _(u"Installation OK").decode('utf8'), _(u"Installation").decode('utf8'), wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP) dlg.CenterOnParent() if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]: evt.Veto() -- 2.7.4 From 6cd28b11a66c3ebb5c264caeb19544b9fd2d2e20 Mon Sep 17 00:00:00 2001 From: pierre Date: Thu, 11 Dec 2014 00:21:26 +0100 Subject: [PATCH 09/16] vertex color in mac os X --- guifunct.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guifunct.py b/guifunct.py index 822f213..44d239c 100644 --- a/guifunct.py +++ b/guifunct.py @@ -622,7 +622,7 @@ class PrefSimi ( wx.Dialog ): self.m_staticText21.Wrap( -1 ) bSizer5.Add( self.m_staticText21, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 ) - self.cols = wx.ColourPickerCtrl( self.m_panel3, wx.ID_ANY, wx.Colour( 255, 0, 0 ), wx.DefaultPosition, wx.Size( 10,10 ), wx.CLRP_DEFAULT_STYLE ) + self.cols = wx.ColourPickerCtrl( self.m_panel3, wx.ID_ANY, wx.Colour( 255, 0, 0 ), wx.DefaultPosition, wx.DefaultSize, wx.CLRP_DEFAULT_STYLE ) bSizer5.Add( self.cols, 0, wx.ALL, 5 ) -- 2.7.4 From 2c7a0c1dc0b32bab646655b4fb01e1d5ea49164c Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 14:03:37 +0100 Subject: [PATCH 10/16] translation --- iramuteq.py | 15 ++- locale/es_ES/LC_MESSAGES/iramuteq.mo | Bin 378 -> 378 bytes locale/fr_FR/LC_MESSAGES/iramuteq.mo | Bin 21324 -> 22192 bytes locale/it_IT/LC_MESSAGES/iramuteq.mo | Bin 378 -> 378 bytes locale/pt_PT/LC_MESSAGES/iramuteq.mo | Bin 18166 -> 18119 bytes messages.pot | 252 ++++++++++++++++++++--------------- 6 files changed, 153 insertions(+), 114 deletions(-) diff --git a/iramuteq.py b/iramuteq.py index fdf2ba0..b64f51b 100644 --- a/iramuteq.py +++ b/iramuteq.py @@ -624,12 +624,15 @@ class IraFrame(wx.Frame): if not RLibsAreInstalled(self) : CheckRPackages(self) else : - msg = u""" -Le chemin de l'executable de R n'a pas été trouvé. -Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/). -Si R n'est pas installé dans le répertoire par défaut -(souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X) -vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" + msg = '\n'.join([_(u"Can't find R executable"), _(u"If R is not installed, get it from http://www.r-project.org."), + _(u"If R is installed, report its path in Preferences."), + _(u"IRaMuTeQ does not work without R.")]) +# msg = u""" +#Le chemin de l'executable de R n'a pas été trouvé. +#Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/). +#Si R n'est pas installé dans le répertoire par défaut +#(souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X) +#vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING) dlg.CenterOnParent() if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]: diff --git a/locale/es_ES/LC_MESSAGES/iramuteq.mo b/locale/es_ES/LC_MESSAGES/iramuteq.mo index 219b0ef35590c6d16c92ef112b0dc1a2bc32260c..80e741a47f38f6f046c031117c53e0b088dfe22e 100644 GIT binary patch delta 18 Zcmeyx^owaiKZl{Af}ydMsoBKoj{!g&2DShI delta 18 Zcmeyx^owaiKZk*(f`NgRk;TO6j{!hE2DktK diff --git a/locale/fr_FR/LC_MESSAGES/iramuteq.mo b/locale/fr_FR/LC_MESSAGES/iramuteq.mo index 72cf44063473a2872aab4a7f59fb3913b1cfcfc0..f24975f6d33642bc317ad2859ecc35fdeccbe594 100644 GIT binary patch delta 8449 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 delta 7681 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 diff --git a/locale/it_IT/LC_MESSAGES/iramuteq.mo b/locale/it_IT/LC_MESSAGES/iramuteq.mo index 219b0ef35590c6d16c92ef112b0dc1a2bc32260c..80e741a47f38f6f046c031117c53e0b088dfe22e 100644 GIT binary patch delta 18 Zcmeyx^owaiKZl{Af}ydMsoBKoj{!g&2DShI delta 18 Zcmeyx^owaiKZk*(f`NgRk;TO6j{!hE2DktK diff --git a/locale/pt_PT/LC_MESSAGES/iramuteq.mo b/locale/pt_PT/LC_MESSAGES/iramuteq.mo index 56d2b12cc5ca5b13b38c2a8b7f52d3cbbdb2a653..994b9b91298833656e422e062cf228df1766f599 100644 GIT binary patch delta 5697 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 delta 5742 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 diff --git a/messages.pot b/messages.pot index b5ba85f..032059a 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-12-09 00:28+0100\n" +"POT-Creation-Date: 2014-12-11 14:00+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,7 +21,7 @@ msgstr "" msgid "3D graph" msgstr "" -#: iramuteq.py:294 +#: iramuteq.py:373 msgid "About..." msgstr "" @@ -49,7 +49,7 @@ msgstr "" msgid "All segments" msgstr "" -#: layout.py:339 tree.py:444 tree.py:657 +#: layout.py:339 tree.py:407 tree.py:620 msgid "Antiprofiles" msgstr "" @@ -61,7 +61,7 @@ msgstr "" msgid "Are you sure ?" msgstr "" -#: Liste.py:163 Liste.py:180 listlex.py:198 listlex.py:233 ProfList.py:308 +#: Liste.py:163 Liste.py:180 listlex.py:197 listlex.py:232 ProfList.py:308 #: ProfList.py:743 msgid "Associated forms" msgstr "" @@ -102,6 +102,10 @@ msgstr "" msgid "CA forms" msgstr "" +#: iramuteq.py:627 +msgid "Can't find R executable" +msgstr "" + #: dialog.py:2376 msgid "Change ..." msgstr "" @@ -110,7 +114,7 @@ msgstr "" msgid "Characteristic text segments" msgstr "" -#: dialog.py:82 dialog.py:2313 dialog.py:2706 layout.py:1030 +#: dialog.py:82 dialog.py:2313 dialog.py:2705 layout.py:1030 msgid "Characters set" msgstr "" @@ -130,7 +134,7 @@ msgid "" "of R packages" msgstr "" -#: dialog.py:1481 iramuteq.py:261 +#: dialog.py:1481 iramuteq.py:290 msgid "Chi2" msgstr "" @@ -170,12 +174,12 @@ msgstr "" msgid "Cluster" msgstr "" -#: dialog.py:1308 iramuteq.py:266 iramuteq.py:287 layout.py:526 -#: OptionAlceste.py:29 tree.py:399 +#: dialog.py:1308 iramuteq.py:291 iramuteq.py:338 layout.py:526 +#: OptionAlceste.py:29 msgid "Clustering" msgstr "" -#: tree.py:454 tree.py:639 tree.py:648 +#: tree.py:417 tree.py:602 tree.py:611 msgid "Clusters statistics" msgstr "" @@ -183,7 +187,7 @@ msgstr "" msgid "Color or black and white" msgstr "" -#: tree.py:452 tree.py:612 +#: tree.py:415 tree.py:575 msgid "Colored corpus" msgstr "" @@ -195,11 +199,11 @@ msgstr "" msgid "Communities" msgstr "" -#: tree.py:450 tree.py:479 +#: tree.py:413 tree.py:442 msgid "Compute Tgen" msgstr "" -#: Liste.py:164 Liste.py:191 listlex.py:199 listlex.py:294 ProfList.py:321 +#: Liste.py:164 Liste.py:191 listlex.py:198 listlex.py:293 ProfList.py:321 #: ProfList.py:677 ProfList.py:683 ProfList.py:689 msgid "Concordance" msgstr "" @@ -228,7 +232,7 @@ msgstr "" msgid "Delete characters not in this list" msgstr "" -#: tree.py:492 +#: tree.py:455 msgid "Delete from history" msgstr "" @@ -248,7 +252,7 @@ msgstr "" msgid "Dictionary" msgstr "" -#: tree.py:626 +#: tree.py:589 msgid "Done" msgstr "" @@ -268,7 +272,7 @@ msgstr "" msgid "Edges width proportional to score" msgstr "" -#: iramuteq.py:298 +#: iramuteq.py:377 msgid "Edition" msgstr "" @@ -276,23 +280,23 @@ msgstr "" msgid "Etymology" msgstr "" -#: iramuteq.py:248 +#: iramuteq.py:277 msgid "Exit" msgstr "" -#: tree.py:456 +#: tree.py:419 msgid "Export clusters" msgstr "" -#: tree.py:451 +#: tree.py:414 msgid "Export corpus" msgstr "" -#: tree.py:472 +#: tree.py:435 msgid "Export dictionary" msgstr "" -#: dialog.py:2998 +#: dialog.py:2997 msgid "Export finished. Open in a web browser :" msgstr "" @@ -304,7 +308,7 @@ msgstr "" msgid "Export for Tropes" msgstr "" -#: tree.py:473 +#: tree.py:436 msgid "Export lemma dictionary" msgstr "" @@ -316,15 +320,15 @@ msgstr "" msgid "Exporter for Owledge" msgstr "" -#: iramuteq.py:233 +#: iramuteq.py:262 msgid "Extract mods" msgstr "" -#: iramuteq.py:234 +#: iramuteq.py:263 msgid "Extract thematics" msgstr "" -#: dialog.py:2737 +#: dialog.py:2736 msgid "Extraction type" msgstr "" @@ -344,7 +348,7 @@ msgstr "" msgid "Factor z : " msgstr "" -#: iramuteq.py:297 +#: iramuteq.py:376 msgid "File" msgstr "" @@ -384,7 +388,7 @@ msgstr "" msgid "Freq." msgstr "" -#: iramuteq.py:259 +#: iramuteq.py:288 msgid "Frequencies" msgstr "" @@ -408,7 +412,7 @@ msgstr "" msgid "Graph settings" msgstr "" -#: dialog.py:3266 listlex.py:200 listlex.py:345 +#: dialog.py:3274 listlex.py:199 listlex.py:344 msgid "Graphic" msgstr "" @@ -428,27 +432,39 @@ msgstr "" msgid "Hapax" msgstr "" -#: iramuteq.py:302 +#: iramuteq.py:381 msgid "Help" msgstr "" -#: iramuteq.py:343 +#: iramuteq.py:441 msgid "Historic" msgstr "" -#: iramuteq.py:254 +#: iramuteq.py:283 msgid "Home page" msgstr "" -#: dialog.py:1869 dialog.py:3128 +#: iramuteq.py:629 +msgid "IRaMuTeQ does not work without R." +msgstr "" + +#: iramuteq.py:628 +msgid "If R is installed, report its path in Preferences." +msgstr "" + +#: iramuteq.py:627 +msgid "If R is not installed, get it from http://www.r-project.org." +msgstr "" + +#: dialog.py:1869 dialog.py:3136 msgid "Image format" msgstr "" -#: iramuteq.py:227 +#: iramuteq.py:256 msgid "Import from TXM" msgstr "" -#: iramuteq.py:225 +#: iramuteq.py:254 msgid "Import from factiva" msgstr "" @@ -464,14 +480,22 @@ msgstr "" msgid "In segments of this clustering" msgstr "" -#: dialog.py:2831 +#: dialog.py:2830 msgid "Include empty cells (NA)" msgstr "" -#: tree.py:389 +#: tree.py:395 msgid "Informations" msgstr "" +#: iramuteq.py:653 +msgid "Installation" +msgstr "" + +#: iramuteq.py:653 +msgid "Installation OK" +msgstr "" + #: dialog.py:369 msgid "Interface language" msgstr "" @@ -500,7 +524,7 @@ msgstr "" msgid "Lemmatization" msgstr "" -#: iramuteq.py:1087 +#: iramuteq.py:1218 msgid "License GNU GPL" msgstr "" @@ -512,7 +536,7 @@ msgstr "" msgid "Like Lexico" msgstr "" -#: dialog.py:2901 +#: dialog.py:2900 msgid "Limit frequency" msgstr "" @@ -520,7 +544,7 @@ msgstr "" msgid "Limit points by cluster chi2" msgstr "" -#: dialog.py:2921 +#: dialog.py:2920 msgid "Limit rank" msgstr "" @@ -528,7 +552,7 @@ msgstr "" msgid "List of not plotted points : " msgstr "" -#: listlex.py:210 ProfList.py:322 +#: listlex.py:209 ProfList.py:322 msgid "Make Tgen" msgstr "" @@ -540,11 +564,11 @@ msgstr "" msgid "Make text segments" msgstr "" -#: tree.py:169 +#: iramuteq.py:399 tree.py:175 msgid "Matrix" msgstr "" -#: iramuteq.py:300 +#: iramuteq.py:379 msgid "Matrix analysis" msgstr "" @@ -582,7 +606,7 @@ msgstr "" msgid "Mean of occurrences by text" msgstr "" -#: dialog.py:1739 dialog.py:2941 +#: dialog.py:1739 dialog.py:2940 msgid "Minimum frequency" msgstr "" @@ -606,7 +630,7 @@ msgstr "" msgid "Minimum text segments frenquency in clusters (2= automatic)" msgstr "" -#: dialog.py:2728 +#: dialog.py:2727 msgid "Modalities (one by line, with the *)" msgstr "" @@ -614,11 +638,15 @@ msgstr "" msgid "Morphology" msgstr "" -#: iramuteq.py:260 -msgid "Multiple frequencies" +#: iramuteq.py:289 +msgid "Multiple Frequencies" +msgstr "" + +#: dialog.py:3041 +msgid "Name" msgstr "" -#: tree.py:453 +#: tree.py:416 msgid "Navigator" msgstr "" @@ -626,7 +654,7 @@ msgstr "" msgid "Next" msgstr "" -#: tree.py:720 +#: tree.py:683 msgid "No TGen yet !" msgstr "" @@ -686,35 +714,35 @@ msgstr "" msgid "Number of texts" msgstr "" -#: dialog.py:2741 +#: dialog.py:2740 msgid "One file by modality" msgstr "" -#: iramuteq.py:295 +#: iramuteq.py:374 msgid "Online help..." msgstr "" -#: dialog.py:2741 +#: dialog.py:2740 msgid "Only one file" msgstr "" -#: tree.py:445 tree.py:487 +#: tree.py:408 tree.py:450 msgid "Open ..." msgstr "" -#: iramuteq.py:205 +#: iramuteq.py:233 iramuteq.py:399 msgid "Open a matrix" msgstr "" -#: iramuteq.py:209 +#: iramuteq.py:238 iramuteq.py:401 msgid "Open a text corpus" msgstr "" -#: iramuteq.py:213 +#: iramuteq.py:242 msgid "Open an analysis" msgstr "" -#: tree.py:626 +#: tree.py:589 msgid "Open in a web browser ?" msgstr "" @@ -738,7 +766,7 @@ msgstr "" msgid "POS frequencies" msgstr "" -#: tree.py:448 +#: tree.py:411 msgid "POS profiles" msgstr "" @@ -766,12 +794,12 @@ msgstr "" msgid "Play a sound at the end of analysis" msgstr "" -#: corpus.py:1624 iramuteq.py:581 iramuteq.py:626 layout.py:946 tree.py:739 -#: tree.py:1063 +#: corpus.py:1624 iramuteq.py:706 iramuteq.py:755 layout.py:946 tree.py:702 +#: tree.py:1026 msgid "Please wait..." msgstr "" -#: tree.py:514 +#: tree.py:477 msgid "Please wait...Reading corpus" msgstr "" @@ -779,7 +807,7 @@ msgstr "" msgid "Potato mode (less precise, faster)" msgstr "" -#: dialog.py:3085 iramuteq.py:251 +#: dialog.py:3093 iramuteq.py:280 msgid "Preferences" msgstr "" @@ -795,7 +823,7 @@ msgstr "" msgid "Profiles" msgstr "" -#: iramuteq.py:269 +#: iramuteq.py:294 msgid "Prototypical Analysis" msgstr "" @@ -819,7 +847,7 @@ msgstr "" msgid "Ranking score" msgstr "" -#: dialog.py:2878 +#: dialog.py:2877 msgid "Ranks" msgstr "" @@ -827,15 +855,15 @@ msgstr "" msgid "Reading profiles" msgstr "" -#: iramuteq.py:308 +#: iramuteq.py:387 msgid "Ready" msgstr "" -#: iramuteq.py:264 iramuteq.py:285 tree.py:397 +#: iramuteq.py:292 iramuteq.py:339 msgid "Reinert's Method" msgstr "" -#: tree.py:390 +#: tree.py:396 msgid "Rename" msgstr "" @@ -843,7 +871,7 @@ msgstr "" msgid "Repeated segments" msgstr "" -#: dialog.py:1243 layout.py:519 tree.py:447 +#: dialog.py:1243 layout.py:519 tree.py:410 msgid "Repeated segments profiles" msgstr "" @@ -855,7 +883,7 @@ msgstr "" msgid "Replace dash by space" msgstr "" -#: tree.py:455 tree.py:486 tree.py:666 tree.py:676 +#: tree.py:418 tree.py:449 tree.py:629 tree.py:639 msgid "Report" msgstr "" @@ -871,7 +899,7 @@ msgstr "" msgid "Save as ..." msgstr "" -#: dialog.py:3222 +#: dialog.py:3230 msgid "Save as..." msgstr "" @@ -883,7 +911,7 @@ msgstr "" msgid "Score on edges" msgstr "" -#: tree.py:635 +#: tree.py:598 msgid "Search ..." msgstr "" @@ -903,7 +931,7 @@ msgstr "" msgid "Select a directory of xml files" msgstr "" -#: dialog.py:2352 dialog.py:2701 +#: dialog.py:2352 dialog.py:2700 msgid "Select a file" msgstr "" @@ -919,24 +947,28 @@ msgstr "" msgid "Select columns" msgstr "" +#: dialog.py:3048 +msgid "Select one or more metadata" +msgstr "" + #: dialog.py:330 dialog.py:469 dialog.py:970 dialog.py:1041 dialog.py:2149 -#: dialog.py:2279 dialog.py:2864 guifunct.py:161 OptionAlceste.py:63 +#: dialog.py:2279 dialog.py:2863 guifunct.py:161 OptionAlceste.py:63 msgid "Settings" msgstr "" -#: iramuteq.py:255 +#: iramuteq.py:284 msgid "Show data" msgstr "" -#: iramuteq.py:256 +#: iramuteq.py:285 msgid "Show results" msgstr "" -#: iramuteq.py:268 iramuteq.py:288 tree.py:400 +#: iramuteq.py:293 iramuteq.py:340 msgid "Similarities Analysis" msgstr "" -#: dialog.py:3093 +#: dialog.py:3101 msgid "Size" msgstr "" @@ -956,7 +988,7 @@ msgstr "" msgid "Specificities" msgstr "" -#: iramuteq.py:282 tree.py:395 +#: iramuteq.py:337 msgid "Specificities and CA" msgstr "" @@ -964,38 +996,38 @@ msgstr "" msgid "Spheres transparency" msgstr "" -#: iramuteq.py:232 tree.py:428 +#: iramuteq.py:261 iramuteq.py:295 msgid "Split from variable" msgstr "" -#: tree.py:429 -msgid "Split matrix" -msgstr "" - #: layout.py:551 msgid "Stat by cluster" msgstr "" -#: iramuteq.py:281 tree.py:394 +#: iramuteq.py:336 msgid "Statistics" msgstr "" -#: tree.py:405 +#: iramuteq.py:342 msgid "Sub corpus" msgstr "" -#: tree.py:457 +#: tree.py:420 msgid "Sub corpus from clusters" msgstr "" -#: tree.py:403 +#: iramuteq.py:343 msgid "Sub corpus from metadata" msgstr "" -#: tree.py:404 +#: iramuteq.py:344 msgid "Sub corpus from thematic" msgstr "" +#: dialog.py:3031 +msgid "Subcorpus" +msgstr "" + #: dialog.py:1340 msgid "Supplementaries variables (almost 1)" msgstr "" @@ -1020,7 +1052,11 @@ msgstr "" msgid "Take the x first points by cluster" msgstr "" -#: iramuteq.py:301 +#: iramuteq.py:401 +msgid "Text" +msgstr "" + +#: iramuteq.py:380 msgid "Text analysis" msgstr "" @@ -1060,11 +1096,11 @@ msgstr "" msgid "Text size proportional to frequency" msgstr "" -#: tree.py:147 +#: tree.py:153 msgid "Textual corpus" msgstr "" -#: tree.py:449 tree.py:478 +#: tree.py:412 tree.py:441 msgid "Tgen Editor" msgstr "" @@ -1076,7 +1112,7 @@ msgstr "" msgid "This file already exists. Continue anyway ?" msgstr "" -#: tree.py:1074 +#: tree.py:1037 #, python-format msgid "This file does not exist : %s" msgstr "" @@ -1093,7 +1129,7 @@ msgstr "" msgid "This is not a variable_modality form" msgstr "" -#: iramuteq.py:241 +#: iramuteq.py:270 msgid "Tools" msgstr "" @@ -1105,7 +1141,7 @@ msgstr "" msgid "Total" msgstr "" -#: listlex.py:209 listlex.py:274 ProfList.py:334 ProfList.py:611 +#: listlex.py:208 listlex.py:273 ProfList.py:334 ProfList.py:611 msgid "Typical text segments" msgstr "" @@ -1125,11 +1161,11 @@ msgstr "" msgid "Used forms" msgstr "" -#: dialog.py:2874 +#: dialog.py:2873 msgid "Variables" msgstr "" -#: dialog.py:2718 +#: dialog.py:2717 msgid "Variables (with the * but without the _)" msgstr "" @@ -1157,11 +1193,11 @@ msgstr "" msgid "Vertex text size proportional to frequency" msgstr "" -#: iramuteq.py:299 +#: iramuteq.py:378 msgid "View" msgstr "" -#: iramuteq.py:309 +#: iramuteq.py:388 msgid "Welcome" msgstr "" @@ -1177,7 +1213,7 @@ msgstr "" msgid "Word size proportional to ..." msgstr "" -#: iramuteq.py:290 tree.py:401 +#: iramuteq.py:341 msgid "WordCloud" msgstr "" @@ -1201,15 +1237,15 @@ msgstr "" msgid "actives forms" msgstr "" -#: tree.py:485 +#: tree.py:448 msgid "antiprofiles" msgstr "" -#: dialog.py:3097 +#: dialog.py:3105 msgid "automatic" msgstr "" -#: dialog.py:2907 dialog.py:2927 +#: dialog.py:2906 dialog.py:2926 msgid "automatic (mean)" msgstr "" @@ -1257,7 +1293,7 @@ msgstr "" msgid "coordinates" msgstr "" -#: dialog.py:2298 dialog.py:2697 +#: dialog.py:2298 dialog.py:2696 msgid "corpus" msgstr "" @@ -1281,15 +1317,15 @@ msgstr "" msgid "frequency" msgstr "" -#: iramuteq.py:221 +#: iramuteq.py:250 msgid "from copy/paste" msgstr "" -#: iramuteq.py:220 +#: iramuteq.py:249 msgid "from mail" msgstr "" -#: iramuteq.py:219 +#: iramuteq.py:248 msgid "from xml" msgstr "" @@ -1297,7 +1333,7 @@ msgstr "" msgid "graphical" msgstr "" -#: dialog.py:554 dialog.py:1826 dialog.py:1979 dialog.py:3113 guifunct.py:416 +#: dialog.py:554 dialog.py:1826 dialog.py:1979 dialog.py:3121 guifunct.py:416 msgid "height" msgstr "" @@ -1313,7 +1349,7 @@ msgstr "" msgid "line classified on" msgstr "" -#: dialog.py:2907 dialog.py:2927 dialog.py:3097 +#: dialog.py:2906 dialog.py:2926 dialog.py:3105 msgid "manual" msgstr "" @@ -1402,7 +1438,7 @@ msgstr "" msgid "texts classified on" msgstr "" -#: dialog.py:2747 +#: dialog.py:2746 msgid "thematics (one by line, with the -*)" msgstr "" @@ -1418,7 +1454,7 @@ msgstr "" msgid "variables" msgstr "" -#: dialog.py:552 dialog.py:1837 dialog.py:1991 dialog.py:3106 guifunct.py:423 +#: dialog.py:552 dialog.py:1837 dialog.py:1991 dialog.py:3114 guifunct.py:423 msgid "width" msgstr "" -- 2.7.4 From f12da65c1895ecdd1b48109d7b1334181487a25f Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 18:11:06 +0100 Subject: [PATCH 11/16] translators --- configuration/global.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/configuration/global.cfg b/configuration/global.cfg index 6fc7c20..8958e08 100644 --- a/configuration/global.cfg +++ b/configuration/global.cfg @@ -6,6 +6,7 @@ copyright = (c) 2008-2014 Pierre Ratinaud author = Pierre Ratinaud gpl-fr = gpl-2.0-fr.txt dev = Pierre Ratinaud (Université de Toulouse - Laboratoire LERASS - ratinaud@univ-tlse2.fr);Sébastien Déjean (Université de Toulouse);David Skalinder (Mash Strategy - davids@mash.uk.com); +translators = Portuguese : Brigido Vizeu Camargo;English : Pierre Ratinaud;French : Pierre Ratinaud version = 0.7 alpha 1 licence = GNU GPL (v2) version_nb = 0.7.a1 \ No newline at end of file -- 2.7.4 From 159a6ea7066894985bd88b0bfba518c317870405 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 18:11:29 +0100 Subject: [PATCH 12/16] europress parser --- iramuteq.py | 28 +++++++++++++++++----------- parse_factiva_xml.py | 3 +++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/iramuteq.py b/iramuteq.py index b64f51b..ea92ad5 100644 --- a/iramuteq.py +++ b/iramuteq.py @@ -5,7 +5,6 @@ #License: GNU GPL from optparse import OptionParser -from wx import BusyCursor parser = OptionParser() parser.add_option("-f", "--file", dest="filename", @@ -94,6 +93,7 @@ ID_Splitfromvar = wx.NewId() ID_Subtxtfrommeta = wx.NewId() ID_Subtxtfromthem = wx.NewId() ID_WC = wx.NewId() +ID_ImportEuro = wx.NewId() ########################################################## #elements de configuration ########################################################## @@ -256,6 +256,10 @@ class IraFrame(wx.Frame): item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8')) item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) file_menu.AppendItem(item) + + item = wx.MenuItem(file_menu, ID_ImportEuro, _(u"Import from Europress").decode('utf8'), _(u"Import from Europress").decode('utf8')) + item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) + file_menu.AppendItem(item) menuTools = wx.Menu() splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8')) @@ -533,6 +537,7 @@ class IraFrame(wx.Frame): self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP) self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES) self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM) + self.Bind(wx.EVT_MENU, self.OnImportEuropress, id=ID_ImportEuro) self.Bind(wx.EVT_CLOSE, self.OnClose) ################################################################## flags = self._mgr.GetAGWFlags() @@ -624,16 +629,10 @@ class IraFrame(wx.Frame): if not RLibsAreInstalled(self) : CheckRPackages(self) else : - msg = '\n'.join([_(u"Can't find R executable"), _(u"If R is not installed, get it from http://www.r-project.org."), - _(u"If R is installed, report its path in Preferences."), - _(u"IRaMuTeQ does not work without R.")]) -# msg = u""" -#Le chemin de l'executable de R n'a pas été trouvé. -#Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/). -#Si R n'est pas installé dans le répertoire par défaut -#(souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X) -#vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" - dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING) + msg = '\n'.join([_(u"Can't find R executable"), _(u"If R is not installed, get it from http://www.r-project.org.").decode('utf8'), + _(u"If R is installed, report its path in Preferences.").decode('utf8'), + _(u"IRaMuTeQ does not work without R.").decode('utf8')]) + dlg = wx.MessageDialog(self, msg, _(u"Problem").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING) dlg.CenterOnParent() if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]: pass @@ -800,6 +799,7 @@ class IraFrame(wx.Frame): info.Name = ConfigGlob.get('DEFAULT', 'name') info.Version = ConfigGlob.get('DEFAULT', 'version') info.Copyright = ConfigGlob.get('DEFAULT', 'copyright') + info.Translators = ConfigGlob.get('DEFAULT', 'translators').decode('utf8').split(';') info.Description = u""" Interface de R pour les Analyses Multidimensionnelles de Textes et de Questionnaires @@ -1066,6 +1066,12 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis.""" ImportFactiva(self, 'txm') except : BugReport(self) + + def OnImportEuropress(self, evt) : + try : + ImportFactiva(self, 'euro') + except : + BugReport(self) def ExtractTools(self, evt) : ID = evt.GetId() diff --git a/parse_factiva_xml.py b/parse_factiva_xml.py index 6eff72d..a7ed81d 100644 --- a/parse_factiva_xml.py +++ b/parse_factiva_xml.py @@ -12,6 +12,7 @@ import re import wx from parse_factiva_mail import ParseFactivaMail from parse_factiva_txt import ParseFactivaPaste +from parse_europress import ParseEuropress from import_txm import TXM2IRA def ParseDocument(filename) : @@ -170,6 +171,8 @@ class ImportFactiva(): res = ParseFactivaPaste(xmldir, corp_out, 'utf8', parent.syscoding) elif methode == 'txm' : res = TXM2IRA(xmldir, corp_out, 'utf8', parent.syscoding) + elif methode == 'euro' : + res = ParseEuropress(xmldir, corp_out, 'utf8', 'utf8') if res == 'nofile' : dlg = wx.MessageDialog(parent, u"Pas de fichier \'.xml\' dans %s" % xmldir, 'ATTENTION', wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING) dlg.CenterOnParent() -- 2.7.4 From be996b139e57dd5015a9c447b11738537a81d5d6 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 18:17:36 +0100 Subject: [PATCH 13/16] ... --- parse_europress.py | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 parse_europress.py diff --git a/parse_europress.py b/parse_europress.py new file mode 100644 index 0000000..62ed52c --- /dev/null +++ b/parse_europress.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +#Author: Pierre Ratinaud +#Copyright (c) 2014 Pierre Ratinaud +#License: GNU/GPL + + +#from BeautifulSoup import BeautifulSoup +import codecs +import os +from HTMLParser import HTMLParser + + +infile = '/home/pierre/workspace/iramuteq/dev/europress/DocActionPrintSave.aspx.html' + +with codecs.open(infile, 'r', 'utf8') as f : + html = f.read() + +mois = {u'janvier' : '01', + u'février' : '02', + u'mars' : '03', + u'avril' : '04', + u'mai' : '05', + u'juin' : '06', + u'juillet' : '07', + u'août' : '08', + u'septembre' : '09', + u'octobre' : '10', + u'novembre' : '11', + u'décembre' : '12', + u'january' : '01', + u'february': '02', + u'march' : '03', + u'april': '04', + u'may': '05', + u'june' : '06', + u'july': '07', + u'august': '08', + u'september' : '09', + u'october': '10', + u'november': '11', + u'december': '12'} + + +def finddate(data): + data = data.split() + try : + day = int(data[0]) + year = int(data[2]) + month = mois[data[1]] + except : + return None + else : + return [`year`, month, '%02d' % day] + + +# create a subclass and override the handler methods +class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + #print "Encountered a start tag:", tag + if tag == 'span' : + if attrs[0][1] == 'DocPublicationName' : + self.headercount = 0 + self.currentattr = 'DocPublicationName' + elif attrs[0][1] == 'DocHeader' : + self.headercount += 1 + self.currentattr = 'DocHeader' + elif attrs[0][1] == 'TitreArticleVisu' : + self.outfile.write('\n\n') + self.meta.append('\n') + self.outfile.write(' '.join(self.meta).encode('utf8', errors='replace')) + self.meta = [u'****'] + self.nb += 1 + self.currentattr = 'TitreArticleVisu' + elif tag == 'table' : + self.currentattr = None + def handle_endtag(self, tag): + pass + #print "Encountered an end tag :", tag + def handle_data(self, data): + if self.currentattr == 'DocPublicationName' : + PublicationName = data.replace(' ', '_').replace('(','').replace(')','').replace('.','').replace('/','').replace("'",'').lower() + PublicationName = PublicationName.split(',')[0] + self.meta.append(u'*source_' + PublicationName) + elif self.currentattr == 'DocHeader' : + date = finddate(data) + if date is not None : + self.meta += [u'*date_' + '-'.join(date), u'*am_' + '-'.join(date[0:2]), u'*annee_' + date[0]] + elif self.currentattr == 'TitreArticleVisu' : + if data.startswith(u'©') : + self.currentattr = None + return + self.outfile.write(' '.join(data.replace('\n', ' ').split()).encode('utf8', errors='replace') + ' ') + + def doinit(self, outfile): + self.currentattr = None + self.meta = [u'****'] + self.nb = 0 + self.outfile = outfile + + +class ParseEuropress : + def __init__(self, txtdir, fileout, encodage_in, encodage_out) : + files = [] + for root, subfolders, subfiles in os.walk(txtdir) : + nf = [os.path.join(root, f) for f in subfiles if f.split('.')[-1] == 'html'] + nf.sort() + files += nf + tot = 0 + parser = MyHTMLParser() + with open(fileout,'w') as outf : + for f in files : + print f + parser.doinit(outf) + with codecs.open(f, 'rU', encodage_in) as infile : + content = infile.read() + parser.feed(content) + tot += parser.nb + print 'ok', parser.nb, 'articles', ' - total : ', tot + +#ParseEuropress('/home/pierre/fac/lerass/mariage/press', '/home/pierre/workspace/iramuteq/dev/europress/corpus_out.txt', 'utf8', 'utf8') + #print "Encountered some data :", data +# instantiate the parser and fed it some HTML +#outfile = '/home/pierre/workspace/iramuteq/dev/europress/corpus_out.txt' +#parser = MyHTMLParser() +#with open(outfile, 'w') as f : +# parser.doinit(f) +# parser.feed(html) \ No newline at end of file -- 2.7.4 From 83e5bf88be196a94703f659fa6eda3817902f86a Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 18:18:38 +0100 Subject: [PATCH 14/16] ... --- parse_europress.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/parse_europress.py b/parse_europress.py index 62ed52c..8097d30 100644 --- a/parse_europress.py +++ b/parse_europress.py @@ -10,11 +10,6 @@ import os from HTMLParser import HTMLParser -infile = '/home/pierre/workspace/iramuteq/dev/europress/DocActionPrintSave.aspx.html' - -with codecs.open(infile, 'r', 'utf8') as f : - html = f.read() - mois = {u'janvier' : '01', u'février' : '02', u'mars' : '03', -- 2.7.4 From a349b4b802b38d6584d4696f9e0185df1c2b5271 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 18:20:58 +0100 Subject: [PATCH 15/16] ... --- parse_factiva_xml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parse_factiva_xml.py b/parse_factiva_xml.py index a7ed81d..3defa0c 100644 --- a/parse_factiva_xml.py +++ b/parse_factiva_xml.py @@ -89,7 +89,7 @@ class PrefImport(wx.Dialog): else : txt = _(u'Select a directory of txt files').decode('utf8') self.parent = parent - self.txt1 = wx.StaticText(self, -1, txt.encode('utf8')) + self.txt1 = wx.StaticText(self, -1, txt) self.dbb = filebrowse.DirBrowseButton(self, -1, size=(450, -1), changeCallback = self.fbbCallback) self.dbb.SetLabel("") self.txt2 = wx.StaticText(self, -1, _(u'Output file').decode('utf8')) -- 2.7.4 From 2124a8f5dd5530a6d15495676571e066430c4350 Mon Sep 17 00:00:00 2001 From: Pierre Ratinaud Date: Thu, 11 Dec 2014 22:20:56 +0100 Subject: [PATCH 16/16] ... --- images/TXM.png | Bin 0 -> 2219 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/TXM.png diff --git a/images/TXM.png b/images/TXM.png new file mode 100644 index 0000000000000000000000000000000000000000..4d50ffa15c619e5e37cca495564589ec768840ce GIT binary patch literal 2219 zcmV;c2vqlpP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2igV* z1|uoW6WbX800=8dL_t(o!?l-vY?aj=$3M?=pZnV0UM?+^VtJ8LyR{aIEJ{-(ahh2b zaY+Lh$`TdPq1hj9X5Atg7?&n<8zIIQj3P_}zRV$7)`760b5LQ7QRoX4+tQXod#SX& zy)V7b^PF?`M|&^5iir{SO-|1F%MlnqbDM1L35^PH`ZKhUXj;ij9U7WZc06M_( z_i#uhD-ww~LV&QxO~n;+Io^-PB;}Rb*3t!(Uk?BS;7+4-=}_dNA#4Z_!A#e$$eB6` zw+CEq#(EF9yl}jAH(#9lTwAnM`?RN16%Gy2^(~Y30+Fi%OvzdB^zqiW5fXGA7Ti)w z_T;H}Jed^Vw1}Z_9~TFj&>e85;}B8;4&}V-LH_gp77Bpj3GZ|{oz7d_ZufmYpKnPp z7%a)k$_i#=WT>-e&o1ok?QKje!uQ_8q2*MM{<~#|A>~;7Qi4+8vP${=uTS#%iJfe( zt41l(nyy335k5NfHy+S5?Zcd$oI5fyGBSNWpXPKr(RCdm1VRXuQWO^#$M){sdt)RL z38iXa*jMquz)+WwTze_6thrKS4=K`(l^koj2GJ3Y0}JNPox7}{puj(6$`sA(^`dE7 z%3KJ6ZQC?8HTjk7HFmLfE5S??n|0f zR8&x3U(dE}+Ymw^rDWBrRUAKloa*Xo1_lP`>+4&*a^=cb0d!Li{5db@<}0&HLdfy# zQxxguE;n>Gsn>zqCrz5JcI?=J5Q5g$ zR)EK5xt;~Br-pPH=@f~TH( zibNtoO-&7J)~q2nH9NtvS0Gghj zz{G+KbO|wG>*ti0- z;mpok%I8!+>5xa$-)lTNEy2q|CC~&(qI$P9hz&(LLz?H1>i50(R&mL^s#^>{~ zXV0FrgoF?j7Z-E#k3miLt#`VX&?{Y`ie;=AT*;TuK^&=aX0WY+-w}&jtVqyyG z)~%zYq=fC;x3g)}CJG7)c;bmC(l#Za5g663wsBYelm#P0xW0^X>i&fXP27Wbxtu(r zBzM`i2qqFHXmFvgy>|PS-@IrTM(2zfGu%>2rca;F{{8#Wb)C}EQig|zIdI?rg@uKb zm6g%c(?d~F5pK78)zPCz-*#LLp!FDizkK?iD{d=&XsgR>ZIVj;Bo<4Q#77feGm*fy zEi5ZRAS?U!=`)Jrry4(7FQt6g>2zw#moKNFpnz9id4*3t`2^dxX=`g^&YU@Dn#SS7 zhgrCAp*VQ(U^O7Gn!v^v>a*tL28TL2`m|Uy%+TN^JYF9jPXjSDU?zOApzpw*8HjfGYh6a z*dH1i-!N=EE(fM*(s{0r?|*L&nr<_D)^tuZwgcevdQt%4p)bSV=}#$L%5(i*w;(7_ZmE;zh-Doa-eTjU%PP?Qx@&Len4=>T0-V0Abr@mSrKOKq`sH z>mojy0NqV&u zCCx1t_^|F%&i7s#2kIac8U&??ga-zJk?(vp`>J;SrQwaP_Hz&S^!B5aL`gN)j~5)M z@!zvT({;LgPVd@Rx2@`$6G&=RRrw=%H{`#WJ9Y9mn(LZQMrIank5^voYJcgPE~nq5 zEpL4MR&P)5>i+&qfWqhV;qmw|twi|p<pSsrb91x#e*pm4{PIU{jm8rz tP0MPzG|<2OeEXT5AAGPSbUp5d{{v1*&L8kYd*%QD002ovPDHLkV1hIcNrV6Z literal 0 HcmV?d00001 -- 2.7.4