Cómo establecer un 'ignorar' en un patrón para sustitución contextual en FontForge

Estoy trabajando en la codificación de una fuente personalizada en FontForge para algunas alternativas posicionales de letras . No estoy trabajando con archivos de funciones para alternativas, sino que uso la interfaz de FontForge para crear búsquedas (no me opongo totalmente a una solución de archivo, pero basándome en lo que he visto a través de una búsqueda exportada a un archivo de FontForge, el .feaarchivo la sintaxis no parece coincidir con lo que dice ese enlace, por lo que incluso a través de un archivo, no estoy seguro de cómo implementar esto).

En ese enlace de arriba, se nota que cuando se trabaja con ese tipo de archivo, se puede hacer un "ignorar" para un patrón. Suponiendo aquí que uno tiene una forma medial de una letra y una forma inicial, cualquier forma medial que esté precedida por otra letra no se cambia a la forma inicial:

ignore sub @AllLetters @Medial';
sub @Medial' by @Initial;

En otras palabras, hay una manera de establecer un patrón (o patrones) para ignorar la realización de una búsqueda, antes de la llamada de búsqueda real, para limitar cuándo se realiza la búsqueda.

Sin embargo, no puedo encontrar ninguna documentación que indique cómo codificar ese mismo tipo de ignoredeclaración al usar los cuadros de diálogo de búsqueda para crear patrones de búsqueda. Entonces, en mi subtabla de búsqueda para sustituciones de encadenamiento contextual, tengo esto hasta ahora que está construido (con nombres ficticios aquí):

| className @<mySubstitutionLookup> |

Pero si pongo algo ignore, entonces dice que "ignorar no es un nombre de clase para las clases coincidentes" (que entiendo por qué dice eso, ya que no he definido una clase "ignorar", pero tampoco debería necesitar si fuera una palabra clave).

Aparentemente, en el cuadro de diálogo de búsqueda...

ingrese la descripción de la imagen aquí

... ignorelas declaraciones deben codificarse de manera diferente, pero nuevamente, no puedo encontrar documentación de cómo (o incluso si , aunque creo que podrían) esos cuadros de diálogo pueden codificar eso.

Entonces, ¿cómo se ignorecodifica una declaración en una sustitución de encadenamiento contextual utilizando los cuadros de diálogo del programa? Y si un .feaarchivo FontForge puede hacerlo, ¿cómo se hace exactamente con la variación de la sintaxis?

Respuestas (2)

FontForge es muy confuso, así que aquí está la respuesta general de "cómo hacer esto" en caso de que sea útil para alguien. Primero, comprenda que cada regla en su lista de sustitución de encadenamiento tiene esta forma:

backClass | matchClass @<Lookup Table> | forwardClass

La forma en que funciona una regla es la siguiente: verifica cada regla en secuencia, buscando una coincidencia. Si encuentra una coincidencia, deja de buscar y luego traduce los caracteres coincidentes a través de la tabla de búsqueda seleccionada. backClass y forwardClass son opcionales, pero matchClass representa los caracteres que cambiarán , utilizando la tabla de búsqueda especificada para determinar con qué reemplazarlos.

En general, la forma en que hace lo que está describiendo es que necesita tener DOS (sub) tablas de búsqueda. En todos los ejemplos a continuación, finja que aes el personaje normal y Aes la versión inicial elegante.

Primero, en su lista de tablas de búsqueda, tendrá la búsqueda "Composición":

a -> A
b -> B
c -> C

Luego, también define una tabla de búsqueda, su búsqueda de "Descomposición":

A -> a
B -> b
C -> c

(En su caso, ambos son solo tablas de sustitución; si estuviera haciendo ligaduras, podría ser un carácter de sustitución múltiple).

Por último, viene su tabla de encadenamiento contextual. Usted definiría su regla así:

Rule: letters | initialLetters @<Decomposition Lookup> |

      ^ back    ^ matching     ^ lookup                  ^ forward

Class: letters        = a b c d e f ....
Class: initialLetters = A B C D E F G

Esta regla le dice a la fuente "si ve un glifo en {letras}, seguido de un glifo en {letras iniciales}, transforme el glifo en {letras iniciales}, también conocido como el glifo coincidente, usando la tabla de búsqueda Búsqueda de descomposición". Entonces, por ejemplo, aAse convierte en aa, porque la búsqueda de descomposición especifica A -> a.

Finalmente, muy importante, debe ordenar sus tablas de búsqueda en su fuente de la siguiente manera:

Decomposition Lookup (A -> a)
Composition Lookup (a -> A)
Contextual Chaining

¿Por qué? A medida que se procesa el flujo de glifos, primero restablecerá todos los glifos alternativos potenciales (aplicando descomposición)*. A continuación, aplica unilateralmente todos los glifos alternativos (aplicando composición). Por último, "deshace" selectivamente los glifos alternativos (usando la búsqueda de encadenamiento contextual), al volver a aplicar la Búsqueda de descomposición solo donde se aplican sus reglas de coincidencia.

*En realidad, la búsqueda de descomposición no hará nada porque, por lo general, sus formas "alternativas" o "ligadas" no pueden existir en el flujo de glifos entrante. Todavía es importante que vaya antes de la búsqueda de composición, de lo contrario, deshará inmediatamente todos los glifos alternativos que especificó.

Espero que esto ayude...

ACTUALIZACIÓN: olvidé mencionar que lo anterior es una forma de obtener el comportamiento "aplicar estas sustituciones a menos que se apliquen estas reglas". En su lugar, puede ser un poco más simple aplicar la sustitución solo cuando lo desee ... Creo que puede hacer esto cambiando la función de la tabla de búsqueda de composición a "en blanco" (deshabilitarla), y hacer que sus reglas especifiquen cuándo aplicar la búsqueda. Este enfoque no requiere la tabla de búsqueda de descomposición.

Gracias por la respuesta. Déjame estar seguro de que entiendo. Primero, no hay una forma directa de hacer esto con una declaración de "ignorar" (que es principalmente lo que pedía la pregunta). Pero en segundo lugar, debe lograrse mediante la codificación adecuada de las búsquedas. En su ejemplo, creo que las letras mayúsculas corresponderían a mi versión "inicial" y las letras minúsculas corresponderían a mi versión "medial", ¿correcto? Por lo tanto, está haciendo que todo sea medial (que en realidad no haría nada como usted indica), luego todo inicial (mayúscula), luego, si una letra lo precede, vuelva a convertirlo a medial (inferior).
Ese es el enfoque, sí. O al menos, es como yo lo hago con ligaduras - si hay una manera más fácil, ¡todavía no la he descubierto!

En su regla Atrás|Coincidencia|Adelante en Fontforge, no asigne la búsqueda a la clase de coincidencia. Esto creará la declaración Ignorar.