]> err.no Git - scalable-opengroupware.org/blob - SOPE/NGCards/CardVersitRenderer.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1205 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / SOPE / NGCards / CardVersitRenderer.m
1 /* CardVersitRenderer.m - this file is part of SOPE
2  *
3  * Copyright (C) 2006 Inverse groupe conseil
4  *
5  * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
6  *
7  * This file is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This file is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #import <Foundation/NSArray.h>
24 #import <Foundation/NSDictionary.h>
25 #import <Foundation/NSString.h>
26
27 #import <NGExtensions/NSObject+Logs.h>
28
29 #import "CardElement.h"
30 #import "CardGroup.h"
31
32 #import "NSString+NGCards.h"
33 #import "NSArray+NGCards.h"
34
35 #import "CardVersitRenderer.h"
36
37 @interface CardVersitRenderer (PrivateAPI)
38
39 - (NSString *) renderElement: (CardElement *) anElement;
40 - (NSString *) renderGroup: (CardGroup *) aGroup;
41
42 @end
43
44 @implementation CardVersitRenderer
45
46 - (NSString *) render: (id) anElement
47 {
48   return (([anElement isKindOfClass: [CardGroup class]])
49           ? [self renderGroup: anElement]
50           : [self renderElement: anElement]);
51 }
52
53 - (NSString *) renderElement: (CardElement *) anElement
54 {
55   NSMutableString *rendering;
56   NSDictionary *attributes;
57   NSEnumerator *keys;
58   NSArray *values, *renderedAttrs;
59   NSString *key, *finalRendering, *tag;
60
61   if (![anElement isVoid])
62     {
63       rendering = [NSMutableString new];
64       if ([anElement group])
65         [rendering appendFormat: @"%@.", [anElement group]];
66       tag = [anElement tag];
67       if (!(tag && [tag length]))
68         {
69           tag = @"<no-tag>";
70           [self warnWithFormat: @"card element of class '%@' has an empty tag",
71                 NSStringFromClass([anElement class])];
72         }
73
74       [rendering appendString: [tag uppercaseString]];
75       attributes = [anElement attributes];
76       keys = [[attributes allKeys] objectEnumerator];
77       key = [keys nextObject];
78       while (key)
79         {
80           renderedAttrs = [[attributes objectForKey: key] renderedForCards];
81           [rendering appendFormat: @";%@=%@",
82                      [key uppercaseString],
83                      [renderedAttrs componentsJoinedByString: @","]];
84           key = [keys nextObject];
85         }
86
87       values = [anElement values];
88       if ([values count] > 0)
89         [rendering appendFormat: @":%@",
90                    [[values renderedForCards] componentsJoinedByString: @";"]];
91
92       if ([rendering length] > 0)
93         [rendering appendString: @"\r\n"];
94
95       finalRendering = [rendering foldedForVersitCards];
96       [rendering release];
97     }
98   else
99     finalRendering = @"";
100
101   return finalRendering;
102 }
103
104 - (NSString *) renderGroup: (CardGroup *) aGroup
105 {
106   NSEnumerator *children;
107   CardElement *currentChild;
108   NSMutableString *rendering;
109   NSString *groupTag;
110
111   rendering = [NSMutableString new];
112   [rendering autorelease];
113
114   groupTag = [aGroup tag];
115   if (!(groupTag && [groupTag length]))
116     {
117       groupTag = @"<no-tag>";
118       [self warnWithFormat: @"card group of class '%@' has an empty tag",
119             NSStringFromClass([aGroup class])];
120     }
121
122   groupTag = [groupTag uppercaseString];
123   [rendering appendFormat: @"BEGIN:%@\r\n", groupTag];
124   children = [[aGroup children] objectEnumerator];
125   currentChild = [children nextObject];
126   while (currentChild)
127     {
128       [rendering appendString: [self render: currentChild]];
129       currentChild = [children nextObject];
130     }
131   [rendering appendFormat: @"END:%@\r\n", groupTag];
132
133   return rendering;
134 }
135
136 @end