zenweb 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +426 -0
  3. data/Manifest.txt +54 -0
  4. data/README.txt +63 -0
  5. data/Rakefile +22 -0
  6. data/bin/zenweb +27 -0
  7. data/bin/zenwebpage +66 -0
  8. data/bin/zenwebsite +39 -0
  9. data/design/REQUIREMENTS.txt +52 -0
  10. data/design/ZENWEB_2.txt +69 -0
  11. data/design/heirarchy.png +0 -0
  12. data/design/heirarchy.tgif +311 -0
  13. data/docs/Customizing +76 -0
  14. data/docs/FAQ +12 -0
  15. data/docs/Features +128 -0
  16. data/docs/Presentation +88 -0
  17. data/docs/QuickStart +32 -0
  18. data/docs/Renderers +85 -0
  19. data/docs/SiteMap +13 -0
  20. data/docs/YourOwnWebsite +32 -0
  21. data/docs/index +14 -0
  22. data/docs/metadata.txt +10 -0
  23. data/lib/ZenWeb.rb +850 -0
  24. data/lib/ZenWeb/CalendarRenderer.rb +162 -0
  25. data/lib/ZenWeb/CompactRenderer.rb +45 -0
  26. data/lib/ZenWeb/CompositeRenderer.rb +63 -0
  27. data/lib/ZenWeb/FileAttachmentRenderer.rb +57 -0
  28. data/lib/ZenWeb/FooterRenderer.rb +38 -0
  29. data/lib/ZenWeb/GenericRenderer.rb +143 -0
  30. data/lib/ZenWeb/HeaderRenderer.rb +52 -0
  31. data/lib/ZenWeb/HtmlRenderer.rb +81 -0
  32. data/lib/ZenWeb/HtmlTableRenderer.rb +94 -0
  33. data/lib/ZenWeb/HtmlTemplateRenderer.rb +173 -0
  34. data/lib/ZenWeb/MetadataRenderer.rb +83 -0
  35. data/lib/ZenWeb/RelativeRenderer.rb +98 -0
  36. data/lib/ZenWeb/RubyCodeRenderer.rb +56 -0
  37. data/lib/ZenWeb/SitemapRenderer.rb +56 -0
  38. data/lib/ZenWeb/StandardRenderer.rb +40 -0
  39. data/lib/ZenWeb/StupidRenderer.rb +88 -0
  40. data/lib/ZenWeb/SubpageRenderer.rb +45 -0
  41. data/lib/ZenWeb/TextToHtmlRenderer.rb +219 -0
  42. data/lib/ZenWeb/TocRenderer.rb +61 -0
  43. data/lib/ZenWeb/XXXRenderer.rb +32 -0
  44. data/test/SiteMap +14 -0
  45. data/test/Something +4 -0
  46. data/test/include.txt +3 -0
  47. data/test/index +8 -0
  48. data/test/metadata.txt +10 -0
  49. data/test/ryand/SiteMap +10 -0
  50. data/test/ryand/blah +4 -0
  51. data/test/ryand/blah-blah +4 -0
  52. data/test/ryand/index +52 -0
  53. data/test/ryand/metadata.txt +2 -0
  54. data/test/ryand/stuff/index +4 -0
  55. data/test/test_zenweb.rb +1624 -0
  56. metadata +161 -0
  57. metadata.gz.sig +0 -0
