yowl 0.4.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/CHANGES +15 -0
  2. data/INSTALL-MACOSX.md +107 -0
  3. data/README.md +92 -0
  4. data/Rakefile +76 -0
  5. data/bin/yowl +14 -0
  6. data/examples/introduction.html +5 -0
  7. data/lib/yowl/association.rb +66 -0
  8. data/lib/yowl/class.rb +296 -0
  9. data/lib/yowl/generator.rb +96 -0
  10. data/lib/yowl/import.rb +62 -0
  11. data/lib/yowl/individual.rb +398 -0
  12. data/lib/yowl/individual_association.rb +80 -0
  13. data/lib/yowl/ontology.rb +197 -0
  14. data/lib/yowl/options.rb +116 -0
  15. data/lib/yowl/optionsparser.rb +75 -0
  16. data/lib/yowl/person.rb +26 -0
  17. data/lib/yowl/property.rb +190 -0
  18. data/lib/yowl/repository.rb +100 -0
  19. data/lib/yowl/schema.rb +519 -0
  20. data/lib/yowl/template/css/jquery.ui.all.css +11 -0
  21. data/lib/yowl/template/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  22. data/lib/yowl/template/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  23. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  24. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  25. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  26. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  27. data/lib/yowl/template/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  28. data/lib/yowl/template/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  29. data/lib/yowl/template/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  30. data/lib/yowl/template/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  31. data/lib/yowl/template/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  32. data/lib/yowl/template/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  33. data/lib/yowl/template/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  34. data/lib/yowl/template/css/smoothness/jquery-ui-1.8.23.custom.css +563 -0
  35. data/lib/yowl/template/css/yowl.css +414 -0
  36. data/lib/yowl/template/import-diagram.erb +29 -0
  37. data/lib/yowl/template/index.erb +56 -0
  38. data/lib/yowl/template/js/jquery-1.7.2.min.js +4 -0
  39. data/lib/yowl/template/js/jquery-ui-1.8.23.custom.min.js +125 -0
  40. data/lib/yowl/template/js/jquery.ui.accordion.js +611 -0
  41. data/lib/yowl/template/js/yowl.js +72 -0
  42. data/lib/yowl/template/ontology.erb +598 -0
  43. data/lib/yowl/template/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  44. data/lib/yowl/template/themes/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  45. data/lib/yowl/template/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  46. data/lib/yowl/template/themes/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  47. data/lib/yowl/template/themes/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  48. data/lib/yowl/template/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  49. data/lib/yowl/template/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  50. data/lib/yowl/template/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  51. data/lib/yowl/template/themes/base/images/ui-icons_222222_256x240.png +0 -0
  52. data/lib/yowl/template/themes/base/images/ui-icons_2e83ff_256x240.png +0 -0
  53. data/lib/yowl/template/themes/base/images/ui-icons_454545_256x240.png +0 -0
  54. data/lib/yowl/template/themes/base/images/ui-icons_888888_256x240.png +0 -0
  55. data/lib/yowl/template/themes/base/images/ui-icons_cd0a0a_256x240.png +0 -0
  56. data/lib/yowl/template/themes/base/jquery.ui.accordion.css +19 -0
  57. data/lib/yowl/template/themes/base/jquery.ui.all.css +11 -0
  58. data/lib/yowl/template/themes/base/jquery.ui.autocomplete.css +53 -0
  59. data/lib/yowl/template/themes/base/jquery.ui.base.css +11 -0
  60. data/lib/yowl/template/themes/base/jquery.ui.button.css +38 -0
  61. data/lib/yowl/template/themes/base/jquery.ui.core.css +38 -0
  62. data/lib/yowl/template/themes/base/jquery.ui.datepicker.css +66 -0
  63. data/lib/yowl/template/themes/base/jquery.ui.dialog.css +21 -0
  64. data/lib/yowl/template/themes/base/jquery.ui.progressbar.css +11 -0
  65. data/lib/yowl/template/themes/base/jquery.ui.resizable.css +20 -0
  66. data/lib/yowl/template/themes/base/jquery.ui.selectable.css +10 -0
  67. data/lib/yowl/template/themes/base/jquery.ui.slider.css +24 -0
  68. data/lib/yowl/template/themes/base/jquery.ui.tabs.css +18 -0
  69. data/lib/yowl/template/themes/base/jquery.ui.theme.css +247 -0
  70. data/lib/yowl/template/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  71. data/lib/yowl/template/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  72. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  73. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  74. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  75. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  76. data/lib/yowl/template/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  77. data/lib/yowl/template/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  78. data/lib/yowl/template/themes/smoothness/images/ui-icons_222222_256x240.png +0 -0
  79. data/lib/yowl/template/themes/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  80. data/lib/yowl/template/themes/smoothness/images/ui-icons_454545_256x240.png +0 -0
  81. data/lib/yowl/template/themes/smoothness/images/ui-icons_888888_256x240.png +0 -0
  82. data/lib/yowl/template/themes/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  83. data/lib/yowl/template/themes/smoothness/jquery-ui-1.8.23.custom.css +563 -0
  84. data/lib/yowl/template/themes/smoothness/jquery.ui.accordion.css +19 -0
  85. data/lib/yowl/template/themes/smoothness/jquery.ui.all.css +11 -0
  86. data/lib/yowl/template/themes/smoothness/jquery.ui.autocomplete.css +53 -0
  87. data/lib/yowl/template/themes/smoothness/jquery.ui.base.css +11 -0
  88. data/lib/yowl/template/themes/smoothness/jquery.ui.button.css +38 -0
  89. data/lib/yowl/template/themes/smoothness/jquery.ui.core.css +38 -0
  90. data/lib/yowl/template/themes/smoothness/jquery.ui.datepicker.css +66 -0
  91. data/lib/yowl/template/themes/smoothness/jquery.ui.dialog.css +21 -0
  92. data/lib/yowl/template/themes/smoothness/jquery.ui.progressbar.css +11 -0
  93. data/lib/yowl/template/themes/smoothness/jquery.ui.resizable.css +20 -0
  94. data/lib/yowl/template/themes/smoothness/jquery.ui.selectable.css +10 -0
  95. data/lib/yowl/template/themes/smoothness/jquery.ui.slider.css +24 -0
  96. data/lib/yowl/template/themes/smoothness/jquery.ui.tabs.css +18 -0
  97. data/lib/yowl/template/themes/smoothness/jquery.ui.theme.css +249 -0
  98. data/lib/yowl/util.rb +221 -0
  99. data/lib/yowl/version.rb +3 -0
  100. data/lib/yowl.rb +42 -0
  101. data/test/input/base-with-comments.ttl +163 -0
  102. data/test/input/base.ttl +221 -0
  103. data/test/input/empty.ttl +8 -0
  104. data/test/input/example.ttl +73 -0
  105. data/test/test_example_ttl.rb +62 -0
  106. data/test/test_yowl.rb +4 -0
  107. data/test/testcases.md +24 -0
  108. metadata +311 -0
