]> err.no Git - sope/commitdiff
enhanced input support in libxmlSAXdriver for HTML,
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Wed, 25 Aug 2004 10:06:14 +0000 (10:06 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Wed, 25 Aug 2004 10:06:14 +0000 (10:06 +0000)
changed factory for WOTemplateBuilder objects

git-svn-id: http://svn.opengroupware.org/SOPE/trunk@54 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

16 files changed:
sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/DynamicElements/WOConditional.m
sope-appserver/NGObjWeb/NGObjWeb/WOTemplateBuilder.h
sope-appserver/NGObjWeb/Templates/WOTemplateBuilder.m
sope-appserver/NGObjWeb/Templates/WOWrapperTemplateBuilder.m
sope-appserver/NGObjWeb/Templates/WOxTemplateBuilder.m
sope-appserver/NGObjWeb/Version
sope-appserver/NGObjWeb/WOComponentDefinition.m
sope-core/NGExtensions/NGExtensions/NSURL+misc.h
sope-xml/DOM/ChangeLog
sope-xml/DOM/DOMSaxHandler.m
sope-xml/DOM/Version
sope-xml/libxmlSAXDriver/ChangeLog
sope-xml/libxmlSAXDriver/Version
sope-xml/libxmlSAXDriver/libxmlDocSAXDriver.m
sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m

index b2e0dbe56725b6f3c8fab3f0b5bd644d9ffa9d4d..b272d88e749aa89613c76fbe801cc5657bd4ff80 100644 (file)
@@ -1,3 +1,13 @@
+2004-08-25  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.3.12
+
+       * Templates/WOxTemplateBuilder.m: properly select a DOM builder based
+         on the template extension
+
+       * Templates/WOTemplateBuilder.m, WOComponentDefinition.m: moved
+         builder factory to WOComponentDefinition
+
 2004-08-24  Helge Hess  <helge.hess@opengroupware.org>
 
        * changed bundles to install in "xxx-4.3" pathes instead of "xxx/4.3"
index d8b2c5fe6ceb6c4613eb8dc1f4315ffa0949d70c..74db45a1284404c8db0319ff1428428d5e2a27ff 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id: WOConditional.m 1 2004-08-20 10:08:27Z znek $
 
 #include <NGObjWeb/WODynamicElement.h>
 
index cb276c53977cde6be10b25c543c9dac578ed2271..4640ab2956517d4e036c55225069997480775544 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGObjWeb_WOTemplateBuilder_H__
 #define __NGObjWeb_WOTemplateBuilder_H__
@@ -34,9 +33,6 @@
 {
 }
 
-+ (WOTemplateBuilder *)templateBuilderForPath:(NSString *)_path;
-+ (WOTemplateBuilder *)templateBuilderForURL:(NSURL *)_url;
-
 - (WOTemplate *)buildTemplateAtURL:(NSURL *)_url;
 
 @end
index c6db9519ce904fe783bfda0f0c1dd25db3dba470..980f6978e4e49ff4a85465c8509dedab56016087 100644 (file)
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
+// $Id: WOTemplateBuilder.m 1 2004-08-20 10:08:27Z znek $
 
 #include <NGObjWeb/WOTemplateBuilder.h>
 #include "common.h"
 
 @implementation WOTemplateBuilder
 
-static NSArray *woxExtensions = nil;
-
 + (int)version {
-  return 1;
-}
-+ (void)initialize {
-  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
-  woxExtensions = [[ud arrayForKey:@"WOxFileExtensions"] copy];
+  return 2;
 }
 
-/* builder factory */
-
-+ (WOTemplateBuilder *)templateBuilderForPath:(NSString *)_path {
-  NSString *ext;
-  
-  if ([_path length] == 0)
-    return nil;
-  
-  ext = [_path pathExtension];
-  if ([woxExtensions containsObject:ext]) {
-    static WOTemplateBuilder *woxBuilder = nil;
-    if (woxBuilder == nil)
-      woxBuilder = [[NSClassFromString(@"WOxTemplateBuilder") alloc] init];
-    return woxBuilder;
-  }
-  
-  {
-    static WOTemplateBuilder *woBuilder = nil;
-    if (woBuilder == nil) {
-      woBuilder =
-        [[NSClassFromString(@"WOWrapperTemplateBuilder") alloc] init];
-    }
-    return woBuilder;
-  }
-}
-
-+ (WOTemplateBuilder *)templateBuilderForURL:(NSURL *)_url {
-  if ([_url isFileURL])
-    return [self templateBuilderForPath:[_url path]];
-  
-  [self logWithFormat:@"only supports file URLs: %@", _url];
-  return nil;
-}
+/* building */
 
 - (WOTemplate *)buildTemplateAtURL:(NSURL *)_url {
 #if APPLE_FOUNDATION_LIBRARY || NeXT_Foundation_LIBRARY
index 4b360223c6885d34066876515809eca265b9d72d..0cb8370526bce1c0d34edf730c9f105566a03963 100644 (file)
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "WOWrapperTemplateBuilder.h"
 #include "WODParser.h"
@@ -68,12 +67,12 @@ static BOOL logScriptAdditions   = NO;
 static NSStringEncoding parserEncoding;
 
 + (int)version {
-  return [super version] + 0 /* v1 */;
+  return [super version] + 0 /* v2 */;
 }
 
 + (void)initialize {
   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
-  NSAssert2([super version] == 1,
+  NSAssert2([super version] == 2,
             @"invalid superclass (%@) version %i !",
             NSStringFromClass([self superclass]), [super version]);
   
index eede0d9aa2fe2901d34f9ad37bf7cc866324858c..ea01ff0c61ef5efe2e5184fc09d13e93f3649046 100644 (file)
@@ -33,11 +33,11 @@ static BOOL  profLoading = NO;
 static Class DateClass = Nil;
 
 + (int)version {
-  return [super version] + 0 /* v1 */;
+  return [super version] + 0 /* v2 */;
 }
 
 + (void)initialize {
-  NSAssert2([super version] == 1,
+  NSAssert2([super version] == 2,
             @"invalid superclass (%@) version %i !",
             NSStringFromClass([self superclass]), [super version]);
   
@@ -104,11 +104,20 @@ static Class DateClass = Nil;
   return template;
 }
 
-- (id<DOMBuilder>)xmlParser {
-  //static id builder = nil;
+- (id<DOMBuilder>)xmlParserForURL:(NSURL *)_url {
+  static DOMBuilderFactory *factory = nil;
   
-  return [[DOMBuilderFactory standardDOMBuilderFactory]
-                             createDOMBuilderForMimeType:@"text/xml"];
+  if (factory == nil)
+    factory = [[DOMBuilderFactory standardDOMBuilderFactory] retain];
+  
+  // TODO: somewhat hackish
+  if ([[_url path] hasSuffix:@".html"])
+    return [factory createDOMBuilderForMimeType:@"text/html"];
+  if ([[_url path] hasSuffix:@".stx"])
+    return [factory createDOMBuilderForMimeType:@"text/structured"];
+  
+  // TODO: do we want to cache the builder?
+  return [factory createDOMBuilderForMimeType:@"text/xml"];
 }
 
 - (WOTemplate *)buildTemplateAtURL:(NSURL *)_url {
@@ -117,16 +126,20 @@ static Class DateClass = Nil;
   id<DOMBuilder>    builder;
   WOTemplate        *template;
   
-  //NSLog(@"loading XML template %@ ...", self->path);
+#if 0  
+  [self logWithFormat:@"loading XML template %@ ...", self->path];
+#endif
   
   pool = [[NSAutoreleasePool alloc] init];
   
-  builder = [self xmlParser];
+  builder = [self xmlParserForURL:_url];
   NSAssert(builder != nil, @"missing XML parser ..");
   
   domDocument = [builder buildFromSource:_url];
-  //[@"file://" stringByAppendingString:self->path]];
-  
+#if 0
+  [@"file://" stringByAppendingString:self->path]];
+#endif
+
   /* construct template for DOM document */
   
   if (domDocument) {
index 12b8a0d3c13f01ec091de40d0db96c617a47f385..955909dbe260ff74cd0de6da1e42a7da684beb68 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=9
+SUBMINOR_VERSION:=12
 
 # v4.2.413 requires libSaxObjC      v4.2.33
 # v4.2.341 requires libNGExtensions v4.2.77
index 9b9200e8e2ab2fbda6b7ff8c4a938ca678bc5793..6f61547a368cb3a1eb5ee9ecd7035e06a31b6249 100644 (file)
@@ -191,6 +191,7 @@ static BOOL debugOn     = NO;
 static BOOL profLoading = NO;
 static BOOL enableClassLessComponents = NO;
 static BOOL enableWOOFiles            = NO;
+static NSArray *woxExtensions = nil;
 
 + (int)version {
   return 4;
@@ -217,6 +218,7 @@ static BOOL enableWOOFiles            = NO;
     [ud boolForKey:@"WOEnableComponentsWithoutClasses"];
   enableWOOFiles = [ud boolForKey:@"WOComponentLoadWOOFiles"];
   debugOn        = [ud boolForKey:@"WODebugComponentDefinition"];
+  woxExtensions  = [[ud arrayForKey:@"WOxFileExtensions"] copy];
 }
 
 - (id)initWithName:(NSString *)_name
@@ -497,6 +499,38 @@ static BOOL enableWOOFiles            = NO;
 
 /* templates */
 
+- (WOTemplateBuilder *)templateBuilderForPath:(NSString *)_path {
+  NSString *ext;
+  
+  if ([_path length] == 0)
+    return nil;
+  
+  ext = [_path pathExtension];
+  if ([woxExtensions containsObject:ext]) {
+    static WOTemplateBuilder *woxBuilder = nil;
+    if (woxBuilder == nil)
+      woxBuilder = [[NSClassFromString(@"WOxTemplateBuilder") alloc] init];
+    return woxBuilder;
+  }
+  
+  {
+    static WOTemplateBuilder *woBuilder = nil;
+    if (woBuilder == nil) {
+      woBuilder =
+        [[NSClassFromString(@"WOWrapperTemplateBuilder") alloc] init];
+    }
+    return woBuilder;
+  }
+}
+
+- (WOTemplateBuilder *)templateBuilderForURL:(NSURL *)_url {
+  if ([_url isFileURL])
+    return [self templateBuilderForPath:[_url path]];
+  
+  [self logWithFormat:@"only supports file URLs: %@", _url];
+  return nil;
+}
+
 - (BOOL)load {
   WOTemplateBuilder *builder;
   NSURL *url;
@@ -518,7 +552,7 @@ static BOOL enableWOOFiles            = NO;
   if (debugOn) [self debugWithFormat:@"url: %@", [url absoluteString]];
   
   // TODO: maybe we should move the builder selection to the resource-manager
-  builder = [WOTemplateBuilder templateBuilderForURL:url];
+  builder = [self templateBuilderForURL:url];
   if (debugOn) [self debugWithFormat:@"builder: %@", builder];
   
   self->template = [[builder buildTemplateAtURL:url] retain];
index 3e751b2d1255da49543dab4cf8e25f692ccc0d27..7e3a04151d6f7434d3cb8480819e79ab14eb9009 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #ifndef __NGExtensions_NSURL_misc_H__
 #define __NGExtensions_NSURL_misc_H__
index 689fe42dd07d31c3435dfea777a41b25fbeb0711..7709d76fa6cd5b243dfa433391d56e2aaf6af2c4 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-25  Helge Hess  <helge.hess@opengroupware.org>
+
+       * DOMSaxHandler.m: do not print DOM parsing errors per default
+         (consumers need to check the errors array) (v4.3.12)
+
 2004-08-20  Helge Hess  <helge.hess@opengroupware.org>
 
        * moved to SOPE 4.3 (v4.3.11)
index 86ce5ee213b8b6c4091d5d7551349c728e3d852e..00941e9cbcb89ec929674dad601a23090b47a12b 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #include "DOMSaxHandler.h"
 #include "DOMImplementation.h"
@@ -33,6 +32,8 @@
 
 @implementation DOMSaxHandler
 
+static BOOL printErrors = NO;
+
 - (id)initWithDOMImplementation:(id)_domImpl {
   if ((self = [super init])) {
     self->dom = [_domImpl retain];
 }
 
 - (void)error:(SaxParseException *)_exception {
-  NSString *sysId;
-  int line;
-  
   self->errorCount++;
   
-  sysId = [[_exception userInfo] objectForKey:@"systemId"];
-  line  = [[[_exception userInfo] objectForKey:@"line"] intValue];
+  if (printErrors) {
+    NSString *sysId;
+    int line;
+  
+    sysId = [[_exception userInfo] objectForKey:@"systemId"];
+    line  = [[[_exception userInfo] objectForKey:@"line"] intValue];
+    
+    NSLog(@"DOM XML ERROR(%@:%i[%@]): %@ (errcount=%i,max=%i)", sysId, line,
+         [[_exception userInfo] objectForKey:@"parser"],
+         [_exception reason],
+         self->errorCount, self->maxErrorCount);
+  }
   
-  NSLog(@"DOM XML ERROR(%@:%i[%@]): %@ (errcount=%i,max=%i)", sysId, line,
-        [[_exception userInfo] objectForKey:@"parser"],
-        [_exception reason],
-        self->errorCount, self->maxErrorCount);
-
   if (self->errors == nil)
     self->errors = [[NSMutableArray alloc] initWithCapacity:32];
   
index c351558f441a4d159527ee99c46d76a467ff4349..02dd0f66ab04ac6e6aa94378fa7704a16cec37a4 100644 (file)
@@ -1,3 +1,3 @@
-# $Id$
+# $Id: Version 4 2004-08-20 17:04:31Z helge $
 
-SUBMINOR_VERSION:=11
+SUBMINOR_VERSION:=12
index f83bdc214bacfa4023c9e355c97e4e770cc60af9..caa48d130712b9406c3998936f51a25d6696025b 100644 (file)
@@ -1,3 +1,13 @@
+2004-08-25  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.3.16
+
+       * libxmlHTMLSAXDriver.m: generate SAX events (HTML/BODY) for empty
+         documents
+
+       * libxmlDocSAXDriver.m, libxmlHTMLSAXDriver.m: allows NSURL objects as
+         the source for parsing
+
 2004-08-24  Helge Hess  <helge.hess@skyrix.com>
 
        * GNUmakefile: install SAX driver in Library/SaxDrivers-4.3/ (v4.3.15)
index cf9e5c1262bbe256db9dcbe38538f8ad07693b99..30986027db5373739b686e44c443ef12043cb73a 100644 (file)
@@ -1,3 +1,3 @@
-# $Id$
+# version
 
-SUBMINOR_VERSION:=15
+SUBMINOR_VERSION:=16
index 6df4edb004afb3a84643f5f53cf16bdffd6c3d89..1aab9de9c82bad026db1a842f3f7079813153895 100644 (file)
@@ -1,7 +1,7 @@
 /*
-  Copyright (C) 2000-2003 SKYRIX Software AG
+  Copyright (C) 2000-2004 SKYRIX Software AG
 
-  This file is part of OGo
+  This file is part of OpenGroupware.org.
 
   OGo is free software; you can redistribute it and/or modify it under
   the terms of the GNU Lesser General Public License as published by the
@@ -18,7 +18,6 @@
   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.
 */
-// $Id$
 
 #import "libxmlDocSAXDriver.h"
 #import "libxmlSAXLocator.h"
@@ -226,12 +225,25 @@ static void setLocator(void *udata, xmlSAXLocatorPtr _locator);
 - (void)parseFromSource:(id)_source systemId:(NSString *)_sysId {
   if ([_source isKindOfClass:[NSData class]]) {
     [self _parseFromData:_source systemId:nil];
+    return;
   }
-  else if ([_source isKindOfClass:[NSString class]]) {
+  if ([_source isKindOfClass:[NSString class]]) {
     [self _parseFromData:[_source dataUsingEncoding:NSISOLatin1StringEncoding]
           systemId:nil];
+    return;
   }
-  else {
+  if ([_source isKindOfClass:[NSURL class]]) {
+    NSData *data;
+
+    data = [_source isFileURL]
+      ? [NSData dataWithContentsOfMappedFile:[_source path]]
+      : [_source resourceDataUsingCache:YES];
+    
+    [self _parseFromData:data systemId:[_source absoluteString]];
+    return;
+  }
+  
+  {
     SaxParseException *e;
     NSDictionary      *ui;
     
@@ -241,14 +253,21 @@ static void setLocator(void *udata, xmlSAXLocatorPtr _locator);
                          nil];
     
     e = (id)[SaxParseException exceptionWithName:@"SaxIOException"
-                               reason:@"can't handle data-source"
+                               reason:@"cannot handle data-source"
                                userInfo:ui];
     
     [self->errorHandler fatalError:e];
   }
 }
 - (void)parseFromSource:(id)_source {
-  [self parseFromSource:_source systemId:@"<memory>"];
+  if ([_source isKindOfClass:[NSString class]])
+    [self parseFromSource:_source systemId:@"<string>"];
+  else if ([_source isKindOfClass:[NSData class]])
+    [self parseFromSource:_source systemId:@"<data>"];
+  else if ([_source isKindOfClass:[NSURL class]])
+    [self parseFromSource:_source systemId:[_source absoluteString]];
+  else
+    [self parseFromSource:_source systemId:@"<memory>"];
 }
 
 - (void)parseFromSystemId:(NSString *)_sysId {
index 6e049f69b03effda9ef7488e36c1968bb4511fa1..af285cc74d616d4898f2d8b69d90c84fdbf553f7 100644 (file)
@@ -262,8 +262,37 @@ static void setLocator(void *udata, xmlSAXLocatorPtr _locator);
 
 /* parsing */
 
+- (void)_handleEmptyDataInSystemId:(NSString *)_sysId {
+  /*
+     An empty HTML file _is_ valid?!
+     I guess it equals to <html><body></body></html>, wrong? => hh
+  */
+  [self->contentHandler startDocument];
+  [self->contentHandler startPrefixMapping:@"" uri:self->namespaceURI];
+
+  [self->contentHandler
+       startElement:@"html" namespace:XMLNS_XHTML
+       rawName:@"html" attributes:nil];
+  [self->contentHandler
+       startElement:@"body" namespace:XMLNS_XHTML
+       rawName:@"body" attributes:nil];
+  
+  [self->contentHandler
+       endElement:@"body" namespace:XMLNS_XHTML rawName:@"body"];
+  [self->contentHandler
+       endElement:@"html" namespace:XMLNS_XHTML rawName:@"html"];
+  
+  [self->contentHandler endPrefixMapping:@""];
+  [self->contentHandler endDocument];
+}
+
 - (void)_parseFromData:(NSData *)_data systemId:(NSString *)_sysId {
   NSAutoreleasePool *pool;
+
+  if ([_data length] == 0) {
+    [self _handleEmptyDataInSystemId:_sysId];
+    return;
+  }
   
   pool = [[NSAutoreleasePool alloc] init];
 
@@ -291,12 +320,25 @@ static void setLocator(void *udata, xmlSAXLocatorPtr _locator);
   
   if ([_source isKindOfClass:[NSData class]]) {
     [self _parseFromData:_source systemId:_sysId];
+    return;
   }
-  else if ([_source isKindOfClass:[NSString class]]) {
+  if ([_source isKindOfClass:[NSString class]]) {
     [self _parseFromData:[_source dataUsingEncoding:NSISOLatin1StringEncoding]
           systemId:_sysId];
+    return;
   }
-  else {
+  if ([_source isKindOfClass:[NSURL class]]) {
+    NSData *data;
+
+    data = [_source isFileURL]
+      ? [NSData dataWithContentsOfMappedFile:[_source path]]
+      : [_source resourceDataUsingCache:YES];
+    
+    [self _parseFromData:data systemId:[_source absoluteString]];
+    return;
+  }
+
+  {
     SaxParseException *e;
     NSDictionary      *ui;
     
@@ -317,7 +359,14 @@ static void setLocator(void *udata, xmlSAXLocatorPtr _locator);
   [pool release];
 }
 - (void)parseFromSource:(id)_source {
-  [self parseFromSource:_source systemId:@"<memory>"];
+  if ([_source isKindOfClass:[NSString class]])
+    [self parseFromSource:_source systemId:@"<string>"];
+  else if ([_source isKindOfClass:[NSData class]])
+    [self parseFromSource:_source systemId:@"<data>"];
+  else if ([_source isKindOfClass:[NSURL class]])
+    [self parseFromSource:_source systemId:[_source absoluteString]];
+  else
+    [self parseFromSource:_source systemId:@"<memory>"];
 }
 
 - (void)parseFromSystemId:(NSString *)_sysId {