2010-02-04 31 views
18

Tengo una aplicación que utiliza un motor de reglas basado en Javascript. Necesito una forma de convertir comillas regulares regulares en comillas tipográficas (o inteligentes). Sería fácil simplemente hacer un string.replace para ["], solo esto solo insertará un caso del presupuesto.Conversión de "Citas directas" a "Citas rizadas"

La mejor manera en que podía pensar era en reemplazar la primera ocurrencia de una cita con una comilla rizada izquierda y la siguiente con una izquierda, y el resto a la derecha.

¿Hay alguna manera de lograr esto usando Javascript?

+1

Es posible que desee jugar un poco con un procesador de textos y ver qué reglas usa para determinar qué comillas usar. Por lo que he visto, se basan en el contexto de la cita, no en el emparejamiento. –

Respuesta

13

Puede reemplazar todo lo que precede a un carácter de palabra con la comilla izquierda, y todo lo que sigue a un carácter de palabra con una comilla derecha.

str = str.replace(/"(?=\w|$)/g, "“"); 
str = str.replace(/(?<=\w|^)"/g, "&#8221;"); // IF the language supports look- 
              // behind. Otherwise, see below. 

Como se señala en los comentarios a continuación, esto no toma en cuenta puntuacion, pero fácilmente puede:

/(?<=[\w,.?!\)]|^)"/g 

[Editar :] Para los idiomas que no son compatibles con Mira- detrás, como Javascript, siempre y cuando se reemplaza todos los que dan al frente en primer lugar, usted tiene dos opciones:

str = str.replace(/"/g, "&#8221;"); // Replace the rest with right curly quotes 
// or... 
str = str.replace(/\b"/g, "&#8221;"); // Replace any quotes after a word 
             // boundary with right curly quotes 

(he dejado la fre solución final anterior en caso de que esto sea útil a alguien usando un lenguaje que hace de soporte mirada detrás)

+0

+1 por responder la pregunta. Aunque los usuarios de esto deberían tener en cuenta que no es perfecto en todas las situaciones, por ejemplo, los guiones indican pies y pulgadas. –

+0

... o puntuación que termina una cita. – Pointy

+0

¡Gracias! Esto es lo que estaba buscando. Una nota, copiar el código me dio exactamente un error. la porción '? <=' se cambió a '? ='. Además, tuve que eliminar el carácter de cita del caso final para que coincida correctamente. El código: s = s.replace (/ "(? = \ W | $)/g," ""); s = s.replace (/ (? = [\ W,.?! \ - ")] | ^)"/g, "" "; – BlueVoid

2
'foo "foo bar" "bar"'.replace(/"([-a-zA-Z0-9 ]+)"/g, function(wholeMatch, m1){ 
    return "“" + m1 + "”"; 
}); 
+1

Esto no responde la pregunta. – SLaks

+0

@SLaks: Lo edité, eso funciona. –

+1

¿Cómo manejaría '" John tenía 6 '4 "" '? –

0

No creo que algo así en general es nada fácil, ya que habría que interpretar exactamente qué significa cada carácter de comillas dobles en tu contenido. Dicho esto, lo que haría es recopilar todos los nodos de texto que me interesan, y luego seguir y hacer un seguimiento de la naturaleza "on/off" (o "impar/par", cualquiera) de cada instancia de doble cita. Entonces puedes saber qué entidad de reemplazo usar.

4

Es posible que desee ver lo que Pandoc hace, al parecer con la opción --smart, maneja las citas correctamente en todos los casos (incluyendo, por ejemplo, 'tis y' twere).

Hace poco escribí un motor de pretificación de tipografía Javascript que, entre otras cosas, cita el reemplazo; Terminé usando básicamente el algoritmo sugerido por Renesis, pero actualmente hay una prueba fallida esperando una solución más inteligente.

Si está interesado en cifrar mi código (y/o enviar un parche basado en el trabajo que ha realizado), compruébelo: jsPrettify. jsprettify.prettifyStr hace lo que estás buscando. Si no desea ocuparse de la dependencia de Cierre, existe un older version que se ejecuta solo, incluso funciona en Rhino.

+0

Plus 1 para Pandoc. Trato de utilizar una herramienta madura y probada siempre que puedo frente a la cocción de mi propia expresión regular. Las expresiones regex construidas a mano no pueden ser demasiado codiciosas, o no codiciosas, y pueden no ser sensibles a los límites de palabras, a las comas, etc. Pandoc representa la mayor parte de esto y más. – Paulb

1

Lo siguiente simplemente cambia cada cita alternando (este ejemplo específico, sin embargo, omitirá las comillas huérfanas).

str.replace(/\"([^\"]*)\"/gi,"&#8220;$1&#8221;"); 

funciona perfectamente, siempre y cuando el texto que está texturización no está atornillado con el uso incorrecto de las comillas. En inglés, las comillas nunca se anidan.

+3

Hay una situación legítima en inglés donde esta regla se rompe. Cuando tiene párrafos consecutivos que representan la voz citada * por el mismo hablante *, debe comenzar cada uno de esos párrafos con las comillas apropiadas (simple, doble, simple + doble, doble + única, etc.), pero se omite la cita de cierre, excepto para el último párrafo del mismo orador. – tchrist

1

Gracias.Para hacerlo con PHP: http://pastebin.com/CEK0NN43

El opuesto con JavaScript: http://www.kevinkorb.com/post/37

Pero el problema en las páginas que convertir de cotizaciones verticales a los rizados es que si la conversión se realiza a código informático que normalmente no funciona , por lo que debe volver a convertir todas las comillas en verticales.

0

No encontré la lógica que quería aquí, así que aquí es a lo que terminé yendo.

value = value.replace(/(^|\s)(")/g, "$1“"); // replace quotes that start a line or follow spaces 
value = value.replace(/"/g, "”"); // replace rest of quotes with the back smart quote 

que tienen una pequeña área de texto que necesito para reemplazar comillas rectas con comillas tipográficas (smart). Solo estoy ejecutando esta lógica en keyup. Intenté que se comportara como Microsoft Word.

0

Publicación para la posteridad.

Según lo sugerido por @Steven Dee, fui al Pandoc.

Intento utilizar una herramienta madura y probada siempre que pueda frente a la cocción de mi propia expresión regular. Las expresiones regulares construidas a mano pueden ser demasiado codiciosas o no codiciosas, y es posible que no sean sensibles a los límites de palabras, a las comas, etc. Pandoc representa la mayor parte de esto y más.

Desde la línea de comandos (el parámetro --smart convierte en comillas tipográficas):

pandoc --smart --standalone -o output.html input.html

..y sé un script de línea de comandos puede o no puede adaptarse a los requerimientos de la OP de usando Javascript . (relacionado: How to execute shell command in Javascript)

Cuestiones relacionadas