@@ -0,0 +1,197 @@
1
+ module YOWL
2
+
3
+ class Ontology < YOWL::LabelledDocObject
4
+
5
+ def initialize(resource, schema)
6
+ super(resource, schema)
7
+ end
8
+
9
+ def resourceNameHtml
10
+ return "#{@schema.name}.html"
11
+ end
12
+
13
+ def title()
14
+ dctermsTitle = get_literal(YOWL::Namespaces::DCTERMS.title)
15
+ if dctermsTitle
16
+ return dctermsTitle
17
+ end
18
+ dcTitle = get_literal(YOWL::Namespaces::DC.title)
19
+ if dcTitle
20
+ return dcTitle
21
+ end
22
+ return short_name() # We have to have a title
23
+ end
24
+
25
+ def ns()
26
+ @ns ||= init_ns()
27
+ return @ns
28
+ end
29
+
30
+ def init_ns()
31
+ _uri = @resource.to_s
32
+ @schema.prefixes.each do |prefix, namespace|
33
+ if _uri == namespace
34
+ return namespace
35
+ end
36
+ _tmp = "#{_uri}/"
37
+ if _tmp == namespace
38
+ return _tmp
39
+ end
40
+ _tmp = "#{_uri}#"
41
+ if "#{_uri}#" == namespace
42
+ return _tmp
43
+ end
44
+ end
45
+ if _uri[-1..1] == '/' or _uri[-1..1] == '#'
46
+ return _uri
47
+ end
48
+ #
49
+ # Basically make up a namespace... Don't know if this is such a good plan..
50
+ #
51
+ return "#{_uri}#"
52
+ end
53
+
54
+ def short_name()
55
+ return @schema.name
56
+ end
57
+
58
+ def comment()
59
+ dctermsAbstract = get_literal(YOWL::Namespaces::DCTERMS.abstract)
60
+ if dctermsAbstract
61
+ return dctermsAbstract
62
+ end
63
+ return super
64
+ end
65
+
66
+ def definition()
67
+ return get_literal(YOWL::Namespaces::SKOS.definition)
68
+ end
69
+
70
+ def created()
71
+ dctermsCreated = get_literal(YOWL::Namespaces::DCTERMS.created)
72
+ if dctermsCreated
73
+ return dctermsCreated
74
+ end
75
+ return get_literal(YOWL::Namespaces::DC.date)
76
+ end
77
+
78
+ def modified()
79
+ return get_literal(YOWL::Namespaces::DCTERMS.modified)
80
+ end
81
+
82
+ def rights()
83
+ return get_literal(YOWL::Namespaces::DC.rights)
84
+ end
85
+
86
+ public
87
+ def authors
88
+ @authors ||= init_authors
89
+ end
90
+
91
+ private
92
+ def init_authors()
93
+ authors = []
94
+ #
95
+ # First find the Authors by searching for foaf:maker
96
+ #
97
+ @schema.model.query(
98
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::FOAF.maker)
99
+ ) do |statement|
100
+ uri = statement.object
101
+ if (uri and uri.uri?)
102
+ authors << Person.new(uri, @schema)
103
+ end
104
+ end
105
+ #
106
+ # Also scan for dc:creator and dc:contributor
107
+ #
108
+ @schema.model.query(
109
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::DC.creator)
110
+ ) do |statement|
111
+ person = Person.new(RDF::URI.new("#{ns}#{statement.object.to_s}"), @schema)
112
+ person.setName(statement.object)
113
+ authors << person
114
+ end
115
+ @schema.model.query(
116
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::DC.contributor)
117
+ ) do |statement|
118
+ person = Person.new(RDF::URI.new("#{ns}#{statement.object.to_s}"), @schema)
119
+ person.setName(statement.object)
120
+ authors << person
121
+ end
122
+ return authors
123
+ end
124
+
125
+ public
126
+ def hasAuthors?
127
+ return ! authors.empty?
128
+ end
129
+
130
+ def numberOfClasses()
131
+ return @schema.classes.size()
132
+ end
133
+
134
+ def numberOfProperties()
135
+ return @schema.properties.size()
136
+ end
137
+
138
+ def numberOfIndividuals()
139
+ return @schema.individuals.size()
140
+ end
141
+
142
+ public
143
+ def imports
144
+ @imports ||= init_imports
145
+ end
146
+
147
+ private
148
+ def init_imports
149
+ imports = {}
150
+ @schema.model.query(
151
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::OWL.imports)
152
+ ) do |statement|
153
+ importUri = statement.object.to_s
154
+ if importUri != uri
155
+ imports[importUri] = Import.new(statement.object, @schema)
156
+ end
157
+ end
158
+ return imports.values
159
+ end
160
+
161
+ public
162
+ def see_alsos
163
+ @see_alsos ||= init_see_alsos
164
+ end
165
+
166
+ private
167
+ def init_see_alsos()
168
+ links = []
169
+ @schema.model.query(
170
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::RDFS.seeAlso)
171
+ ) do |statement|
172
+ links << statement.object.to_s
173
+ end
174
+ return links
175
+ end
176
+
177
+ public
178
+ #
179
+ # See YOWL::Individual::classWithURI(uri)
180
+ #
181
+ def classWithURI(uri_)
182
+ klass = @schema.classInSchemaWithURI(uri_)
183
+ if klass
184
+ return klass
185
+ end
186
+ imports.each do |import|
187
+ klass = import.classWithURI(uri_)
188
+ if klass
189
+ return klass
190
+ end
191
+ end
192
+ return nil
193
+ end
194
+
195
+ end
196
+
197
+ end
@@ -0,0 +1,116 @@
1
+ module YOWL
2
+ #
3
+ # Utility class representing all specified command line options
4
+ #
5
+ class Options
6
+
7
+ attr_accessor :ontology_file_names
8
+ attr_accessor :output_dir
9
+ attr_accessor :template_dirs
10
+ attr_accessor :noVann
11
+
12
+ attr_reader :templates
13
+
14
+ attr_accessor :verbose
15
+ attr_accessor :quiet
16
+
17
+
18
+ def initialize()
19
+ @verbose = false
20
+ @quiet = false
21
+ @ontology_file_names = []
22
+ @output_dir = Dir.pwd()
23
+ @template_dirs = []
24
+ @templates = Hash.new
25
+ @noVann = false
26
+ end
27
+
28
+ def validate()
29
+ if not @quiet
30
+ puts "Output will be generated in this directory: #{output_dir.to_s}"
31
+ end
32
+ if ! validate_ontology_file_names()
33
+ return false
34
+ end
35
+ if ! validate_template_dirs()
36
+ return false
37
+ end
38
+ if ! validate_templates()
39
+ return false
40
+ end
41
+ return true
42
+ end
43
+
44
+ private
45
+ def validate_ontology_file_names
46
+ if @ontology_file_names.empty?
47
+ return false
48
+ end
49
+ @ontology_file_names.each() do |filename|
50
+ if ! File.exists?(filename)
51
+ warn "File does not exist: " + filename
52
+ return false
53
+ end
54
+ if not @quiet
55
+ puts "Will process input file: #{filename}"
56
+ end
57
+ end
58
+ return true
59
+ end
60
+
61
+ private
62
+ def validate_template_dirs
63
+ @template_dirs << File.join(ontology_dir(), "yowl/template")
64
+ @template_dirs << File.join(File.dirname(__FILE__), "template")
65
+ @template_dirs = @template_dirs.find_all do |dir|
66
+ Dir[dir]
67
+ end
68
+ return ! @template_dirs.empty?()
69
+ end
70
+
71
+ #
72
+ # TODO: Either we support one template per ontology or
73
+ # we support one template per input directory. That would
74
+ # then be the only way to specify input ontologies: by directory.
75
+ #
76
+ private
77
+ def ontology_dir()
78
+ return File.dirname(@ontology_file_names[0])
79
+ end
80
+
81
+ private
82
+ def load_template(templateName_, required_ = true)
83
+ @template_dirs.each do |template_dir|
84
+ templateFileName = File.join(template_dir, "#{templateName_}.erb")
85
+ if verbose()
86
+ puts "Checking template #{templateFileName}"
87
+ end
88
+ if File.exists?(templateFileName)
89
+ File.open(templateFileName) do |file|
90
+ @templates[templateName_] = ERB.new(file.read)
91
+ end
92
+ if verbose()
93
+ puts "Loaded template #{templateFileName}"
94
+ end
95
+ return
96
+ end
97
+ end
98
+ if required_
99
+ raise "ERROR: #{templateName_} could not be found"
100
+ end
101
+ end
102
+
103
+ private
104
+ def validate_templates()
105
+
106
+ load_template('index');
107
+ #load_template('overview');
108
+ load_template('introduction', false);
109
+ load_template('import-diagram');
110
+ load_template('ontology');
111
+
112
+ return true
113
+ end
114
+
115
+ end # End of class Options
116
+ end # End of module YOWL
@@ -0,0 +1,75 @@
1
+ module YOWL
2
+
3
+ class OptionsParser
4
+
5
+ def self.parse(args_)
6
+
7
+ options = Options.new
8
+
9
+ opts = OptionParser.new do |opts|
10
+ #
11
+ # Set a banner, displayed at the top of the help screen.
12
+ #
13
+ opts.banner = "Usage: YOWL [<options>]"
14
+
15
+ opts.separator ""
16
+ opts.separator "Specific options:"
17
+
18
+ opts.on('-i', '--ontology FILES', String, 'Read input FILES') do |ontology|
19
+ options.ontology_file_names << ontology
20
+ if args_.size > 0
21
+ for index in 0..(args_.size - 1)
22
+ arg = args_[index]
23
+ if arg[0,1] == '-'
24
+ break
25
+ end
26
+ options.ontology_file_names << arg
27
+ end
28
+ end
29
+ end
30
+
31
+ opts.on('-o', '--output DIR', 'Write HTML output to DIR') do |dir|
32
+ options.output_dir = dir
33
+ end
34
+
35
+ opts.on('-t', '--template DIR', 'Use ERB templates in DIR') do |dir|
36
+ options.template_dir = dir
37
+ end
38
+
39
+ opts.on('--no-vann', 'Skip looking for vann:preferedNamespacePrefix') do |value|
40
+ options.noVann = true
41
+ end
42
+
43
+ opts.separator ""
44
+ opts.separator "Common options:"
45
+
46
+ opts.on_tail("-?", "-h", "--help", "Show this message") do
47
+ puts opts
48
+ return nil
49
+ end
50
+
51
+ opts.on_tail("-V", "--version", "Show version") do
52
+ puts OptionParser::Version.join('.')
53
+ exit
54
+ end
55
+
56
+ opts.on_tail("-v", "--verbose", "Show verbose logging") do
57
+ options.verbose = true
58
+ end
59
+
60
+ opts.on_tail("-q", "--quiet", "Suppress most logging") do
61
+ options.quiet = true
62
+ end
63
+
64
+ end
65
+
66
+ opts.parse!(args_)
67
+
68
+ if ! options.validate()
69
+ puts opts
70
+ return nil
71
+ end
72
+ return options
73
+ end # parse()
74
+ end # class OptionParser
75
+ end
@@ -0,0 +1,26 @@
1
+ module YOWL
2
+
3
+ class Person < YOWL::LabelledDocObject
4
+
5
+ def initialize(resource, schema)
6
+ super(resource, schema)
7
+ @name = nil
8
+ end
9
+
10
+ def setName(name_)
11
+ @name = name_
12
+ end
13
+
14
+ def name()
15
+ name = get_literal(YOWL::Namespaces::FOAF.name)
16
+ if name.nil? or name.empty?
17
+ name = short_name()
18
+ end
19
+ return name
20
+ end
21
+
22
+ def <=>(other)
23
+ return name() <=> other.name()
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,190 @@
1
+ require 'yowl'
2
+
3
+ module YOWL
4
+
5
+ class Property < YOWL::LabelledDocObject
6
+
7
+ def initialize(resource, schema)
8
+ super(resource, schema)
9
+ end
10
+
11
+ def see_alsos()
12
+ links = []
13
+ @schema.model.query(
14
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::RDFS.seeAlso)
15
+ ) do |statement|
16
+ links << statement.object.to_s
17
+ end
18
+ return links
19
+ end
20
+
21
+ def sub_property_of()
22
+ parent = @schema.model.first_value(
23
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::RDFS.subPropertyOf)
24
+ )
25
+ if parent
26
+ uri = parent.to_s
27
+ if @schema.properties[uri]
28
+ return @schema.properties[uri]
29
+ else
30
+ return uri
31
+ end
32
+ end
33
+ return nil
34
+ end
35
+
36
+ def range()
37
+ ranges = []
38
+ @schema.model.query(
39
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::RDFS.range)
40
+ ) do |statement|
41
+ ranges << statement.object
42
+ end
43
+ classes = []
44
+ ranges.each do |o|
45
+ if o.resource?
46
+ uri = o.to_s
47
+ if @schema.classes[uri]
48
+ classes << @schema.classes[uri]
49
+ else
50
+ classes << uri
51
+ end
52
+ end
53
+ end
54
+ return classes
55
+ end
56
+
57
+ def domain()
58
+ domains = []
59
+ @schema.model.query(
60
+ RDF::Query::Pattern.new(@resource, YOWL::Namespaces::RDFS.domain)
61
+ ) do |statement|
62
+ domains << statement.object
63
+ end
64
+ classes = []
65
+ domains.each do |o|
66
+ if o.resource?
67
+ uri = o.to_s
68
+ if @schema.classes[uri]
69
+ classes << @schema.classes[uri]
70
+ else
71
+ classes << uri
72
+ end
73
+ end
74
+ #TODO union
75
+ end
76
+ return classes
77
+ end
78
+
79
+ def sub_properties()
80
+ list = []
81
+ @schema.model.query(
82
+ RDF::Query::Pattern.new(nil, YOWL::Namespaces::RDFS.subPropertyOf, @resource)
83
+ ) do |statement|
84
+ list << YOWL::Property.new(statement.subject, @schema)
85
+ end
86
+ return list
87
+ end
88
+
89
+ public
90
+ #
91
+ # Add the current class as a GraphViz node to the given collection of nodes
92
+ # and to the given graph. Return the collection of nodes.
93
+ #
94
+ def addAsGraphvizNode (graph_, nodes_, edges_)
95
+ name = short_name
96
+ if @schema.options.verbose
97
+ puts "- Processing property #{name}"
98
+ end
99
+ #
100
+ # No need to add a node twice
101
+ #
102
+ if nodes_.has_key? uri
103
+ return nodes_, edges_
104
+ end
105
+ node = graph_.add_nodes(escaped_uri)
106
+ node.URL = "#prop_#{short_name}"
107
+
108
+ if name.include?(':')
109
+ prefix = name.sub(/:\s*(.*)/, "")
110
+ name = name.sub(/(.*)\s*:/, "")
111
+ #
112
+ # Can't get HTML labels to work
113
+ #
114
+ #node.label = "<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\"><TR><TD>#{name}</TD></TR><TR><TD><I>(#{prefix})</I></TD></TR></TABLE>"
115
+ node.label = "#{name}\n(#{prefix})"
116
+ else
117
+ node.label = name
118
+ end
119
+ if hasComment?
120
+ node.tooltip = comment
121
+ end
122
+ nodes_[uri] = node
123
+ return nodes_, edges_
124
+ end
125
+
126
+ public
127
+ #
128
+ # Generate a diagram for each Property, the "per property diagram"
129
+ #
130
+ def perPropertyDiagramAsSvg
131
+ #if @schema.options.verbose
132
+ # puts "Generating SVG Per Property Diagram for #{short_name}"
133
+ #end
134
+
135
+ g = GraphvizUtility.setDefaults(GraphViz.new(:G, :type => :digraph))
136
+ g[:rankdir] = "LR"
137
+ g.node[:fixedsize] = false
138
+
139
+ nodes = Hash.new
140
+ edges = Hash.new
141
+ nodes, edges = addAsGraphvizNode(g, nodes, edges)
142
+
143
+ #
144
+ # Do the "outbound" associations first
145
+ #
146
+ #associations.each do |association|
147
+ # nodes, edges = association.rangeClass.addAsGraphvizNode(g, nodes, edges)
148
+ # nodes, edges = association.addAsGraphVizEdge(g, nodes, edges)
149
+ #end
150
+
151
+ #
152
+ # Then do the "inbound" associations
153
+ #
154
+ #@schema.classes.values.to_set.each do |klass|
155
+ # klass.associations.each do |association|
156
+ # if self == association.rangeClass
157
+ # nodes, edges = association.rangeClass.addAsGraphvizNode(g, nodes, edges)
158
+ # nodes, edges = association.addAsGraphVizEdge(g, nodes, edges)
159
+ # end
160
+ # end
161
+ #end
162
+
163
+ return GraphvizUtility.embeddableSvg(g)
164
+ end
165
+
166
+ #
167
+ # Create the GraphVis Edge for all "is a" (rdf:type) associations from a node
168
+ # (representing a Class) to another node (always representing a Property)
169
+ #
170
+ def Property.newGraphVizEdge(graph_, domainNode_, rangeNode_, constraint_ = true)
171
+ options = {
172
+ :arrowhead => "empty",
173
+ :dir => "back",
174
+ :label => "is a",
175
+ :arrowsize => 0.5,
176
+ :penwidth => 0.5,
177
+ :constraint => constraint_
178
+ }
179
+ if not constraint_
180
+ options[:style] = :dashed
181
+ end
182
+ return graph_.add_edges(
183
+ rangeNode_,
184
+ domainNode_,
185
+ options
186
+ )
187
+ end
188
+
189
+ end
190
+ end
@@ -0,0 +1,100 @@
1
+ module YOWL
2
+
3
+ class Repository
4
+
5
+ attr_reader :schemas
6
+ attr_reader :options
7
+
8
+ def initialize(options)
9
+ @options = options
10
+
11
+ init_schemas()
12
+ end
13
+
14
+ private
15
+ def init_schemas()
16
+ @schemas = {}
17
+
18
+ @options.ontology_file_names.each() do | ontology_file_name |
19
+ if options.verbose
20
+ puts "Parsing #{ontology_file_name}"
21
+ end
22
+ schema = Schema.fromFile(ontology_file_name, self)
23
+ if schema
24
+ @schemas[schema.uri] = schema
25
+ #puts "Registered schema with URI #{schema.uri}"
26
+ end
27
+ end
28
+ end
29
+
30
+ public
31
+ def ontologies()
32
+ ontologies = @schemas.values.collect() { |schema|
33
+ schema.ontology
34
+ }
35
+ return ontologies.sort { |x,y| x.short_name <=> y.short_name }
36
+ end
37
+
38
+ public
39
+ def getSchemaForImport(import_)
40
+ begin
41
+ return @schemas[import_.uri]
42
+ rescue => exception
43
+ puts exception.backtrace
44
+ end
45
+ end
46
+
47
+ public
48
+ def knowsImport(import_)
49
+ return ! getSchemaForImport(import_).nil?
50
+ end
51
+
52
+ public
53
+ def getSchemaNameForImport(import_)
54
+ schema = getSchemaForImport(import_)
55
+ return schema.nil? ? '' : schema.name
56
+ end
57
+
58
+ public
59
+ def ontologiesAsSvg
60
+ if @options.verbose
61
+ puts "Generating SVG for Ontology Import Diagram"
62
+ end
63
+
64
+ g = GraphvizUtility.setDefaults(GraphViz.new(:G, :type => :digraph))
65
+
66
+ nodes = {}
67
+ ontologies.each() do |ontology|
68
+ nodeID = ontology.escaped_uri
69
+ node = g.add_nodes(nodeID)
70
+ node.URL = ontology.resourceNameHtml
71
+ node.label = ontology.short_name
72
+ node.tooltip = ontology.commentOrLabel
73
+ nodes[nodeID] = node
74
+ end
75
+
76
+ ontologies.each() do |ontology|
77
+ if @options.verbose
78
+ puts "- Processing ontology #{ontology.escaped_uri}"
79
+ end
80
+ ontology.imports.each() do |import|
81
+ importNode = nodes[import.name]
82
+ if importNode
83
+ if @options.verbose
84
+ puts " - Processing import #{import.name}"
85
+ end
86
+ g.add_edges(nodes[ontology.short_name], importNode)
87
+ else
88
+ if @options.verbose
89
+ puts " - Processing import #{import.name}, not found"
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ #puts g.to_dot()
96
+ return GraphvizUtility.embeddableSvg(g)
97
+ end
98
+
99
+ end
100
+ end