2017-02-23 4 views
0

Je dois mettre à jour un dictionnaire bilingue écrit en Writer en commençant par analyser toutes les entrées dans leurs parties, par ex.comment tokenize/analyser/rechercher et remplacer le document par la police et le style de police dans LibreOffice Writer?

  • mot principal (1 police, gras)
  • équivalent étranger translittération (police 1, italique)
  • équivalent étranger (police 2, gras)
  • partie du discours (police 1, italique)

Chaque ligne du document est le mot principal suivi des parties énumérées ci-dessus, chacune étant séparée par un espace ou une ponctuation.

J'ai besoin d'automatiser le processus de marche à travers tout le fichier, ligne par ligne, et de placer un séparateur entre chaque partie, en ignorant les espaces et la ponctuation, de sorte que je peux importer en masse dans un fichier Calc. En d'autres termes, "chaque partie" est une séquence de caractères (ignorant les espaces et la ponctuation) qui ont la même police ET le même style de police.

J'ai essayé la fonctionnalité de recherche standard & Remplacer, et l'extension AltSearch, mais aucun d'entre eux ne peut terminer la tâche. Le principal problème est que je ne suis pas capable d'écrire une requête de recherche qui dit:

Recherche: caractères consécutifs avec la même police et font_style, ignorent les espaces et la ponctuation

Remplacer: terme trouve au-dessus + " délimiteur "

Des suggestions comment je peux écrire un script pour cela, ou si un outil existant peut résoudre le problème?

Merci!

Pseudo code pour l'effet désiré:

var delimiter = "|" 

Go to beginning of document 

While not end of document do: 
    var $currLine = get line from doc 
    var $currChar = get next character which is not space or punctuation; 
    var $font = currChar.font 
    var $font_style - currChar.font_style (e.g. bold, italic, normal) 

    While not end of line do: 
     $currChar = next character which is not space or punctuation; 

      if (currChar.font != $font || currChar.font_style != $font_style) { // font or style has changed 
       print $delimiter 

       $font = currChar.font 
       $font_style - currChar.font_style (e.g. bold, italic, normal) 
      } 
    end While 

end While 

Répondre

0

Voici quelques conseils pour chacune des choses que votre pseudo-code fait. Tout d'abord, le moyen le plus simple de se déplacer ligne par ligne est le TextViewCursor, bien qu'il soit lent. Notez la section XLineCursor. Pour la boucle while, oVC.goDown() retournera false à la fin du document. (oVC est notre variable pour le TextViewCursor). Obtenez chaque caractère en appelant oVC.goRight(0, False) pour désélectionner suivi de oVC.goRight(1, True) pour sélectionner. La valeur sélectionnée est ensuite obtenue par oVC.getString(). Pour ignorer l'espace et la ponctuation, utilisez peut-être le module isalnum() de python ou le module re.

Pour déterminer la police du caractère, appelez oVC.getPropertyValue(attr). Les valeurs pour attr peuvent simplement être CharAutoStyleName et CharStyleName pour vérifier les changements de formatage.

Ou saisir une liste de propriétés spécifiques telles que 'CharFontFamily', 'CharFontFamilyAsian', 'CharFontFamilyComplex', 'CharFontPitch', 'CharFontPitchAsian' etc. Les propriétés de caractère sont décrites à https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Formatting.

Pour insérer le séparateur dans le texte: oVC.getText().insertString(oVC, "|", 0).

This python code from github montre comment faire la plupart de ces choses, bien que vous aurez besoin de lire à travers pour trouver les parties pertinentes. Au lieu d'utiliser l'API LibreOffice, décompressez le fichier .odt et analysez content.xml avec un script.

+0

La décompression du fichier .odt et l'extraction du fichier .xml était une suggestion utile! Je ne savais pas .odt était un format zip. – kaanch