Mise en majuscule dans AvalonEdit

J’écris un éditeur de script de film en utilisant AvalonEdit.

J’ai étendu la classe DocumentLine pour avoir une propriété “Type”, avec la valeur représentant un “Caractère”, une “Ligne de dialog”, etc.

J’aimerais que les lignes de document d’un certain type dans le script soient écrites en majuscules (noms de caractères par exemple).

Existe-t-il un point d’extension dans le pipeline de rendu qui me permettrait d’extraire une ligne de document et de changer sa casse?

J’ai essayé de créer une classe qui étend DocumentColorizingTransformer, mais la modification de la casse dans la méthode “protected override void ColorizeLine (Ligne DocumentLine)” ne fonctionnait pas.

Cela est difficile, car les majuscules peuvent modifier le mappage entre les caractères affichés et le document (colonnes visuelles par rapport aux décalages de document).

Par exemple, le caractère unique ‘ß’ (dièse allemande) existe uniquement en tant que lettre minuscule et est converti en chaîne “SS” à deux caractères lors de l’appel de ssortingng.ToUpper() . La modification de ce texte est délicate: nous ne pouvons pas permettre à l’utilisateur de remplacer un seul des «S», car le document sous-jacent ne contient que le «ß».

Une solution simple consiste à utiliser la méthode char.ToUpper() place, en appliquant un mappage un-à-un entre les caractères d’origine et les caractères majuscules. Cela gardera les lettres comme ‘ß’ inchangées.

Dans AvalonEdit 4.2, seules deux transformations sont autorisées sur les VisualLineElements déjà générés:

  • Modifier les propriétés d’exécution du texte, par exemple la taille de la police, la couleur du texte, etc.
  • Fractionner un VisualLineElement en deux – Ceci est utilisé en interne par ChangeLinePart() afin que les propriétés puissent être modifiées pour une portion de texte.

Cela signifie qu’il n’est pas possible de remplacer un texte dans un coloriseur, vous devez l’implémenter à l’aide de VisualLineElementGenerator .

 ///  /// Makes all text after a colon (until the end of line) upper-case. ///  public class UppercaseGenerator : VisualLineElementGenerator { public override int GetFirstInterestdOffset(int startOffset) { TextDocument document = CurrentContext.Document; int endOffset = CurrentContext.VisualLine.LastDocumentLine.EndOffset; for (int i = startOffset; i < endOffset; i++) { char c = document.GetCharAt(i); if (c == ':') return i + 1; } return -1; } public override VisualLineElement ConstructElement(int offset) { DocumentLine line = CurrentContext.Document.GetLineByOffset(offset); return new UppercaseText(CurrentContext.VisualLine, line.EndOffset - offset); } ///  /// Displays a portion of the document text, but upper-cased. ///  class UppercaseText : VisualLineText { public UppercaseText(VisualLine parentVisualLine, int length) : base(parentVisualLine, length) { } protected override VisualLineText CreateInstance(int length) { return new UppercaseText(ParentVisualLine, length); } public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) { if (context == null) throw new ArgumentNullException("context"); int relativeOffset = startVisualColumn - VisualColumn; SsortingngSegment text = context.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset + relativeOffset, DocumentLength - relativeOffset); char[] uppercase = new char[text.Count]; for (int i = 0; i < text.Count; i++) { uppercase[i] = char.ToUpper(text.Text[text.Offset + i]); } return new TextCharacters(uppercase, 0, uppercase.Length, this.TextRunProperties); } } } 

Dans AvalonEdit 4.3.0.8868, j'ai ajouté la méthode VisualLine.ReplaceElement() . Cela peut être utilisé pour remplacer les éléments VisualText par défaut VisualText éléments VisualText dans un transformateur de ligne (coloriseur).

Notez qu'il est également possible d'implémenter le support de "ß" affiché en tant que "SS". Pour cela, vous devez implémenter votre propre copie de VisualLineText au lieu de simplement remplacer celle existante. Vous pouvez ensuite utiliser une longueur visuelle différente de la longueur du document. Les méthodes GetRelativeOffset et GetVisualColumns seraient utilisées pour fournir le mappage entre le document et les coordonnées visuelles.


Vous pouvez utiliser une autre option: les petites capitales.

 // in the colorizer: ChangeLinePart(start, end, e => e.TextRunProperties.SetTypographyProperties(new CapsTypography())); // helper class class CapsTypography : DefaultTextRunTypographyProperties { public override FontCapitals Capitals { get { return FontCapitals.SmallCaps; } } } 

Cependant, WPF rendra les petites majuscules uniquement si vous utilisez une police OpenType qui les prend en charge. Lors de mes tests, Cambria travaillé avec des petites majuscules, contrairement à la plupart des fonts. De plus, la méthode SetTypographyProperties et la classe DefaultTextRunTypographyProperties nécessitent AvalonEdit 4.3.