m`^ *
$&├──
{4}
|
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
^
.¶
Essayez-le en ligne!
Je suppose que je pourrais techniquement compter cela comme un octet par caractère en échangeant certains caractères, en lisant la source comme ISO 8859-1 puis en trouvant un codage à un octet pour la sortie qui contient ├
et └
, mais je ne peux pas être dérangé de travailler les détails en ce moment. (Pour mémoire, ce serait 72 octets.)
Explication
Étape 1: substitution
m`^ *
$&├──
Nous commençons par faire correspondre l'indentation sur chaque ligne et l'insérer ├──
.
Étape 2: substitution
{4}
|
Ensuite, nous faisons correspondre chaque groupe de 4 espaces et remplaçons le premier par un |
. Maintenant, tout ce qui doit être corrigé est d' |
aller au bas de la sortie et ├
cela devrait l'être └
. Ces deux cas peuvent être reconnus en regardant le personnage directement en dessous de celui que nous voulons potentiellement changer.
Étape 3: translittération
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
Le (?<=(.)*)
nombre de caractères précédant la correspondance sur la ligne actuelle pour mesurer sa position horizontale. Ensuite, l'anticipation passe à la ligne suivante avec .+¶
, correspond à autant de caractères que nous avons capturés dans le groupe 1
avec (?>(?<-1>.)*)
(pour avancer à la même position horizontale), puis vérifie si le caractère suivant (c'est-à-dire celui en dessous de la correspondance réelle) est l'un des|├└
. Si c'est le cas, le match échoue, et dans tous les autres cas, il réussit et la scène substitue des espaces pour |
et └
pour ├
.
Cela ne résoudra pas tous les caractères en une seule fois, nous appliquons donc cette étape à plusieurs reprises avec l' +
option jusqu'à ce que la sortie cesse de changer.
Étape 4: substitution
^
.¶
Tout ce qui reste est la première ligne, donc nous faisons simplement correspondre le début de la chaîne et ajoutons un .
et un saut de ligne.