]> err.no Git - sope/commitdiff
added container tag generator
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 22 Feb 2005 22:15:44 +0000 (22:15 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Tue, 22 Feb 2005 22:15:44 +0000 (22:15 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@589 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-appserver/NGObjWeb/Associations/WOResourceURLAssociation.m
sope-appserver/NGObjWeb/ChangeLog
sope-appserver/NGObjWeb/DynamicElements/WOxHTMLElemBuilder.m
sope-appserver/NGObjWeb/NGObjWeb/WOxElemBuilder.h
sope-appserver/NGObjWeb/SoObjects/SoComponent.m
sope-appserver/NGObjWeb/Templates/WOxTagClassElemBuilder.m
sope-appserver/NGObjWeb/Version

index 81eee440e6df9b64129e193bcfd9480332d4d392..c2216da6fbf27dd04af2345c143934b791af54af 100644 (file)
@@ -100,9 +100,11 @@ static BOOL doDebug = NO;
   WORequest *rq;
   id url;
   
-  if (doDebug)
-    [self debugWithFormat:@"lookup resource: %@", [self resourceName]];
-
+  if (doDebug) {
+    [self debugWithFormat:@"lookup resource: %@ in component %@",
+         [self resourceName], _component];
+  }
+  
   if ((ctx = [_component context]) == nil)
     ctx = [[WOApplication application] context];
   rq    = [ctx request];
@@ -115,6 +117,9 @@ static BOOL doDebug = NO;
   
   if ((rm = [_component resourceManager]) == nil) {
     WOApplication *app;
+
+    if (doDebug)
+      [self logWithFormat:@"component has no own resource manager!"];
     
     if ((app = [ctx application]) == nil)
       app = [WOApplication application];
index 8aae22cf1cb039eed382c7e2bfac22e0a2e95d0a..5de3e360577cc1d33d68554ee346c7ab654d65eb 100644 (file)
@@ -1,3 +1,14 @@
+2005-02-22  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v4.5.119
+
+       * Templates/WOxTagClassElemBuilder.m: added some API to improve support
+         for subclassing
+
+       * DynamicElements/WOxHTMLElemBuilder.m: added <html:container> tag
+         which is suitable as a root tag for template, it only generates its
+         contents
+
 2005-02-17  Helge Hess  <helge.hess@opengroupware.org>
 
        * v4.5.118
index a9af77fa702fa18284555e89960960479d9f28ab..23acf87cb88eaecd9ec869f404d23345889f5b03 100644 (file)
@@ -51,6 +51,7 @@
     <iframe .../>     maps to WOIFrame
     <body .../>       maps to WOBody
     <entity .../>     maps to WOEntity
+    <container .../>  removes the tag and embeds the content
 */
 
 @interface WOxHTMLElemBuilder : WOxTagClassElemBuilder
 
 @end
 
+#include "WOCompoundElement.h"
 #include "common.h"
 #include <SaxObjC/XMLNamespaces.h>
 
 @implementation WOxHTMLElemBuilder
 
+static Class WOGenericContainerClass = Nil;
+static Class WOGenericElementClass   = Nil;
+
++ (void)initialize {
+  WOGenericContainerClass = NSClassFromString(@"WOGenericContainer");
+  WOGenericElementClass   = NSClassFromString(@"WOGenericElement");
+}
+
 - (Class)classForInputElement:(id<DOMElement>)_element {
   NSString *type;
   unsigned tl;
 }
 
 - (Class)classForElement:(id<DOMElement>)_element {
-  NSString *nsuri;
+  /* Note: namespace is checked in build-element */
   NSString *tag;
   unsigned tl;
+  unichar  c0;
 
-  if ((nsuri = [_element namespaceURI]) == nil)
-    return Nil;
-  
-  if (![nsuri isEqualToString:XMLNS_XHTML]) {
-    /* check HTML 4 namespace */
-    if (![nsuri isEqualToString:XMLNS_HTML40])
-      return Nil;
-  }
-  
   tag = [_element tagName];
   
   if ((tl = [tag length]) == 0)
     return Nil;
+  c0 = [tag characterAtIndex:0];
   
   switch (tl) {
     case 1:
-        if ([tag isEqualToString:@"a"]) {
-            if ([_element hasAttribute:@"name" namespaceURI:@"*"])
-              return NSClassFromString(@"WOGenericContainer");
-            
-            return NSClassFromString(@"WOHyperlink");
-        }
+      if (c0 == 'a') {
+       // TODO: improve this section
+       if ([_element hasAttribute:@"name" namespaceURI:@"*"])
+         return NSClassFromString(@"WOGenericContainer");
+       
+       return NSClassFromString(@"WOHyperlink");
+      }
       break;
 
     case 3:
-      if ([tag isEqualToString:@"img"])
+      if (c0 == 'i' && [tag isEqualToString:@"img"])
         return NSClassFromString(@"WOImage");
       break;
 
     case 4:
-      if ([tag isEqualToString:@"body"])
+      if (c0 == 'b' && [tag isEqualToString:@"body"])
         return NSClassFromString(@"WOBody");
-#if 0
-      if ([tag isEqualToString:@"html"])
+#if WRAP_HTML_ROOT_TAG
+      if (c0 == 'h' && [tag isEqualToString:@"html"])
         return NSClassFromString(@"WOHtml");
 #endif
-      if ([tag isEqualToString:@"form"])
+      if (c0 == 'f' && [tag isEqualToString:@"form"])
         return NSClassFromString(@"WOForm");
 
-      if ([tag isEqualToString:@"meta"]) {
+      if (c0 == 'm' && [tag isEqualToString:@"meta"]) {
        NSString *val;
        
         val = [_element attribute:@"http-equiv" namespaceURI:XMLNS_XHTML];
       break;
       
     case 5:
-      if ([tag isEqualToString:@"input"])
+      if (c0 == 'i' && [tag isEqualToString:@"input"])
         return [self classForInputElement:_element];
-      if ([tag isEqualToString:@"frame"])
+      if (c0 == 'f' && [tag isEqualToString:@"frame"])
         return NSClassFromString(@"WOFrame");
-      if ([tag isEqualToString:@"embed"])
+      if (c0 == 'e' && [tag isEqualToString:@"embed"])
         return NSClassFromString(@"WOEmbeddedObject");
       break;
-      
-    default:
-      if ([tag isEqualToString:@"textarea"])
-        return NSClassFromString(@"WOText");
-      if ([tag isEqualToString:@"iframe"])
+
+    case 6:
+      if (c0 == 'i' && [tag isEqualToString:@"iframe"])
         return NSClassFromString(@"WOIFrame");
-      
-      if ([tag isEqualToString:@"entity"])
+      if (c0 == 'e' && [tag isEqualToString:@"entity"])
         return NSClassFromString(@"WOEntity");
       break;
+
+    case 8:
+      if (c0 == 't' && [tag isEqualToString:@"textarea"])
+        return NSClassFromString(@"WOText");
+      break;
+  }
+  
+  return [_element hasChildNodes] 
+    ? WOGenericContainerClass
+    : WOGenericElementClass;
+}
+
+- (WOElement *)buildContainer:(id<DOMElement>)_element templateBuilder:(id)_b {
+  /*
+    this is a 'noop' tag, which only generates its children, useful
+    as a root tag for templates
+  */
+  NSArray *children;
+  unsigned count;
+  
+  children = [_element hasChildNodes]
+    ? [_b buildNodes:[_element childNodes] templateBuilder:_b]
+    : nil;
+
+  if ((count = [children count]) == 0)
+    return nil;
+  
+  if (count == 1)
+    return [[children objectAtIndex:0] retain];
+  
+  return [[WOCompoundElement allocForCount:count 
+                            zone:NULL] initWithContentElements:children];
+}
+
+- (WOElement *)buildElement:(id<DOMElement>)_element templateBuilder:(id)_b {
+  NSString *nsuri;
+
+  /* only build HTML namespace tags */
+  
+  if ((nsuri = [_element namespaceURI]) == nil)
+    return [self buildNextElement:_element templateBuilder:_b];
+  
+  if (![nsuri isEqualToString:XMLNS_XHTML]) {
+    /* check HTML 4 namespace */
+    if (![nsuri isEqualToString:XMLNS_HTML40])
+      return [self buildNextElement:_element templateBuilder:_b];
   }
+  
+  /* check for container tag (has not class ...) */
 
-  if ([_element hasChildNodes])
-    return NSClassFromString(@"WOGenericContainer");
-  else
-    return NSClassFromString(@"WOGenericElement");
+  if ([[_element tagName] isEqualToString:@"container"])
+    return [self buildContainer:_element templateBuilder:_b];
+  
+  /* call class based builder in superclass */
+  
+  return [super buildElement:_element templateBuilder:_b];
 }
 
 @end /* WOxHTMLElemBuilder */
index 6073fdf963cc542f488c677150e738301b445707..9c61f907b0049dea62fcad529cd606262264de8e 100644 (file)
 
 @interface WOxTagClassElemBuilder : WOxElemBuilder
 
+- (WOElement *)buildNextElement:(id<DOMElement>)_elem templateBuilder:(id)_b;
 - (Class)classForElement:(id<DOMElement>)_element;
 
 @end
index 933a14e55335a3f6295fb5b37625bc8da84e68f5..ce3b1f4dfe0fb0bbd040b026c2cacaaa6e3cb753 100644 (file)
@@ -76,7 +76,7 @@
   ASSIGN(self->soResourceManager, _rm);
 }
 - (WOResourceManager *)resourceManager {
-  if (self->soResourceManager)
+  if (self->soResourceManager != nil)
     return self->soResourceManager;
   
   self->soResourceManager = [[[self componentProduct] resourceManager] retain];
index a569a1c958a6efb493de6b889cb25925e6a6e8af..b3e33b1c871aaa92f03c55d7deb4152d3927bdbb 100644 (file)
   return Nil;
 }
 
+- (WOElement *)buildNextElement:(id<DOMElement>)_elem templateBuilder:(id)_b {
+  if (self->nextBuilder != nil)
+    return [self->nextBuilder buildElement:_elem templateBuilder:_b];
+  
+  [self logWithFormat:
+         @"did not find dynamic element class for DOM element %@", _elem];
+  return nil;
+}
+
 - (WOElement *)buildElement:(id<DOMElement>)_element templateBuilder:(id)_b {
   Class clazz;
   
-  if ((clazz = [self classForElement:_element]) == Nil) {
-    if (self->nextBuilder)
-      return [self->nextBuilder buildElement:_element templateBuilder:_b];
-    else {
-      [self logWithFormat:
-              @"did not find dynamic element class for DOM element %@",
-              _element];
-      return nil;
-    }
-  }
+  if ((clazz = [self classForElement:_element]) == Nil)
+    return [self buildNextElement:_element templateBuilder:_b];
+  
   return [[clazz alloc] initWithElement:_element templateBuilder:_b];
 }
 
index 78ac92e57b98bcbd971c51649d05d08a2351fc92..f34e1bd4166fbd622aaea824b1d9d22425472795 100644 (file)
@@ -1,6 +1,6 @@
 # version file
 
-SUBMINOR_VERSION:=118
+SUBMINOR_VERSION:=119
 
 # v4.5.91  requires libNGExtensions v4.5.134
 # v4.5.84  requires libNGExtensions v4.5.127