]> 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 [
 <?xml version="1.0"?>
 <!DOCTYPE westley [
-       <!ENTITY msg "Hello world!">
+       <!ENTITY name "Westley">
 ]>
 <westley>
   <producer id="producer0">
     <property name="mlt_service">pango</property>
 ]>
 <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>
   </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
        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
        
        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;
        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;
        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 );
 
        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);
 }
                
        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 );
 {
        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 )
 
        // 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 );
        
        // 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.
 }
 
 /** 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 )
 {
 
 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;
        xmlSAXHandler *sax = calloc( 1, sizeof( xmlSAXHandler ) );
        struct deserialise_context_s *context = calloc( 1, sizeof( struct deserialise_context_s ) );
        mlt_properties properties = NULL;