@@ -0,0 +1,63 @@
1
+ = ZenWeb
2
+
3
+ * http://rubyforge.org/projects/zenweb/
4
+
5
+ == DESCRIPTION:
6
+
7
+ ZenWeb is a set of classes/tools for organizing and formating a
8
+ website. It is website oriented rather than webpage oriented, unlike
9
+ most rendering tools. It is content oriented, rather than style
10
+ oriented, unlike most rendering tools. It provides a plugin system of
11
+ renderers and filters to provide a very flexible, and powerful system.
12
+
13
+ Documentation is available in the docs directory, and can be generated
14
+ into html (in docshtml) simply by running make. See QuickStart and
15
+ YourOwnWebsite for setup and starting to build a website.
16
+
17
+ (EXPERIMENTAL) If you are running apache, you might try 'make apache'
18
+ which will run a private version of apache that points to the
19
+ generated documenation. Point your browser to port 8080 of localhost
20
+ or whatever machine you are running on.
21
+
22
+ == FEATURES:
23
+
24
+ * SiteMap oriented for a comprehensive website.
25
+ * Generic architecture w/ a set of plugins to extend any page or directory.
26
+ * Incremental page builds for very fast generation.
27
+ * Simple text-to-html markup makes creating large websites easy.
28
+ * ZenTest 1.0 compliant. http://sf.net/projects/zentest/
29
+ * Much much more... I should probably add that here, huh?
30
+
31
+ == REQUIREMENTS:
32
+
33
+ * Ruby - 1.6.5-7 and 1.7.2 have been tested.
34
+ * Test::Unit testing framework via RAA on http://www.ruby-lang.org/.
35
+
36
+ == INSTALL:
37
+
38
+ * make test && sudo make install
39
+
40
+ == LICENSE:
41
+
42
+ (The MIT License)
43
+
44
+ Copyright (c) 2001-2009 Ryan Davis, Zen Spider Software
45
+
46
+ Permission is hereby granted, free of charge, to any person obtaining
47
+ a copy of this software and associated documentation files (the
48
+ "Software"), to deal in the Software without restriction, including
49
+ without limitation the rights to use, copy, modify, merge, publish,
50
+ distribute, sublicense, and/or sell copies of the Software, and to
51
+ permit persons to whom the Software is furnished to do so, subject to
52
+ the following conditions:
53
+
54
+ The above copyright notice and this permission notice shall be
55
+ included in all copies or substantial portions of the Software.
56
+
57
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
58
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
59
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
60
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
61
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
62
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
63
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,22 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.plugin :seattlerb
7
+
8
+ Hoe.spec 'zenweb' do
9
+ developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
10
+
11
+ clean_globs.push(*"testhtml docshtml httpd.conf httpd.pid *.log".split)
12
+ end
13
+
14
+ task :docs do
15
+ ruby "-w -Ilib bin/zenweb docs"
16
+ end
17
+
18
+ # TODO:
19
+ # apache: docs
20
+ # grep -v CustomLog $$(httpd -V | grep SERVER_CONFIG_FILE | cut -f 2 -d= | cut -f 2 -d\") > httpd.conf; httpd -X -d $$PWD/docshtml -f $$PWD/httpd.conf -c "PidFile $$PWD/httpd.pid" -c "Port 8080" -c "ErrorLog $$PWD/error.log" -c "TransferLog $$PWD/access.log" -c "DocumentRoot $$PWD/docshtml"
21
+
22
+ # vim: syntax=ruby
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'ZenWeb'
5
+
6
+ puts ZenWebsite.banner() unless $TESTING
7
+
8
+ if (ARGV.size == 2) then
9
+ path = ARGV.shift
10
+ url = ARGV.shift
11
+ elsif (ARGV.size == 1) then
12
+ path = ARGV.shift || raise(ArgumentError, "Need a sitemap path to load.")
13
+ url = "/SiteMap.html"
14
+ else
15
+ raise(ArgumentError, "Usage: #{$0} datadir [sitemapurl]")
16
+ end
17
+
18
+ if path == "data" then
19
+ dest = "html"
20
+ else
21
+ dest = path + "html"
22
+ end
23
+
24
+ dirty = test ?d, dest
25
+
26
+ ZenWebsite.new(url, path, dest).renderSite
27
+ Metadata.displayBadMetadata unless dirty
@@ -0,0 +1,66 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ def usage
4
+ puts "#{$0} filepath [title [subtitle]]"
5
+ exit 1
6
+ end
7
+
8
+ path = ARGV.shift || usage()
9
+ title = ARGV.shift || 'Title'
10
+ subtitle = ARGV.shift || 'Subtitle'
11
+
12
+ filename = File.basename(path)
13
+
14
+ puts "Creating #{filename}"
15
+
16
+ file = File.new(path, "w")
17
+
18
+ if filename == 'metadata.txt' then
19
+ file.puts "'renderers' = [ 'StandardRenderer' ]"
20
+ elsif filename == 'Makefile' then
21
+ file.puts "# use this to override"
22
+ file.puts "RUBYPATH="
23
+ file.puts "DEBUG="
24
+ file.puts "ZENWEB=/usr/local/bin/zenweb"
25
+ file.puts "INSTALLDIR=/usr/local/www"
26
+ file.puts ""
27
+ file.puts "all: html"
28
+ file.puts ""
29
+ file.puts "html:"
30
+ file.puts " RUBYPATH=$(RUBYPATH) ruby $(DEBUG) $(ZENWEB) data"
31
+ file.puts ""
32
+ file.puts "realclean: clean"
33
+ file.puts " -rm -rf html"
34
+ file.puts ""
35
+ file.puts "clean:"
36
+ file.puts " rm -rf httpd.conf httpd.pid error.log access.log"
37
+ file.puts " -find . -name \*~ -exec rm {} \\;"
38
+ file.puts " -find data -name \*.html -print0 | xargs -0 rm -f"
39
+ file.puts ""
40
+ file.puts "apache: all"
41
+ file.puts %q% grep -v CustomLog $$(httpd -V | grep SERVER_CONFIG_FILE | cut -f 2 -d= | cut -f 2 -d\") > httpd.conf; httpd -X -d $$PWD/html -f $$PWD/httpd.conf -c "PidFile $$PWD/httpd.pid" -c "Port 8080" -c "ErrorLog $$PWD/error.log" -c "TransferLog $$PWD/access.log" -c "DocumentRoot $$PWD/html"%
42
+ file.puts ""
43
+ file.puts "copy:"
44
+ file.puts " rsync -r html/ $(INSTALLDIR)"
45
+ file.puts ""
46
+ file.puts ".PHONY: all html clean copy"
47
+ else
48
+ file.puts "# 'title' = '#{title}'"
49
+ file.puts "# 'subtitle' = '#{subtitle}'"
50
+ file.puts "# 'keywords' = 'Keywords used by search engines.'"
51
+ file.puts "# 'description' = 'Basic desc for search engines.'"
52
+
53
+ if filename == 'SiteMap' then
54
+ file.puts "# 'renderers' = [ 'SitemapRenderer', 'StandardRenderer' ]"
55
+ file.puts ""
56
+ file.puts "/index.html"
57
+ file.puts "/SiteMap.html"
58
+ else
59
+ file.puts ""
60
+ file.puts "** Section Header"
61
+ file.puts ""
62
+ file.puts "TO" + "DO: write this page" # to avoid my source TAG scanner
63
+ end
64
+ end
65
+
66
+ file.close
@@ -0,0 +1,39 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ def usage
4
+ puts "#{$0} dir"
5
+ exit 1
6
+ end
7
+
8
+ def error(msg)
9
+ $stderr.puts(msg)
10
+ exit 1
11
+ end
12
+
13
+ base = File.expand_path(File.dirname($0))
14
+ path = ARGV.shift || usage()
15
+
16
+ cmd = "#{base}/ZenWebpage.rb"
17
+ unless test ?f, cmd then
18
+ puts "Can't find ZenWebpage.rb in #{base}, falling back to PATH"
19
+ cmd = "ZenWebpage.rb"
20
+ end
21
+
22
+ puts "Using #{cmd} to create files"
23
+ puts "Creating directory #{File.basename(path)}"
24
+
25
+ Dir.mkdir(path)
26
+ Dir.chdir(path)
27
+
28
+ system("#{base}/ZenWebpage.rb Makefile") or error("Failed: #{$?}")
29
+
30
+ Dir.mkdir("data")
31
+ Dir.chdir("data")
32
+
33
+ system("#{base}/ZenWebpage.rb SiteMap SiteMap") or error("Failed: #{$?}")
34
+ system("#{base}/ZenWebpage.rb metadata.txt") or error("Failed: #{$?}")
35
+ system("#{base}/ZenWebpage.rb index Welcome") or error("Failed: #{$?}")
36
+
37
+ Dir.chdir("..")
38
+
39
+ system("make") or error("Failed: #{$?}")
@@ -0,0 +1,52 @@
1
+ Requirements Document, Version 1.0.1,
2
+ Created: 2001-01-17
3
+ Modified: 2001-01-17
4
+
5
+ + Must provide a generic architecture for generating a website from a
6
+ file called a sitemap, and a directory of files that provide the
7
+ content.
8
+
9
+ + The sitemap consists of a list of urls and metadata.
10
+
11
+ + The urls in the sitemap correspond to the files in the content
12
+ directory.
13
+
14
+ + The urls in the sitemap will also have an optional pagetype, which
15
+ will dictate what will generate the page, and correspondingly, what
16
+ the page will look like.
17
+
18
+ + Another file, named Metadata.txt, contains metadata of it's own that
19
+ is scoped to all files in the directory and below. This file may exist
20
+ in any directory and will overlay the metadata defined in files in any
21
+ parent directories.
22
+
23
+ + A simple, default, markup scheme will be defined and will determine
24
+ the overall structure of the page.
25
+
26
+ + Embedded ruby should be evaluated and the result should be emitted
27
+ into the resulting content.
28
+
29
+ + Scope of Metadata:
30
+
31
+ { Sitemap { Metadata.txt { Metadata.txt* { File }}}}
32
+
33
+ + General Structure:
34
+
35
+ data/
36
+ SiteMap [ urls, pagetypes, metadata ]
37
+ other content files
38
+ Metadata.txt
39
+ subdir/
40
+ other content files
41
+ Metadata.txt
42
+
43
+ + General Algorithm:
44
+
45
+ 1) Open Sitemap:
46
+ 1) Read all urls:
47
+ 1) Find page corresponding to url.
48
+ 2) Open file.
49
+ 3) Parse file, extracting metadata and content.
50
+ 4) Based on current metadata, instantiate the correct type of page.
51
+ 2) Generate a makefile OR dependency map.
52
+ 3) Run make OR iterate over each page instance and IF it should be generated, generate it.
@@ -0,0 +1,69 @@
1
+ # -*- outline -*-
2
+
3
+ * ZenWeb 2.0 Planning:
4
+
5
+ ** Requirements:
6
+
7
+ *** Major
8
+
9
+ These items are needed for betatesting.
10
+
11
+ **** Sitemap
12
+
13
+ Reads simple sitemap description file, from there generates website.
14
+
15
+ Urls in sitemap must map to filesystem.
16
+
17
+ Must deal with ~username urls correctly.
18
+
19
+ Sitemap must give each document the knowedge of it's relatives (parent, children, siblings)
20
+
21
+ **** Flexible metadata system
22
+
23
+ Metadata must be available per directory, each child overlaying the parents.
24
+
25
+ Metadata must be available per file, overlaying the directory.
26
+
27
+ Metadata must be flexible, allowing for basically anything to be a value.
28
+
29
+ Metadata will drive most of the process.
30
+
31
+ **** Rendering Engine(s)
32
+
33
+ System must allow for multiple rendering engines to be applied to any given datafile.
34
+
35
+ Engines are specified by metadata.
36
+
37
+ Example engines must be supplied:
38
+ Raw
39
+ text2html
40
+ embedded ruby
41
+ header/footer.
42
+
43
+ *** Minor
44
+
45
+ These items are not needed for betatesting, but should be implemented
46
+ for final shipment.
47
+
48
+ **** Differential Rendering
49
+
50
+ Whatever generates the HTML should know about the structure and
51
+ generate the minimum set necessary. This includes building parents,
52
+ children, and immediate siblings ONLY when we actually need them
53
+ built.
54
+
55
+ Important relationships should be specified by metadata.
56
+
57
+ **** Tools
58
+
59
+ System could use sitemap and metadata to simply generate a makefile
60
+ and execute it.
61
+
62
+ Tool to find files not in sitemap.
63
+
64
+ Tool to find files in sitemap, but not on filesystem. Generate
65
+ template for quick prototyping of website.
66
+
67
+ **** Extras
68
+
69
+ Possibly design for live execution in server.
Binary file
@@ -0,0 +1,311 @@
1
+ %TGIF 4.1.41
2
+ state(0,37,100.000,0,0,0,16,1,9,2,2,0,0,1,0,1,1,'Courier',0,57600,0,0,0,10,0,0,1,1,0,16,0,0,1,1,1,1,1088,1408,0,0,2880,0).
3
+ %
4
+ % @(#)$Header$
5
+ % %W%
6
+ %
7
+ unit("1 pixel/pixel").
8
+ color_info(13,65535,0,[
9
+ "magenta", 65535, 0, 65535, 65535, 0, 65535, 1,
10
+ "red", 65535, 0, 0, 65535, 0, 0, 1,
11
+ "green", 0, 65535, 0, 0, 65535, 0, 1,
12
+ "blue", 0, 0, 65535, 0, 0, 65535, 1,
13
+ "yellow", 65535, 65535, 0, 65535, 65535, 0, 1,
14
+ "pink", 65535, 49931, 53052, 65535, 49344, 52171, 1,
15
+ "cyan", 0, 65535, 65535, 0, 65535, 65535, 1,
16
+ "CadetBlue", 22885, 40569, 42649, 24415, 40606, 41120, 1,
17
+ "white", 65535, 65535, 65535, 65535, 65535, 65535, 1,
18
+ "black", 0, 0, 0, 0, 0, 0, 1,
19
+ "DarkSlateGray", 10402, 19764, 18724, 12079, 20303, 20303, 1,
20
+ "#0000ff", 0, 0, 65535, 0, 0, 65280, 1,
21
+ "#ff00ff", 65535, 0, 65535, 65280, 0, 65280, 1
22
+ ]).
23
+ script_frac("0.6").
24
+ fg_bg_colors('black','white').
25
+ dont_reencode("FFDingbests:ZapfDingbats").
26
+ page(1,"",1,'').
27
+ group([
28
+ box('black','',32,32,544,352,2,1,1,161,0,0,0,0,0,'1',0,[
29
+ ]),
30
+ group([
31
+ box('black','',304,144,400,176,2,1,1,0,0,0,0,0,0,'1',0,[
32
+ ]),
33
+ text('black',352,153,1,1,1,56,14,1,11,3,2,0,0,0,2,56,14,0,0,"",0,0,0,0,164,'',[
34
+ minilines(56,14,0,0,1,0,0,[
35
+ mini_line(56,11,3,0,0,0,[
36
+ str_block(0,56,11,3,0,0,0,0,0,[
37
+ str_seg('black','Courier',0,69120,56,11,3,0,0,0,0,0,0,0,
38
+ "Metadata")])
39
+ ])
40
+ ])])
41
+ ],
42
+ 6,0,0,[
43
+ ]),
44
+ group([
45
+ box('black','',432,48,528,80,2,1,1,11,0,0,0,0,0,'1',0,[
46
+ ]),
47
+ text('black',480,59,1,1,1,90,11,12,9,2,2,0,0,0,2,90,11,0,0,"",0,0,0,0,68,'',[
48
+ minilines(90,11,0,0,1,0,0,[
49
+ mini_line(90,9,2,0,0,0,[
50
+ str_block(0,90,9,2,0,0,0,0,0,[
51
+ str_seg('black','Courier',0,57600,90,9,2,0,0,0,0,0,0,0,
52
+ "GenericRenderer")])
53
+ ])
54
+ ])])
55
+ ],
56
+ 10,0,0,[
57
+ ]),
58
+ group([
59
+ box('black','',176,48,272,80,2,1,1,14,0,0,0,0,0,'1',0,[
60
+ ]),
61
+ text('black',224,57,1,1,1,77,14,15,11,3,2,0,0,0,2,77,14,0,0,"",0,0,0,0,68,'',[
62
+ minilines(77,14,0,0,1,0,0,[
63
+ mini_line(77,11,3,0,0,0,[
64
+ str_block(0,77,11,3,0,0,0,0,0,[
65
+ str_seg('black','Courier',0,69120,77,11,3,0,0,0,0,0,0,0,
66
+ "ZenDocument")])
67
+ ])
68
+ ])])
69
+ ],
70
+ 13,0,0,[
71
+ ]),
72
+ group([
73
+ box('black','',176,144,272,176,2,1,1,17,0,0,0,0,0,'1',0,[
74
+ ]),
75
+ text('black',224,153,1,1,1,70,14,18,11,3,2,0,0,0,2,70,14,0,0,"",0,0,0,0,164,'',[
76
+ minilines(70,14,0,0,1,0,0,[
77
+ mini_line(70,11,3,0,0,0,[
78
+ str_block(0,70,11,3,0,-1,0,0,0,[
79
+ str_seg('black','Courier',0,69120,70,11,3,0,-1,0,0,0,0,0,
80
+ "ZenSitemap")])
81
+ ])
82
+ ])])
83
+ ],
84
+ 16,0,0,[
85
+ ]),
86
+ group([
87
+ box('black','',48,48,144,80,2,1,1,20,0,0,0,0,0,'1',0,[
88
+ ]),
89
+ text('black',96,57,1,1,1,70,14,21,11,3,2,0,0,0,2,70,14,0,0,"",0,0,0,0,68,'',[
90
+ minilines(70,14,0,0,1,0,0,[
91
+ mini_line(70,11,3,0,0,0,[
92
+ str_block(0,70,11,3,0,-1,0,0,0,[
93
+ str_seg('black','Courier',0,69120,70,11,3,0,-1,0,0,0,0,0,
94
+ "ZenWebsite")])
95
+ ])
96
+ ])])
97
+ ],
98
+ 19,0,0,[
99
+ ]),
100
+ poly('black','',2,[
101
+ 224,144,224,80],1,1,1,31,0,2,0,0,0,0,0,'1',0,0,
102
+ "0","",[
103
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
104
+ ]),
105
+ group([
106
+ box('black','',304,48,400,80,2,1,1,40,0,0,0,0,0,'1',0,[
107
+ ]),
108
+ text('black',352,57,1,1,1,28,14,41,11,3,2,0,0,0,2,28,14,0,0,"",0,0,0,0,68,'',[
109
+ minilines(28,14,0,0,1,0,0,[
110
+ mini_line(28,11,3,0,0,0,[
111
+ str_block(0,28,11,3,0,0,0,0,0,[
112
+ str_seg('black','Courier',0,69120,28,11,3,0,0,0,0,0,0,0,
113
+ "Hash")])
114
+ ])
115
+ ])])
116
+ ],
117
+ 39,0,0,[
118
+ ]),
119
+ poly('black','',2,[
120
+ 352,144,352,80],1,1,1,56,0,2,0,0,0,0,0,'1',0,0,
121
+ "0","",[
122
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
123
+ ]),
124
+ group([
125
+ box('black','',432,144,528,176,2,1,1,59,0,0,0,0,0,'1',0,[
126
+ ]),
127
+ text('black',480,155,1,1,1,18,11,60,9,2,2,0,0,0,2,18,11,0,0,"",0,0,0,0,164,'',[
128
+ minilines(18,11,0,0,1,0,0,[
129
+ mini_line(18,9,2,0,0,0,[
130
+ str_block(0,18,9,2,0,-3,0,0,0,[
131
+ str_seg('black','Courier',0,57600,18,9,2,0,-3,0,0,0,0,0,
132
+ "...")])
133
+ ])
134
+ ])])
135
+ ],
136
+ 58,0,0,[
137
+ ]),
138
+ poly('black','',2,[
139
+ 480,144,480,80],1,1,1,66,0,2,0,0,0,0,0,'1',0,0,
140
+ "0","",[
141
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
142
+ ]),
143
+ poly('black','',2,[
144
+ 496,144,480,80],1,1,1,68,0,2,0,0,0,0,0,'1',0,0,
145
+ "0","",[
146
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
147
+ ]),
148
+ poly('black','',2,[
149
+ 464,144,480,80],1,1,1,69,0,2,0,0,0,0,0,'1',0,0,
150
+ "0","",[
151
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
152
+ ]),
153
+ group([
154
+ box('black','',400,304,496,336,2,1,1,73,0,0,0,0,0,'1',0,[
155
+ ]),
156
+ text('black',448,313,1,1,1,56,14,74,11,3,2,0,0,0,2,56,14,0,0,"",0,0,0,0,324,'',[
157
+ minilines(56,14,0,0,1,0,0,[
158
+ mini_line(56,11,3,0,0,0,[
159
+ str_block(0,56,11,3,0,0,0,0,0,[
160
+ str_seg('black','Courier',0,69120,56,11,3,0,0,0,0,0,0,0,
161
+ "Metadata")])
162
+ ])
163
+ ])])
164
+ ],
165
+ 72,0,0,[
166
+ ]),
167
+ group([
168
+ box('black','',80,304,176,336,2,1,1,76,0,0,0,0,0,'1',0,[
169
+ ]),
170
+ text('black',128,315,1,1,1,90,11,77,9,2,2,0,0,0,2,90,11,0,0,"",0,0,0,0,324,'',[
171
+ minilines(90,11,0,0,1,0,0,[
172
+ mini_line(90,9,2,0,0,0,[
173
+ str_block(0,90,9,2,0,0,0,0,0,[
174
+ str_seg('black','Courier',0,57600,90,9,2,0,0,0,0,0,0,0,
175
+ "GenericRenderer")])
176
+ ])
177
+ ])])
178
+ ],
179
+ 75,0,0,[
180
+ ]),
181
+ group([
182
+ box('black','',240,304,336,336,2,1,1,79,0,0,0,0,0,'1',0,[
183
+ ]),
184
+ text('black',288,313,1,1,1,77,14,80,11,3,2,0,0,0,2,77,14,0,0,"",0,0,0,0,324,'',[
185
+ minilines(77,14,0,0,1,0,0,[
186
+ mini_line(77,11,3,0,0,0,[
187
+ str_block(0,77,11,3,0,0,0,0,0,[
188
+ str_seg('black','Courier',0,69120,77,11,3,0,0,0,0,0,0,0,
189
+ "ZenDocument")])
190
+ ])
191
+ ])])
192
+ ],
193
+ 78,0,0,[
194
+ ]),
195
+ group([
196
+ box('black','',240,208,336,240,2,1,1,82,0,0,0,0,0,'1',0,[
197
+ ]),
198
+ text('black',288,217,1,1,1,70,14,83,11,3,2,0,0,0,2,70,14,0,0,"",0,0,0,0,228,'',[
199
+ minilines(70,14,0,0,1,0,0,[
200
+ mini_line(70,11,3,0,0,0,[
201
+ str_block(0,70,11,3,0,-1,0,0,0,[
202
+ str_seg('black','Courier',0,69120,70,11,3,0,-1,0,0,0,0,0,
203
+ "ZenSitemap")])
204
+ ])
205
+ ])])
206
+ ],
207
+ 81,0,0,[
208
+ ]),
209
+ group([
210
+ box('black','',80,208,176,240,2,1,1,85,0,0,0,0,0,'1',0,[
211
+ ]),
212
+ text('black',128,217,1,1,1,70,14,86,11,3,2,0,0,0,2,70,14,0,0,"",0,0,0,0,228,'',[
213
+ minilines(70,14,0,0,1,0,0,[
214
+ mini_line(70,11,3,0,0,0,[
215
+ str_block(0,70,11,3,0,-1,0,0,0,[
216
+ str_seg('black','Courier',0,69120,70,11,3,0,-1,0,0,0,0,0,
217
+ "ZenWebsite")])
218
+ ])
219
+ ])])
220
+ ],
221
+ 84,0,0,[
222
+ ]),
223
+ poly('black','',2,[
224
+ 288,304,288,240],2,1,1,87,0,2,0,0,0,0,0,'1',0,0,
225
+ "0","",[
226
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
227
+ ]),
228
+ poly('black','',2,[
229
+ 32,192,544,192],0,3,1,98,0,2,0,0,0,0,0,'3',0,0,
230
+ "0","",[
231
+ 0,12,5,0,'12','5','0'],[0,12,5,0,'12','5','0'],[
232
+ ]),
233
+ poly('black','',2,[
234
+ 176,224,240,224],1,1,1,137,0,2,0,0,0,0,0,'1',0,0,
235
+ "0","",[
236
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
237
+ ]),
238
+ text('black',207,232,1,1,1,30,11,142,9,2,2,0,0,0,2,30,11,0,0,"",0,0,0,0,241,'',[
239
+ minilines(30,11,0,0,1,0,0,[
240
+ mini_line(30,9,2,0,0,0,[
241
+ str_block(0,30,9,2,0,0,0,0,0,[
242
+ str_seg('black','Courier',0,57600,30,9,2,0,0,0,0,0,0,0,
243
+ "has-a")])
244
+ ])
245
+ ])]),
246
+ text('black',319,264,1,1,1,48,11,151,9,2,2,0,0,0,2,48,11,0,0,"",0,0,0,0,273,'',[
247
+ minilines(48,11,0,0,1,0,0,[
248
+ mini_line(48,9,2,0,0,0,[
249
+ str_block(0,48,9,2,0,-1,0,0,0,[
250
+ str_seg('black','Courier',0,57600,48,9,2,0,-1,0,0,0,0,0,
251
+ "has-many")])
252
+ ])
253
+ ])]),
254
+ poly('black','',2,[
255
+ 128,240,128,304],1,1,1,152,0,2,0,0,0,0,0,'1',0,0,
256
+ "0","",[
257
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
258
+ ]),
259
+ poly('black','',2,[
260
+ 336,320,400,320],1,1,1,153,0,2,0,0,0,0,0,'1',0,0,
261
+ "0","",[
262
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
263
+ ]),
264
+ text('black',143,264,1,1,1,24,11,156,9,2,2,0,0,0,2,24,11,0,0,"",0,0,0,0,273,'',[
265
+ minilines(24,11,0,0,1,0,0,[
266
+ mini_line(24,9,2,0,0,0,[
267
+ str_block(0,24,9,2,0,-1,0,0,0,[
268
+ str_seg('black','Courier',0,57600,24,9,2,0,-1,0,0,0,0,0,
269
+ "uses")])
270
+ ])
271
+ ])]),
272
+ text('black',367,328,1,1,1,30,11,159,9,2,2,0,0,0,2,30,11,0,0,"",0,0,0,0,337,'',[
273
+ minilines(30,11,0,0,1,0,0,[
274
+ mini_line(30,9,2,0,0,0,[
275
+ str_block(0,30,9,2,0,0,0,0,0,[
276
+ str_seg('black','Courier',0,57600,30,9,2,0,0,0,0,0,0,0,
277
+ "has-a")])
278
+ ])
279
+ ])]),
280
+ text('black',96,151,1,1,1,54,11,375,9,2,2,0,0,0,2,54,11,0,0,"",0,0,0,0,160,'',[
281
+ minilines(54,11,0,0,1,0,0,[
282
+ mini_line(54,9,2,0,0,0,[
283
+ str_block(0,54,9,2,0,-1,0,0,0,[
284
+ str_seg('black','Courier',0,57600,54,9,2,0,-1,0,0,0,0,0,
285
+ "heirarchy")])
286
+ ])
287
+ ])]),
288
+ text('black',432,215,1,1,1,54,11,377,9,2,2,0,0,0,2,54,11,0,0,"",0,0,0,0,224,'',[
289
+ minilines(54,11,0,0,1,0,0,[
290
+ mini_line(54,9,2,0,0,0,[
291
+ str_block(0,54,9,2,0,-1,0,0,0,[
292
+ str_seg('black','Courier',0,57600,54,9,2,0,-1,0,0,0,0,0,
293
+ "relations")])
294
+ ])
295
+ ])]),
296
+ poly('black','',5,[
297
+ 496,320,528,320,528,288,480,288,480,304],1,1,1,720,0,0,0,0,0,0,0,'1',0,0,
298
+ "00","",[
299
+ 0,8,3,0,'8','3','0'],[0,8,3,0,'8','3','0'],[
300
+ ]),
301
+ text('black',511,264,1,1,1,30,11,726,9,2,2,0,0,0,2,30,11,0,0,"",0,0,0,0,273,'',[
302
+ minilines(30,11,0,0,1,0,0,[
303
+ mini_line(30,9,2,0,0,0,[
304
+ str_block(0,30,9,2,0,0,0,0,0,[
305
+ str_seg('black','Courier',0,57600,30,9,2,0,0,0,0,0,0,0,
306
+ "has-a")])
307
+ ])
308
+ ])])
309
+ ],
310
+ 782,0,0,[
311
+ ]).