]> git.sesse.net Git - mlt/commitdiff
fix westley for mixed element text and entity references
authorddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Fri, 26 Mar 2004 16:21:52 +0000 (16:21 +0000)
committerddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Fri, 26 Mar 2004 16:21:52 +0000 (16:21 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@250 d19143bc-622f-0410-bfdd-b5b2a6649095

demo/entity.westley
docs/westley.txt
src/modules/westley/producer_westley.c

index a75b0fae4ce5b49e1e50a509fedcd655d1c8e9e7..a54f4e1cf647ed01048be2ece4bd9830483ec887 100644 (file)
@@ -1,10 +1,11 @@
 <?xml version="1.0"?>
 <!DOCTYPE westley [
-       <!ENTITY msg "Hello world!">
+       <!ENTITY name "Westley">
 ]>
 <westley>
   <producer id="producer0">
     <property name="mlt_service">pango</property>
-       <property name="text" value="&msg;"/>
+       <property name="text">Hello &name;,
+My name is Inigo Montoya.</property>
   </producer>
 </westley>
index 42f1a9359b617804d84b7bf4af40300dde4b4612..c36fa6e77a1189611d7c21ef863f22d87be2d86f 100644 (file)
@@ -499,9 +499,9 @@ Entities and Parameterisation:
        prevent shell filename expansion, or similar.
        
        Needless to say, the ability to parameterise westley XML compositions is
-       an extremely powerful tool. The above example is avialable in 
-       demo/entity.westley for you to try out. Override the message from inigo:
-       inigo 'westley:entity.westley?msg:Amazing!'
+       an extremely powerful tool. An example for you to play with is available in 
+       demo/entity.westley. Try overriding the name from inigo:
+       inigo 'westley:entity.westley?name:Charlie'
        
        Technically, the entity declaration is not needed in the head of the XML
        document if you always supply the parameter. However, you run the risk
index 1f1d6dcc609866313f979e7b660eae350ff2b2e3..dfaa8ceb1ad7823c313c01e328936d5866041b64 100644 (file)
@@ -53,6 +53,7 @@ struct deserialise_context_s
        xmlNodePtr stack_node[ STACK_SIZE ];
        int stack_node_size;
        xmlDocPtr entity_doc;
+       int entity_is_replace;
        int depth;
        int branch[ STACK_SIZE ];
        const xmlChar *publicId;
@@ -982,8 +983,26 @@ static void on_characters( void *ctx, const xmlChar *ch, int len )
        if ( context->stack_node_size > 0 )
                xmlNodeAddContent( context->stack_node[ context->stack_node_size - 1 ], ( xmlChar* )value );
 
-       else if ( context->property != NULL && context->producer_properties != NULL )
-               mlt_properties_set( context->producer_properties, context->property, value );
+       // libxml2 generates an on_characters immediately after a get_entity within
+       // an element value, and we ignore it because it is called again during
+       // actual substitution.
+       else if ( context->property != NULL && context->producer_properties != NULL
+               && context->entity_is_replace == 0 )
+       {
+               char *s = mlt_properties_get( context->producer_properties, context->property );
+               if ( s != NULL )
+               {
+                       // Append new text to existing content
+                       char *new = calloc( strlen( s ) + len + 1, 1 );
+                       strcat( new, s );
+                       strcat( new, value );
+                       mlt_properties_set( context->producer_properties, context->property, new );
+                       free( new );
+               }
+               else
+                       mlt_properties_set( context->producer_properties, context->property, value );
+       }
+       context->entity_is_replace = 0;
                
        free( value);
 }
@@ -1038,6 +1057,7 @@ xmlEntityPtr on_get_entity( void *ctx, const xmlChar* name )
 {
        struct _xmlParserCtxt *xmlcontext = ( struct _xmlParserCtxt* )ctx;
        deserialise_context context = ( deserialise_context )( xmlcontext->_private );
+       xmlEntityPtr e = NULL;
 
        // Setup for entity declarations if not ready
        if ( xmlGetIntSubset( context->entity_doc ) == NULL )
@@ -1050,7 +1070,13 @@ xmlEntityPtr on_get_entity( void *ctx, const xmlChar* name )
        // Add our parameters if not already
        params_to_entities( context );
        
-       return xmlGetDocEntity( context->entity_doc, name );
+       e = xmlGetDocEntity( context->entity_doc, name );
+       
+       // Send signal to on_characters that an entity substitutin is pending
+       if ( e != NULL )
+               context->entity_is_replace = 1;
+       
+       return e;
 }
 
 /** Convert a hexadecimal character to its value.
@@ -1122,6 +1148,8 @@ static void parse_url( mlt_properties properties, char *url )
 
 mlt_producer producer_westley_init( char *url )
 {
+       if ( url == NULL )
+               return NULL;
        xmlSAXHandler *sax = calloc( 1, sizeof( xmlSAXHandler ) );
        struct deserialise_context_s *context = calloc( 1, sizeof( struct deserialise_context_s ) );
        mlt_properties properties = NULL;