Automáticamente HTML Codificación NVelocity salida (EventCartridge y ReferenceInsert)
-
30-09-2019 - |
Pregunta
quería probar conseguir NVelocity a codificar automáticamente HTML ciertas cadenas en mi monorraíl aplicación.
Me miró a través del código fuente y NVelocity encontrado EventCartridge
, lo que parece ser una clase que puede Plugin para cambiar comportamientos diferentes.
En particular, esta clase tiene un método ReferenceInsert
lo que parece hacer exactamente lo que quiero. Básicamente se llama justo antes del valor de referencia (por ejemplo, $ foobar) obtiene la salida, y le permite modificar los resultados.
Lo que no puedo hacer ejercicio es cómo puedo configurar NVelocity / el motor vista monorraíl NVelocity usar mi aplicación?
El Velocity docs velocity.properties sugieren que puede contener una entrada para añadir controladores de eventos específicos como este, pero no puedo encontrar en cualquier parte del código fuente NVelocity que busca esta configuración.
Cualquier ayuda muy apreciada!
Edit: Una prueba simple que muestra este trabajo (! Prueba de concepto por lo que no código de producción)
private VelocityEngine _velocityEngine;
private VelocityContext _velocityContext;
[SetUp]
public void Setup()
{
_velocityEngine = new VelocityEngine();
_velocityEngine.Init();
// creates the context...
_velocityContext = new VelocityContext();
// attach a new event cartridge
_velocityContext.AttachEventCartridge(new EventCartridge());
// add our custom handler to the ReferenceInsertion event
_velocityContext.EventCartridge.ReferenceInsertion += EventCartridge_ReferenceInsertion;
}
[Test]
public void EncodeReference()
{
_velocityContext.Put("thisShouldBeEncoded", "<p>This \"should\" be 'encoded'</p>");
var writer = new StringWriter();
var result = _velocityEngine.Evaluate(_velocityContext, writer, "HtmlEncodingEventCartridgeTestFixture.EncodeReference", @"<p>This ""shouldn't"" be encoded.</p> $thisShouldBeEncoded");
Assert.IsTrue(result, "Evaluation returned failure");
Assert.AreEqual(@"<p>This ""shouldn't"" be encoded.</p> <p>This "should" be 'encoded'</p>", writer.ToString());
}
private static void EventCartridge_ReferenceInsertion(object sender, ReferenceInsertionEventArgs e)
{
var originalString = e.OriginalValue as string;
if (originalString == null) return;
e.NewValue = HtmlEncode(originalString);
}
private static string HtmlEncode(string value)
{
return value
.Replace("&", "&")
.Replace("<", "<")
.Replace(">", ">")
.Replace("\"", """)
.Replace("'", "'"); // ' does not work in IE
}
Solución
Trate de conectar un nuevo EventCartridge a la VelocityContext. Ver estas pruebas como referencia.
Ahora que ya ha confirmado que este enfoque funciona, heredad de Castle.MonoRail.Framework.Views.NVelocity.NVelocityEngine
, BeforeMerge
anulación y establecer el EventCartridge
y eventos allí. A continuación, configure monorraíl a utilizar este motor vista personalizada.