ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Iffy/Tag.cpp
Revision: 297
Committed: 2004-12-11T17:38:04-08:00 (20 years, 6 months ago) by douglas
File size: 1683 byte(s)
Log Message:
Probably also more Unicodely correctish, maybe.

File Contents

# User Rev Content
1 Douglas Thrift 276 // Iffy
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7     #include "Tag.hpp"
8     #include "Matcher.hpp"
9    
10 Douglas Thrift 280 Tag::Tag(const ext::String& segment) : type(OPEN)
11 Douglas Thrift 276 {
12     ext::Vector<ext::String> parts(segment.Split(' '));
13    
14 Douglas Thrift 280 _mforeach (ext::Vector<ext::String>, part, parts)
15 Douglas Thrift 276 {
16 douglas 289 if (part->IsEmpty()) continue;
17    
18 Douglas Thrift 280 if (part == parts.End() - 1 && part->Last() == '/')
19     {
20     type = STANDALONE;
21     *part = part->Substring(0, part->GetSize() - 1);
22     }
23    
24 Douglas Thrift 276 if (part == parts.Begin())
25     {
26     if (part->First() != '/')
27     {
28     name = lower(*part);
29     }
30     else
31     {
32     type = CLOSE;
33     name = lower(part->Substring(1));
34     }
35     }
36 Douglas Thrift 280
37     if (part != parts.Begin())
38 Douglas Thrift 276 {
39     Matcher matcher;
40     ext::String name;
41     ios::String value;
42    
43     if (*part == matcher("^(.*)=\"(.*)\"$"))
44     {
45     name = matcher[1];
46     value = matcher[2];
47     }
48     else if (*part == matcher("^(.*)=\"(.*)$"))
49     {
50     name = matcher[1];
51     value = matcher[2];
52    
53     while (++part != parts.End())
54     {
55 Douglas Thrift 280 if (part == parts.End() - 1 && *part == matcher("^(.*)\"/$"))
56 Douglas Thrift 276 {
57 Douglas Thrift 280 type = STANDALONE;
58    
59 Douglas Thrift 276 value << " " << matcher[1];
60    
61     break;
62     }
63 Douglas Thrift 280 else if (*part == matcher("^(.*)\"$"))
64     {
65     value << " " << matcher[1];
66    
67     break;
68     }
69 Douglas Thrift 276 else value << " " << *part;
70     }
71    
72     if (part == parts.End()) --part;
73     }
74     else if (*part == matcher("^(.*)=(.*)$"))
75     {
76     name = matcher[1];
77     value = matcher[2];
78     }
79    
80 Douglas Thrift 280 if (!name.IsEmpty()) attributes << " " << lower(name) << "=\"" << value << "\"";
81 Douglas Thrift 276 }
82     }
83     }
84    
85     ext::String Tag::lower(const ext::String& string)
86     {
87     ext::String lower;
88    
89 douglas 297 _foreach (ext::String, atom, string) lower.InsertLast(*atom >= 'A' && *atom <= 'Z' ? ext::CodePoint(*atom + 32) : *atom);
90 Douglas Thrift 276
91     return lower;
92     }

Properties

Name Value
svn:eol-style native
svn:keywords Id