1 /* CardVersitRenderer.m - this file is part of SOPE
3 * Copyright (C) 2006 Inverse groupe conseil
5 * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
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)
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.
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.
23 #import <Foundation/NSArray.h>
24 #import <Foundation/NSDictionary.h>
25 #import <Foundation/NSString.h>
27 #import <NGExtensions/NSObject+Logs.h>
29 #import "CardElement.h"
32 #import "NSString+NGCards.h"
33 #import "NSArray+NGCards.h"
35 #import "CardVersitRenderer.h"
37 @interface CardVersitRenderer (PrivateAPI)
39 - (NSString *) renderElement: (CardElement *) anElement;
40 - (NSString *) renderGroup: (CardGroup *) aGroup;
44 @implementation CardVersitRenderer
46 - (NSString *) render: (id) anElement
48 return (([anElement isKindOfClass: [CardGroup class]])
49 ? [self renderGroup: anElement]
50 : [self renderElement: anElement]);
53 - (NSString *) renderElement: (CardElement *) anElement
55 NSMutableString *rendering;
56 NSDictionary *attributes;
58 NSArray *values, *renderedAttrs;
59 NSString *key, *finalRendering, *tag;
61 if (![anElement isVoid])
63 rendering = [NSMutableString new];
64 if ([anElement group])
65 [rendering appendFormat: @"%@.", [anElement group]];
66 tag = [anElement tag];
67 if (!(tag && [tag length]))
70 [self warnWithFormat: @"card element of class '%@' has an empty tag",
71 NSStringFromClass([anElement class])];
74 [rendering appendString: [tag uppercaseString]];
75 attributes = [anElement attributes];
76 keys = [[attributes allKeys] objectEnumerator];
77 key = [keys nextObject];
80 renderedAttrs = [[attributes objectForKey: key] renderedForCards];
81 [rendering appendFormat: @";%@=%@",
82 [key uppercaseString],
83 [renderedAttrs componentsJoinedByString: @","]];
84 key = [keys nextObject];
87 values = [anElement values];
88 if ([values count] > 0)
89 [rendering appendFormat: @":%@",
90 [[values renderedForCards] componentsJoinedByString: @";"]];
92 if ([rendering length] > 0)
93 [rendering appendString: @"\r\n"];
95 finalRendering = [rendering foldedForVersitCards];
101 return finalRendering;
104 - (NSString *) renderGroup: (CardGroup *) aGroup
106 NSEnumerator *children;
107 CardElement *currentChild;
108 NSMutableString *rendering;
111 rendering = [NSMutableString new];
112 [rendering autorelease];
114 groupTag = [aGroup tag];
115 if (!(groupTag && [groupTag length]))
117 groupTag = @"<no-tag>";
118 [self warnWithFormat: @"card group of class '%@' has an empty tag",
119 NSStringFromClass([aGroup class])];
122 groupTag = [groupTag uppercaseString];
123 [rendering appendFormat: @"BEGIN:%@\r\n", groupTag];
124 children = [[aGroup children] objectEnumerator];
125 currentChild = [children nextObject];
128 [rendering appendString: [self render: currentChild]];
129 currentChild = [children nextObject];
131 [rendering appendFormat: @"END:%@\r\n", groupTag];