openmenu 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +23 -0
- data/.gemtest +0 -0
- data/History.txt +6 -0
- data/Manifest.txt +9 -0
- data/README.txt +57 -0
- data/Rakefile +16 -0
- data/lib/open_menu.rb +313 -0
- data/lib/openmenu.rb +4 -0
- data/test/sample.xml +293 -0
- data/test/test_openmenu.rb +704 -0
- metadata +96 -0
data/.autotest
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'autotest/restart'
|
4
|
+
|
5
|
+
# Autotest.add_hook :initialize do |at|
|
6
|
+
# at.extra_files << "../some/external/dependency.rb"
|
7
|
+
#
|
8
|
+
# at.libs << ":../some/external"
|
9
|
+
#
|
10
|
+
# at.add_exception 'vendor'
|
11
|
+
#
|
12
|
+
# at.add_mapping(/dependency.rb/) do |f, _|
|
13
|
+
# at.files_matching(/test_.*rb$/)
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# %w(TestA TestB).each do |klass|
|
17
|
+
# at.extra_class_map[klass] = "test/test_misc.rb"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
|
21
|
+
# Autotest.add_hook :run_command do |at|
|
22
|
+
# system "rake build"
|
23
|
+
# end
|
data/.gemtest
ADDED
File without changes
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.txt
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
= openmenu
|
2
|
+
|
3
|
+
* https://github.com/matthewcalebsmith/openmenu
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
Openmenu is parser for OpenMenu xml files.
|
8
|
+
|
9
|
+
NOTE: This is an early release. There is some refactoring to be done, but
|
10
|
+
the interface should stay the same.
|
11
|
+
|
12
|
+
|
13
|
+
== FEATURES/PROBLEMS:
|
14
|
+
|
15
|
+
* Parses public OpenMenu XML documents.
|
16
|
+
|
17
|
+
== SYNOPSIS:
|
18
|
+
|
19
|
+
om = OpenMenu.parse(open('http://openmenu.com/menu/sample'))
|
20
|
+
om.restaurant_name # => 'My Restaurant'
|
21
|
+
om.menus.inspect # => [#<OpenMenu::Menu:0x007fdb0a1facd8 @name="Main Menu", ...>,
|
22
|
+
#<OpenMenu::Menu:0x007fdb0c027558 @name="Late Night Menu", ...]
|
23
|
+
om.menus.first.groups.first.items.first.name # => 'Coconut Shrimp'
|
24
|
+
om.menus.first.groups.first.items.first.price # => 7.95
|
25
|
+
|
26
|
+
== REQUIREMENTS:
|
27
|
+
|
28
|
+
* nokogiri-happymapper
|
29
|
+
|
30
|
+
== INSTALL:
|
31
|
+
|
32
|
+
* gem install openmenu
|
33
|
+
|
34
|
+
== LICENSE:
|
35
|
+
|
36
|
+
(The MIT License)
|
37
|
+
|
38
|
+
Copyright (c) 2011 Matt Smith
|
39
|
+
|
40
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
41
|
+
a copy of this software and associated documentation files (the
|
42
|
+
'Software'), to deal in the Software without restriction, including
|
43
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
44
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
45
|
+
permit persons to whom the Software is furnished to do so, subject to
|
46
|
+
the following conditions:
|
47
|
+
|
48
|
+
The above copyright notice and this permission notice shall be
|
49
|
+
included in all copies or substantial portions of the Software.
|
50
|
+
|
51
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
52
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
53
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
54
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
55
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
56
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
57
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
|
6
|
+
Hoe.plugin :git
|
7
|
+
Hoe.plugin :minitest
|
8
|
+
|
9
|
+
Hoe.spec 'openmenu' do
|
10
|
+
developer('Matt Smith', 'matts@nearapogee.com')
|
11
|
+
dependency('nokogiri-happymapper', '~>0.3.6')
|
12
|
+
|
13
|
+
# self.rubyforge_name = 'openmenux' # if different than 'openmenu'
|
14
|
+
end
|
15
|
+
|
16
|
+
# vim: syntax=ruby
|
data/lib/open_menu.rb
ADDED
@@ -0,0 +1,313 @@
|
|
1
|
+
class OpenMenu
|
2
|
+
VERSION = '0.1.5'
|
3
|
+
include HappyMapper
|
4
|
+
tag 'omf'
|
5
|
+
|
6
|
+
attribute :uuid, String
|
7
|
+
attribute :date_created, String
|
8
|
+
attribute :accuracy, Integer
|
9
|
+
|
10
|
+
element :version, Float, :deep => true
|
11
|
+
|
12
|
+
element :restaurant_name, String, :deep => true
|
13
|
+
element :brief_description, String, :deep => true
|
14
|
+
element :full_description, String, :deep => true
|
15
|
+
element :business_type, String, :deep => true
|
16
|
+
element :location_id, String, :deep => true
|
17
|
+
element :longitude, String, :deep => true
|
18
|
+
element :latitude, String, :deep => true
|
19
|
+
element :utc_offset, Float, :deep => true
|
20
|
+
element :address_1, String, :deep => true
|
21
|
+
element :address_2, String, :deep => true
|
22
|
+
element :city, String, :tag => 'city_town', :deep => true
|
23
|
+
alias_method :town, :city
|
24
|
+
element :state, String, :tag => 'state_province', :deep => true
|
25
|
+
alias_method :province, :state
|
26
|
+
element :postal_code, String, :deep => true
|
27
|
+
element :country, String, :deep => true
|
28
|
+
|
29
|
+
class RegionArea
|
30
|
+
include HappyMapper
|
31
|
+
|
32
|
+
attribute :name, String
|
33
|
+
attribute :designation, String
|
34
|
+
end
|
35
|
+
element :region_area, RegionArea
|
36
|
+
|
37
|
+
element :phone, String, :deep => true
|
38
|
+
element :fax, String, :deep => true
|
39
|
+
element :website, String, :tag => 'website_url', :deep => true
|
40
|
+
element :url, String, :tag => 'omf_file_url', :deep => true
|
41
|
+
|
42
|
+
class Logo
|
43
|
+
include HappyMapper
|
44
|
+
tag 'logo_url'
|
45
|
+
|
46
|
+
attribute :type, String
|
47
|
+
attribute :media, String
|
48
|
+
attribute :height, Integer
|
49
|
+
attribute :width, Integer
|
50
|
+
|
51
|
+
text_node :url, String
|
52
|
+
end
|
53
|
+
has_many :logos, Logo, :xpath => '//logo_urls'
|
54
|
+
|
55
|
+
# environment
|
56
|
+
element :seating_quantity, Integer, :tag => 'seating_qty', :deep => true
|
57
|
+
element :max_group_size, Integer, :deep => true
|
58
|
+
element :smoking_allowed, String, :deep => true
|
59
|
+
element :takeout_available, String, :deep => true
|
60
|
+
element :delivery_available, String, :deep => true
|
61
|
+
|
62
|
+
class Delivery
|
63
|
+
include HappyMapper
|
64
|
+
tag 'delivery_available'
|
65
|
+
|
66
|
+
attribute :radius, Float
|
67
|
+
attribute :fee, Float
|
68
|
+
end
|
69
|
+
has_one :delivery, Delivery
|
70
|
+
|
71
|
+
element :catering_available, String, :deep => true
|
72
|
+
element :reservations, String, :deep => true
|
73
|
+
element :music_type, String, :deep => true
|
74
|
+
element :alcohol_type, String, :deep => true
|
75
|
+
element :pets_allowed, String, :deep => true
|
76
|
+
element :age_level_preference, String, :deep => true
|
77
|
+
element :wheelchair_accessible, String, :deep => true
|
78
|
+
element :dress_code, String, :deep => true
|
79
|
+
element :cuisine_type_primary, String, :deep => true
|
80
|
+
element :cuisine_type_secondary, String, :deep => true
|
81
|
+
has_many :seating_locations, String, :tag => 'seating_location', :deep => true
|
82
|
+
has_many :accepted_currencies, String, :tag => 'accepted_currency', :deep => true
|
83
|
+
|
84
|
+
class Contact
|
85
|
+
include HappyMapper
|
86
|
+
tag 'contact'
|
87
|
+
|
88
|
+
attribute :type, String
|
89
|
+
|
90
|
+
element :first_name, String
|
91
|
+
element :last_name, String
|
92
|
+
element :email, String
|
93
|
+
end
|
94
|
+
has_many :contacts, Contact, :xpath => '//contacts'
|
95
|
+
|
96
|
+
class ParentCompany
|
97
|
+
include HappyMapper
|
98
|
+
tag 'parent_company'
|
99
|
+
|
100
|
+
element :name, String, :tag => 'parent_company_name'
|
101
|
+
element :website, String, :tag => 'parent_company_website'
|
102
|
+
element :address_1, String
|
103
|
+
element :address_2, String
|
104
|
+
element :city, String, :tag => 'city_town'
|
105
|
+
alias_method :town, :city
|
106
|
+
element :state, String, :tag => 'state_province'
|
107
|
+
alias_method :province, :state
|
108
|
+
element :postal_code, String
|
109
|
+
element :country, String
|
110
|
+
element :phone, String
|
111
|
+
element :fax, String
|
112
|
+
end
|
113
|
+
has_one :parent_company, ParentCompany
|
114
|
+
|
115
|
+
class OperatingDay
|
116
|
+
include HappyMapper
|
117
|
+
tag 'operating_day'
|
118
|
+
|
119
|
+
element :day_of_week, Integer
|
120
|
+
element :open_time, String
|
121
|
+
element :close_time, String
|
122
|
+
end
|
123
|
+
has_many :operating_days, OperatingDay, :xpath => '//operating_days'
|
124
|
+
|
125
|
+
class Parking
|
126
|
+
include HappyMapper
|
127
|
+
tag 'parking'
|
128
|
+
|
129
|
+
%w(street_free street_metered private_lot garage valet).each do |type|
|
130
|
+
attribute type.to_s, String
|
131
|
+
end
|
132
|
+
end
|
133
|
+
element :parking, Parking
|
134
|
+
|
135
|
+
class OnlineReservation
|
136
|
+
include HappyMapper
|
137
|
+
tag 'online_reservation'
|
138
|
+
|
139
|
+
attribute :type, String
|
140
|
+
|
141
|
+
element :name, String, :tag => 'online_reservation_name'
|
142
|
+
element :url, String, :tag => 'online_reservation_url'
|
143
|
+
end
|
144
|
+
has_many :online_reservations, OnlineReservation, :xpath => '//online_reservations'
|
145
|
+
def online_reservations?
|
146
|
+
online_reservations.size > 0
|
147
|
+
end
|
148
|
+
|
149
|
+
class OnlineOrder
|
150
|
+
include HappyMapper
|
151
|
+
tag 'online_order'
|
152
|
+
|
153
|
+
attribute :type, String
|
154
|
+
|
155
|
+
element :name, String, :tag => 'online_order_name'
|
156
|
+
element :url, String, :tag => 'online_order_url'
|
157
|
+
end
|
158
|
+
has_many :online_orders, OnlineOrder, :xpath => '//online_ordering'
|
159
|
+
def online_orders?
|
160
|
+
online_orders.size > 0
|
161
|
+
end
|
162
|
+
|
163
|
+
class Crosswalk
|
164
|
+
include HappyMapper
|
165
|
+
tag 'crosswalk'
|
166
|
+
|
167
|
+
element :id, String, :tag => 'crosswalk_id'
|
168
|
+
element :company, String, :tag => 'crosswalk_company'
|
169
|
+
element :url, String, :tag => 'crosswalk_url'
|
170
|
+
end
|
171
|
+
has_many :crosswalks, OpenMenu::Crosswalk, :xpath => './crosswalks'
|
172
|
+
|
173
|
+
class Menu
|
174
|
+
include HappyMapper
|
175
|
+
tag 'menu'
|
176
|
+
|
177
|
+
attribute :name, String
|
178
|
+
attribute :uid, Integer
|
179
|
+
attribute :currency, String, :tag => 'currency_symbol'
|
180
|
+
attribute :disabled, String
|
181
|
+
|
182
|
+
element :description, String, :tag => "menu_description"
|
183
|
+
|
184
|
+
def disabled?
|
185
|
+
disabled == 'disabled'
|
186
|
+
end
|
187
|
+
|
188
|
+
class Duration
|
189
|
+
include HappyMapper
|
190
|
+
tag 'menu_duration'
|
191
|
+
|
192
|
+
element :name, String, :tag => 'menu_duration_name'
|
193
|
+
element :start, String, :tag => 'menu_duration_time_start'
|
194
|
+
element :end, String, :tag => 'menu_duration_time_end'
|
195
|
+
end
|
196
|
+
has_one :duration, Duration
|
197
|
+
|
198
|
+
class Group
|
199
|
+
include HappyMapper
|
200
|
+
tag 'menu_group'
|
201
|
+
|
202
|
+
attribute :name, String
|
203
|
+
attribute :uid, Integer
|
204
|
+
attribute :disabled, String
|
205
|
+
def disabled?
|
206
|
+
disabled == 'disabled'
|
207
|
+
end
|
208
|
+
|
209
|
+
class Option
|
210
|
+
include HappyMapper
|
211
|
+
tag 'menu_group_option'
|
212
|
+
|
213
|
+
attribute :name, String
|
214
|
+
attribute :min_selected, Integer
|
215
|
+
attribute :max_selected, Integer
|
216
|
+
|
217
|
+
element :information, String, :tag => 'menu_group_option_information'
|
218
|
+
|
219
|
+
class Item
|
220
|
+
include HappyMapper
|
221
|
+
tag 'menu_group_option_item'
|
222
|
+
|
223
|
+
element :name, String, :tag => 'menu_group_option_name'
|
224
|
+
element :additional_cost, Float, :tag => 'menu_group_option_additional_cost'
|
225
|
+
end
|
226
|
+
has_many :items, Item
|
227
|
+
|
228
|
+
end # OpenMenu::Menu::Group::Option
|
229
|
+
has_many :options, Option
|
230
|
+
|
231
|
+
class Item
|
232
|
+
include HappyMapper
|
233
|
+
tag 'menu_item'
|
234
|
+
|
235
|
+
attribute :uid, Integer
|
236
|
+
%w(disabled special vegetarian vegan kosher halal).each do |attr|
|
237
|
+
attribute attr.to_s, String
|
238
|
+
define_method("#{attr}?".to_s) { self.send(attr) == attr }
|
239
|
+
end
|
240
|
+
|
241
|
+
element :name, String, :tag => 'menu_item_name'
|
242
|
+
element :description, String, :tag => 'menu_item_description'
|
243
|
+
element :price, Float, :tag => 'menu_item_price'
|
244
|
+
element :calories, Integer, :tag => 'menu_item_calories'
|
245
|
+
element :heat_index, Integer, :tag => 'menu_item_heat_index'
|
246
|
+
|
247
|
+
class Allergy
|
248
|
+
include HappyMapper
|
249
|
+
tag 'menu_item_allergy_information'
|
250
|
+
|
251
|
+
attribute :allergens, String
|
252
|
+
text_node :information, String
|
253
|
+
end # OpenMenu::Menu::Group::Item::Allergy
|
254
|
+
has_one :allergy, Allergy
|
255
|
+
|
256
|
+
class Image
|
257
|
+
include HappyMapper
|
258
|
+
tag 'menu_item_image_url'
|
259
|
+
|
260
|
+
attribute :width, Integer
|
261
|
+
attribute :height, Integer
|
262
|
+
attribute :type, String
|
263
|
+
attribute :media, String
|
264
|
+
|
265
|
+
text_node :url, String
|
266
|
+
end # OpenMenu::Menu::Group::Item::Image
|
267
|
+
has_many :images, Image
|
268
|
+
|
269
|
+
class Size
|
270
|
+
include HappyMapper
|
271
|
+
tag 'menu_item_size'
|
272
|
+
|
273
|
+
element :name, String, :tag => 'menu_item_size_name'
|
274
|
+
element :description, String, :tag => 'menu_item_size_description'
|
275
|
+
element :price, Float, :tag => 'menu_item_size_price'
|
276
|
+
element :calories, Integer, :tag => 'menu_item_size_calories'
|
277
|
+
end
|
278
|
+
has_many :sizes, Size
|
279
|
+
|
280
|
+
class Option
|
281
|
+
include HappyMapper
|
282
|
+
tag 'menu_item_option'
|
283
|
+
|
284
|
+
attribute :name, String
|
285
|
+
attribute :min_selected, Integer
|
286
|
+
attribute :max_selected, Integer
|
287
|
+
|
288
|
+
element :information, String, :tag => 'menu_item_option_information'
|
289
|
+
|
290
|
+
class Item
|
291
|
+
include HappyMapper
|
292
|
+
tag 'menu_item_option_item'
|
293
|
+
|
294
|
+
element :name, String, :tag => 'menu_item_option_name'
|
295
|
+
element :additional_cost, Float, :tag => 'menu_item_option_additional_cost'
|
296
|
+
end # OpenMenu::Menu::Group::Item::Option::Item
|
297
|
+
has_many :items, Item
|
298
|
+
|
299
|
+
end # OpenMenu::Menu::Group::Item::Option
|
300
|
+
has_many :options, Option
|
301
|
+
|
302
|
+
has_many :tags, String, :tag => 'menu_item_tag', :deep => true
|
303
|
+
|
304
|
+
end # OpenMenu::Menu::Group::Item
|
305
|
+
has_many :items, Item
|
306
|
+
|
307
|
+
end # OpenMenu::Menu::Group
|
308
|
+
has_many :groups, Group
|
309
|
+
|
310
|
+
end # OpenMenu::Menu
|
311
|
+
has_many :menus, Menu, :xpath => '//menus'
|
312
|
+
|
313
|
+
end # OpenMenu
|
data/lib/openmenu.rb
ADDED
data/test/sample.xml
ADDED
@@ -0,0 +1,293 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2
|
+
<omf uuid="sample" date_created="2011-08-19" accuracy="1">
|
3
|
+
<openmenu>
|
4
|
+
<version>1.5</version>
|
5
|
+
<crosswalks>
|
6
|
+
</crosswalks>
|
7
|
+
</openmenu>
|
8
|
+
<restaurant_info>
|
9
|
+
<restaurant_name>My Restaurant</restaurant_name>
|
10
|
+
<business_type>independent</business_type>
|
11
|
+
<brief_description>Sample restaurant in the OpenMenu Format standard</brief_description>
|
12
|
+
<full_description>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum ac libero neque, quis laoreet dolor. Proin vitae erat lacus.
|
13
|
+
|
14
|
+
Aliquam sed lectus ligula, sed pharetra tortor. Nam rutrum ipsum ut quam vestibulum vestibulum. Ut posuere rhoncus quam, id semper ligula bibendum quis. Vestibulum accumsan, neque id tristique accumsan, risus diam vehicula massa, at facilisis ligula tortor et elit. Nulla facilisi. Mauris ultrices volutpat lorem eu convallis. </full_description>
|
15
|
+
<location_id>x123z</location_id>
|
16
|
+
<longitude>-81.039833</longitude>
|
17
|
+
<latitude>33.999458</latitude>
|
18
|
+
<utc_offset>-5.00</utc_offset>
|
19
|
+
<address_1>803 Gervais Street</address_1>
|
20
|
+
<address_2></address_2>
|
21
|
+
<city_town>Columbia</city_town>
|
22
|
+
<state_province>SC</state_province>
|
23
|
+
<postal_code>29202</postal_code>
|
24
|
+
<country>US</country>
|
25
|
+
<region_area></region_area>
|
26
|
+
<phone>(555) 555-5555</phone>
|
27
|
+
<fax>(555) 888-8888</fax>
|
28
|
+
<website_url>http://openmenu.com/</website_url>
|
29
|
+
<omf_file_url>http://openmenu.com/menu/sample</omf_file_url>
|
30
|
+
<logo_urls>
|
31
|
+
<logo_url type="Thumbnail" media="All">http://openmenu.com/images/ico-32-openmenu.png</logo_url>
|
32
|
+
<logo_url type="Full" media="All">http://openmenu.com/images/sample_logo_full.png</logo_url>
|
33
|
+
</logo_urls>
|
34
|
+
<environment>
|
35
|
+
<seating_qty></seating_qty>
|
36
|
+
<max_group_size>12</max_group_size>
|
37
|
+
<age_level_preference></age_level_preference>
|
38
|
+
<smoking_allowed>0</smoking_allowed>
|
39
|
+
<takeout_available>1</takeout_available>
|
40
|
+
<delivery_available radius="" fee=""></delivery_available>
|
41
|
+
<catering_available></catering_available>
|
42
|
+
<reservations></reservations>
|
43
|
+
<alcohol_type></alcohol_type>
|
44
|
+
<music_type></music_type>
|
45
|
+
<pets_allowed>0</pets_allowed>
|
46
|
+
<wheelchair_accessible></wheelchair_accessible>
|
47
|
+
<dress_code>casual</dress_code>
|
48
|
+
<cuisine_type_primary>Steakhouse</cuisine_type_primary>
|
49
|
+
<cuisine_type_secondary></cuisine_type_secondary>
|
50
|
+
<seating_locations>
|
51
|
+
<seating_location>outdoor</seating_location>
|
52
|
+
<seating_location>indoor</seating_location>
|
53
|
+
</seating_locations>
|
54
|
+
<accepted_currencies>
|
55
|
+
<accepted_currency>USD</accepted_currency>
|
56
|
+
</accepted_currencies>
|
57
|
+
<online_reservations>
|
58
|
+
</online_reservations>
|
59
|
+
<online_ordering>
|
60
|
+
</online_ordering>
|
61
|
+
<operating_days>
|
62
|
+
<operating_day>
|
63
|
+
<day_of_week>1</day_of_week>
|
64
|
+
<open_time>11:00</open_time>
|
65
|
+
<close_time>22:00</close_time>
|
66
|
+
</operating_day>
|
67
|
+
<operating_day>
|
68
|
+
<day_of_week>2</day_of_week>
|
69
|
+
<open_time>11:00</open_time>
|
70
|
+
<close_time>22:00</close_time>
|
71
|
+
</operating_day>
|
72
|
+
<operating_day>
|
73
|
+
<day_of_week>3</day_of_week>
|
74
|
+
<open_time>11:00</open_time>
|
75
|
+
<close_time>22:00</close_time>
|
76
|
+
</operating_day>
|
77
|
+
<operating_day>
|
78
|
+
<day_of_week>4</day_of_week>
|
79
|
+
<open_time>11:00</open_time>
|
80
|
+
<close_time>22:00</close_time>
|
81
|
+
</operating_day>
|
82
|
+
<operating_day>
|
83
|
+
<day_of_week>5</day_of_week>
|
84
|
+
<open_time>11:00</open_time>
|
85
|
+
<close_time>22:00</close_time>
|
86
|
+
</operating_day>
|
87
|
+
<operating_day>
|
88
|
+
<day_of_week>6</day_of_week>
|
89
|
+
<open_time>11:00</open_time>
|
90
|
+
<close_time>22:00</close_time>
|
91
|
+
</operating_day>
|
92
|
+
<operating_day>
|
93
|
+
<day_of_week>7</day_of_week>
|
94
|
+
<open_time></open_time>
|
95
|
+
<close_time></close_time>
|
96
|
+
</operating_day>
|
97
|
+
</operating_days>
|
98
|
+
<parking></parking>
|
99
|
+
</environment>
|
100
|
+
<contacts>
|
101
|
+
<contact type="primary">
|
102
|
+
<first_name>Chris</first_name>
|
103
|
+
<last_name>Hanscom</last_name>
|
104
|
+
<email>menu@openmenu.com</email>
|
105
|
+
</contact>
|
106
|
+
</contacts>
|
107
|
+
<parent_company>
|
108
|
+
<parent_company_name></parent_company_name>
|
109
|
+
<parent_company_website></parent_company_website>
|
110
|
+
<address_1></address_1>
|
111
|
+
<address_2></address_2>
|
112
|
+
<city_town></city_town>
|
113
|
+
<state_province></state_province>
|
114
|
+
<postal_code></postal_code>
|
115
|
+
<country></country>
|
116
|
+
<phone></phone>
|
117
|
+
<fax></fax>
|
118
|
+
</parent_company>
|
119
|
+
</restaurant_info>
|
120
|
+
<menus>
|
121
|
+
<menu name="Main Menu" currency_symbol="USD" uid="25">
|
122
|
+
<menu_description></menu_description>
|
123
|
+
<menu_duration>
|
124
|
+
<menu_duration_name>lunch-dinner</menu_duration_name>
|
125
|
+
<menu_duration_time_start>11:00</menu_duration_time_start>
|
126
|
+
<menu_duration_time_end>22:00</menu_duration_time_end>
|
127
|
+
</menu_duration>
|
128
|
+
<menu_groups>
|
129
|
+
<menu_group name="Appetizers" uid="2">
|
130
|
+
<menu_group_description></menu_group_description>
|
131
|
+
<menu_items>
|
132
|
+
<menu_item>
|
133
|
+
<menu_item_name>Coconut Shrimp</menu_item_name>
|
134
|
+
<menu_item_description>Crispy Coconut Shrimp & tangy mango lime sauce</menu_item_description>
|
135
|
+
<menu_item_price>7.95</menu_item_price>
|
136
|
+
<menu_item_calories>350</menu_item_calories>
|
137
|
+
<menu_item_image_urls>
|
138
|
+
<menu_item_image_url width="" height="" type="Thumbnail" media="Web">http://openmenu.com/images/coconut_shrimp.jpg</menu_item_image_url>
|
139
|
+
</menu_item_image_urls>
|
140
|
+
</menu_item>
|
141
|
+
<menu_item>
|
142
|
+
<menu_item_name>Tempura Onion Rings</menu_item_name>
|
143
|
+
<menu_item_description>With a honey Thai sauce</menu_item_description>
|
144
|
+
<menu_item_price>7.95</menu_item_price>
|
145
|
+
<menu_item_heat_index>1</menu_item_heat_index>
|
146
|
+
</menu_item>
|
147
|
+
<menu_item special="special">
|
148
|
+
<menu_item_name>Calamari</menu_item_name>
|
149
|
+
<menu_item_description>Our calamari is lightly fried and tossed with a sweet and spicy Asian mango sauce.</menu_item_description>
|
150
|
+
<menu_item_price></menu_item_price>
|
151
|
+
<menu_item_heat_index>2</menu_item_heat_index>
|
152
|
+
<menu_item_sizes>
|
153
|
+
<menu_item_size>
|
154
|
+
<menu_item_size_name>small</menu_item_size_name>
|
155
|
+
<menu_item_size_description></menu_item_size_description>
|
156
|
+
<menu_item_size_price>6.95</menu_item_size_price>
|
157
|
+
</menu_item_size>
|
158
|
+
<menu_item_size>
|
159
|
+
<menu_item_size_name>large</menu_item_size_name>
|
160
|
+
<menu_item_size_description></menu_item_size_description>
|
161
|
+
<menu_item_size_price>8.95</menu_item_size_price>
|
162
|
+
</menu_item_size>
|
163
|
+
</menu_item_sizes>
|
164
|
+
</menu_item>
|
165
|
+
</menu_items>
|
166
|
+
</menu_group>
|
167
|
+
<menu_group name="Salads" uid="3">
|
168
|
+
<menu_group_description></menu_group_description>
|
169
|
+
<menu_group_options>
|
170
|
+
<menu_group_option name="Dressings">
|
171
|
+
<menu_group_option_information></menu_group_option_information>
|
172
|
+
<menu_group_option_item>
|
173
|
+
<menu_group_option_name>Italian</menu_group_option_name>
|
174
|
+
<menu_group_option_additional_cost>1.00</menu_group_option_additional_cost>
|
175
|
+
</menu_group_option_item>
|
176
|
+
<menu_group_option_item>
|
177
|
+
<menu_group_option_name>French</menu_group_option_name>
|
178
|
+
<menu_group_option_additional_cost>1.25</menu_group_option_additional_cost>
|
179
|
+
</menu_group_option_item>
|
180
|
+
<menu_group_option_item>
|
181
|
+
<menu_group_option_name>Thousand Island</menu_group_option_name>
|
182
|
+
<menu_group_option_additional_cost>1.00</menu_group_option_additional_cost>
|
183
|
+
</menu_group_option_item>
|
184
|
+
</menu_group_option>
|
185
|
+
</menu_group_options>
|
186
|
+
<menu_items>
|
187
|
+
<menu_item>
|
188
|
+
<menu_item_name>Chef Salad</menu_item_name>
|
189
|
+
<menu_item_description>Best chef salad in a 20 mile radius</menu_item_description>
|
190
|
+
<menu_item_price></menu_item_price>
|
191
|
+
<menu_item_sizes>
|
192
|
+
<menu_item_size>
|
193
|
+
<menu_item_size_name>half</menu_item_size_name>
|
194
|
+
<menu_item_size_description></menu_item_size_description>
|
195
|
+
<menu_item_size_price>6.95</menu_item_size_price>
|
196
|
+
</menu_item_size>
|
197
|
+
<menu_item_size>
|
198
|
+
<menu_item_size_name>full</menu_item_size_name>
|
199
|
+
<menu_item_size_description></menu_item_size_description>
|
200
|
+
<menu_item_size_price>8.95</menu_item_size_price>
|
201
|
+
</menu_item_size>
|
202
|
+
</menu_item_sizes>
|
203
|
+
</menu_item>
|
204
|
+
<menu_item special="special">
|
205
|
+
<menu_item_name>Cobb Salad</menu_item_name>
|
206
|
+
<menu_item_description>Iceberg lettuce topped with turkey, ham, hard cooked eggs, avocado, diced tomatoes, bacon, bleu cheese crumbles and black olives</menu_item_description>
|
207
|
+
<menu_item_price></menu_item_price>
|
208
|
+
<menu_item_sizes>
|
209
|
+
<menu_item_size>
|
210
|
+
<menu_item_size_name>half</menu_item_size_name>
|
211
|
+
<menu_item_size_description></menu_item_size_description>
|
212
|
+
<menu_item_size_price>6.95</menu_item_size_price>
|
213
|
+
</menu_item_size>
|
214
|
+
<menu_item_size>
|
215
|
+
<menu_item_size_name>full</menu_item_size_name>
|
216
|
+
<menu_item_size_description></menu_item_size_description>
|
217
|
+
<menu_item_size_price>8.95</menu_item_size_price>
|
218
|
+
</menu_item_size>
|
219
|
+
</menu_item_sizes>
|
220
|
+
</menu_item>
|
221
|
+
<menu_item>
|
222
|
+
<menu_item_name>Ceasar Salad</menu_item_name>
|
223
|
+
<menu_item_description>Fresh romain lettuce with aged parmesan reggiano</menu_item_description>
|
224
|
+
<menu_item_price>9.95</menu_item_price>
|
225
|
+
</menu_item>
|
226
|
+
<menu_item vegetarian="vegetarian">
|
227
|
+
<menu_item_name>Garden Salad</menu_item_name>
|
228
|
+
<menu_item_description>Filled with lettuce, tomatoes, carrots, radishes, cucumbers and shredded cheese</menu_item_description>
|
229
|
+
<menu_item_price>8.95</menu_item_price>
|
230
|
+
</menu_item>
|
231
|
+
</menu_items>
|
232
|
+
</menu_group>
|
233
|
+
<menu_group name="Entrees" uid="1">
|
234
|
+
<menu_group_description></menu_group_description>
|
235
|
+
<menu_items>
|
236
|
+
<menu_item uid="1">
|
237
|
+
<menu_item_name>Rack of Lamb</menu_item_name>
|
238
|
+
<menu_item_description>Coffee Citrus Crusted Lamb </menu_item_description>
|
239
|
+
<menu_item_price>22.95</menu_item_price>
|
240
|
+
</menu_item>
|
241
|
+
<menu_item uid="2">
|
242
|
+
<menu_item_name>Soft Shell Crabs</menu_item_name>
|
243
|
+
<menu_item_description>Almond encrusted, seasoned and sauteed in butter to a crispy brown</menu_item_description>
|
244
|
+
<menu_item_price>19.95</menu_item_price>
|
245
|
+
<menu_item_allergy_information allergens="shellfish, nuts">Reference allergens for allergy information</menu_item_allergy_information>
|
246
|
+
</menu_item>
|
247
|
+
<menu_item uid="3" special="special">
|
248
|
+
<menu_item_name>Cioppino</menu_item_name>
|
249
|
+
<menu_item_description>Fresh fish, scallops, mussels, calamari, and shrimp in a tomato-garlic saffron broth over linguini</menu_item_description>
|
250
|
+
<menu_item_price>24.95</menu_item_price>
|
251
|
+
</menu_item>
|
252
|
+
</menu_items>
|
253
|
+
</menu_group>
|
254
|
+
</menu_groups>
|
255
|
+
</menu>
|
256
|
+
<menu name="Late Night Menu" currency_symbol="USD" uid="35">
|
257
|
+
<menu_description></menu_description>
|
258
|
+
<menu_duration>
|
259
|
+
<menu_duration_name>late-night</menu_duration_name>
|
260
|
+
<menu_duration_time_start>20:00</menu_duration_time_start>
|
261
|
+
<menu_duration_time_end>23:00</menu_duration_time_end>
|
262
|
+
</menu_duration>
|
263
|
+
<menu_groups>
|
264
|
+
<menu_group name="Bar Food" uid="1">
|
265
|
+
<menu_group_description></menu_group_description>
|
266
|
+
<menu_items>
|
267
|
+
<menu_item>
|
268
|
+
<menu_item_name>Cheese Sticks</menu_item_name>
|
269
|
+
<menu_item_description>Cheese sticks with marinara sauce</menu_item_description>
|
270
|
+
<menu_item_price>6.95</menu_item_price>
|
271
|
+
</menu_item>
|
272
|
+
<menu_item>
|
273
|
+
<menu_item_name>Coconut Shrimp</menu_item_name>
|
274
|
+
<menu_item_description>Crispy Coconut Shrimp</menu_item_description>
|
275
|
+
<menu_item_price>7.95</menu_item_price>
|
276
|
+
<menu_item_calories>350</menu_item_calories>
|
277
|
+
</menu_item>
|
278
|
+
<menu_item>
|
279
|
+
<menu_item_name>Tempura Onion Rings</menu_item_name>
|
280
|
+
<menu_item_description>With a honey Thai sauce</menu_item_description>
|
281
|
+
<menu_item_price>7.95</menu_item_price>
|
282
|
+
</menu_item>
|
283
|
+
<menu_item>
|
284
|
+
<menu_item_name>Calamari</menu_item_name>
|
285
|
+
<menu_item_description>Our calamari is lightly fried and tossed with a sweet and spicy Asian mango sauce.</menu_item_description>
|
286
|
+
<menu_item_price>8.85</menu_item_price>
|
287
|
+
</menu_item>
|
288
|
+
</menu_items>
|
289
|
+
</menu_group>
|
290
|
+
</menu_groups>
|
291
|
+
</menu>
|
292
|
+
</menus>
|
293
|
+
</omf>
|