m`^ *
$&├──
{4}
|
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
^
.¶
Pruébalo en línea!
Supongo que técnicamente podría contar esto como un byte por carácter intercambiando algunos caracteres, leyendo la fuente como ISO 8859-1 y luego encontrando una codificación de un solo byte para la salida que contiene ├y └, pero no puedo molestarme en trabajar Fuera los detalles ahora mismo. (Para el registro, eso sería 72 bytes).
Explicación
Etapa 1: sustitución
m`^ *
$&├──
Comenzamos haciendo coincidir la sangría en cada línea e insertando ├──.
Etapa 2: sustitución
{4}
|
A continuación, hacemos coincidir cada grupo de 4 espacios y reemplazamos el primero con a |. Ahora todo lo que necesita arreglarse es |ir al final de la salida y ├eso debería ser └. Ambos casos pueden reconocerse mirando el personaje directamente debajo del que potencialmente queremos cambiar.
Etapa 3: transliteración
T+`|├` └`(?<=(.)*).(?!.+¶(?>(?<-1>.)*)[|├└])
Los (?<=(.)*)recuentos de cuántos caracteres preceden al partido en la línea actual para medir su posición horizontal. Luego, la búsqueda anticipada salta a la siguiente línea con .+¶, coincide con tantos caracteres como hemos capturado en grupo 1con (?>(?<-1>.)*)(para avanzar a la misma posición horizontal) y luego verifica si el siguiente carácter (es decir, el que está debajo de la coincidencia real) es uno de |├└. Si ese es el caso, la coincidencia falla, y en todos los demás casos tiene éxito y el escenario sustituye espacios por |y └para ├.
Esto no solucionará todos los caracteres en una sola ejecución, por lo que aplicamos esta etapa repetidamente con la +opción hasta que la salida deje de cambiar.
Etapa 4: sustitución
^
.¶
Todo lo que queda es la primera línea, por lo que simplemente hacemos coincidir el comienzo de la cadena y anteponemos un salto de .línea.