masticate 0.1.4 → 0.1.5
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.
- package/lib/attributes.js +13 -38
- package/lib/canonical_url_parser.js +7 -17
- package/lib/data_vocabulary_recipe_parser.js +14 -35
- package/lib/hrecipe_parser.js +14 -47
- package/lib/hrecipe_parser.spec.js +52 -67
- package/lib/html_recipe_parser.js +13 -34
- package/lib/index.js +39 -95
- package/lib/non_standard/all_recipes_parser.js +17 -35
- package/lib/non_standard/all_recipes_parser.spec.js +53 -66
- package/lib/non_standard/chowhound_parser.js +14 -36
- package/lib/non_standard/chowhound_parser.spec.js +53 -64
- package/lib/non_standard/epicurious_parser.js +18 -38
- package/lib/non_standard/epicurious_parser.spec.js +42 -55
- package/lib/recipe.js +7 -15
- package/lib/recipe_parser.js +9 -27
- package/lib/schema_org_json_recipe_parser.js +18 -53
- package/lib/schema_org_json_recipe_parser.spec.js +162 -206
- package/lib/schema_org_recipe_parser.js +14 -47
- package/lib/schema_org_recipe_parser.spec.js +53 -68
- package/package.json +6 -6
@@ -1,52 +1,33 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
-
function _typeof(
|
4
|
-
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
6
5
|
value: true
|
7
6
|
});
|
8
7
|
exports.SchemaOrgRecipeParser = void 0;
|
9
|
-
|
10
8
|
var _recipe = require("./recipe");
|
11
|
-
|
12
9
|
var _html_recipe_parser = require("./html_recipe_parser");
|
13
|
-
|
14
10
|
var _cheerio = _interopRequireDefault(require("cheerio"));
|
15
|
-
|
16
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
17
|
-
|
18
12
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
19
|
-
|
20
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
21
|
-
|
13
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
22
14
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
23
|
-
|
24
|
-
function
|
25
|
-
|
26
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
27
|
-
|
28
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
29
|
-
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
16
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
17
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
30
18
|
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
31
|
-
|
32
19
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
33
|
-
|
34
|
-
function
|
35
|
-
|
36
|
-
function
|
37
|
-
|
38
|
-
var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
39
|
-
_inherits(SchemaOrgRecipeParser, _HtmlRecipeParser);
|
40
|
-
|
41
|
-
var _super = _createSuper(SchemaOrgRecipeParser);
|
42
|
-
|
20
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
21
|
+
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
22
|
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
23
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
24
|
+
var SchemaOrgRecipeParser = exports.SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
43
25
|
function SchemaOrgRecipeParser() {
|
44
26
|
_classCallCheck(this, SchemaOrgRecipeParser);
|
45
|
-
|
46
|
-
return _super.apply(this, arguments);
|
27
|
+
return _callSuper(this, SchemaOrgRecipeParser, arguments);
|
47
28
|
}
|
48
|
-
|
49
|
-
_createClass(SchemaOrgRecipeParser, [{
|
29
|
+
_inherits(SchemaOrgRecipeParser, _HtmlRecipeParser);
|
30
|
+
return _createClass(SchemaOrgRecipeParser, [{
|
50
31
|
key: "nodes_with_itemprop",
|
51
32
|
value: function nodes_with_itemprop(itemprop) {
|
52
33
|
return this.recipe_node.find("[itemprop = \"".concat(itemprop, "\"]"));
|
@@ -74,7 +55,6 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
74
55
|
key: "parse_author",
|
75
56
|
value: function parse_author() {
|
76
57
|
var node = this.node_with_itemprop("author");
|
77
|
-
|
78
58
|
if (node.attr("itemtype") == "http://schema.org/Person") {
|
79
59
|
return node.find('[itemprop = "name" ]').first().text();
|
80
60
|
} else {
|
@@ -91,7 +71,6 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
91
71
|
key: "parse_image_url",
|
92
72
|
value: function parse_image_url() {
|
93
73
|
var node = this.node_with_itemprop("image");
|
94
|
-
|
95
74
|
if (node.attr("src")) {
|
96
75
|
return node.attr("src");
|
97
76
|
} else {
|
@@ -105,7 +84,6 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
105
84
|
var nodes = this.nodes_with_itemprop(this.constructor.ingredient_itemprop);
|
106
85
|
nodes.each(function (i, node) {
|
107
86
|
var $node = (0, _cheerio["default"])(node);
|
108
|
-
|
109
87
|
if ($node) {
|
110
88
|
ingredients.push($node.text());
|
111
89
|
}
|
@@ -119,7 +97,6 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
119
97
|
var nodes = this.nodes_with_itemprop("recipeInstructions");
|
120
98
|
nodes.each(function (i, node) {
|
121
99
|
var $node = (0, _cheerio["default"])(node);
|
122
|
-
|
123
100
|
if ($node) {
|
124
101
|
var text = $node.text();
|
125
102
|
if (!inst || !inst.indexOf(text)) inst += text + "\n";
|
@@ -155,25 +132,21 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
155
132
|
value: function parse_time(type) {
|
156
133
|
var node = this.node_with_itemprop(type);
|
157
134
|
var iso8601_string = null;
|
158
|
-
|
159
135
|
if (node.attr("content")) {
|
160
136
|
iso8601_string = node.attr("content");
|
161
137
|
} else {
|
162
138
|
iso8601_string = node.attr("datetime");
|
163
139
|
}
|
164
|
-
|
165
140
|
return this.parse_duration(iso8601_string);
|
166
141
|
}
|
167
142
|
}, {
|
168
143
|
key: "parse_published_date",
|
169
144
|
value: function parse_published_date() {
|
170
145
|
var node = this.node_with_itemprop("datePublished");
|
171
|
-
|
172
146
|
if (node.attr("content")) {
|
173
147
|
var content = node.attr("content").trim();
|
174
148
|
return content ? Date.parse(content) : null;
|
175
149
|
}
|
176
|
-
|
177
150
|
return null;
|
178
151
|
}
|
179
152
|
}, {
|
@@ -195,13 +168,11 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
195
168
|
key: "parse_yield",
|
196
169
|
value: function parse_yield() {
|
197
170
|
var node = this.node_with_itemprop("recipeYield");
|
198
|
-
|
199
171
|
if (node.attr("content")) {
|
200
172
|
return node.attr("content");
|
201
173
|
} else if (node.text()) {
|
202
174
|
return node.text();
|
203
175
|
}
|
204
|
-
|
205
176
|
return null;
|
206
177
|
}
|
207
178
|
}], [{
|
@@ -220,8 +191,4 @@ var SchemaOrgRecipeParser = /*#__PURE__*/function (_HtmlRecipeParser) {
|
|
220
191
|
return "ingredients";
|
221
192
|
}
|
222
193
|
}]);
|
223
|
-
|
224
|
-
return SchemaOrgRecipeParser;
|
225
|
-
}(_html_recipe_parser.HtmlRecipeParser);
|
226
|
-
|
227
|
-
exports.SchemaOrgRecipeParser = SchemaOrgRecipeParser;
|
194
|
+
}(_html_recipe_parser.HtmlRecipeParser);
|
@@ -1,90 +1,75 @@
|
|
1
1
|
"use strict";
|
2
2
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
3
4
|
var _index = require("./index");
|
4
|
-
|
5
5
|
var _schema_org_recipe_parser = require("./schema_org_recipe_parser");
|
6
|
-
|
7
6
|
var _cheerio = _interopRequireDefault(require("cheerio"));
|
8
|
-
|
9
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
10
|
-
|
8
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
11
9
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
12
|
-
|
13
10
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
14
|
-
|
15
11
|
var expect = require("chai").expect;
|
16
|
-
|
17
12
|
var html = "<!DOCTYPE html>" + "<html>" + "<body>" + "<div itemscope itemtype=\"http://schema.org/Recipe\">" + "<span itemprop=\"name\">My Famous Breakfast</span>" + "By <span itemprop=\"author\">John Smith</span>," + "<meta itemprop=\"datePublished\" content=\"2018-02-14\">Feb 10, 2018" + "<img itemprop=\"image\" src=\"banana.jpg\" />" + "<span itemprop=\"description\">This is a fruit</span>" + "Prep Time: <meta itemprop=\"prepTime\" content=\"PT15M\">15 minutes" + "Cook time: <meta itemprop=\"cookTime\" content=\"PT1H\">1 hour" + "Yield: <span itemprop=\"recipeYield\">1 fruit</span>" + "<div itemprop=\"nutrition\" itemscope itemtype=\"http://schema.org/NutritionInformation\">" + "Nutrition facts:" + "<span itemprop=\"calories\">240 calories</span>," + "<span itemprop=\"fatContent\">9 grams fat</span>" + "</div>" + "Ingredients:" + "- <span itemprop=\"ingredients\">1 ripe bananas</span>" + "- <span itemprop=\"ingredients\">Melted Chocolate</span>" + "Instructions:" + "<span itemprop=\"recipeInstructions\">Eat the banana.</span>" + "140 comments:" + "<meta itemprop=\"interactionCount\" content=\"UserComments:140\" />" + "From Janel, May 5 -- thank you, great recipe!" + "</div>" + "</body>" + "</html>";
|
18
13
|
describe("Schema.org Recipe Parser", function () {
|
19
14
|
describe("With no content", function () {
|
20
|
-
it("sets all values to null", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/
|
15
|
+
it("sets all values to null", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
21
16
|
var parser, rec;
|
22
|
-
return
|
23
|
-
while (1) {
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
case 16:
|
46
|
-
case "end":
|
47
|
-
return _context.stop();
|
48
|
-
}
|
17
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
18
|
+
while (1) switch (_context.prev = _context.next) {
|
19
|
+
case 0:
|
20
|
+
parser = new _schema_org_recipe_parser.SchemaOrgRecipeParser(_cheerio["default"].load(""));
|
21
|
+
_context.next = 3;
|
22
|
+
return parser.parse();
|
23
|
+
case 3:
|
24
|
+
rec = _context.sent;
|
25
|
+
expect(rec.canonical_url).to.equal(null);
|
26
|
+
expect(rec.cook_time).to.equal(null);
|
27
|
+
expect(rec.description).to.equal(null);
|
28
|
+
expect(rec.image_url).to.equal(null);
|
29
|
+
expect(rec.ingredients).to.be.a("Array");
|
30
|
+
expect(rec.ingredients.length).to.equal(0);
|
31
|
+
expect(rec.instructions).to.equal(null);
|
32
|
+
expect(rec.name).to.equal(null);
|
33
|
+
expect(rec.prep_time).to.equal(null);
|
34
|
+
expect(rec.published_date).to.equal(null);
|
35
|
+
expect(rec.total_time).to.equal(null);
|
36
|
+
expect(rec["yield"]).to.equal(null);
|
37
|
+
case 16:
|
38
|
+
case "end":
|
39
|
+
return _context.stop();
|
49
40
|
}
|
50
41
|
}, _callee);
|
51
42
|
})));
|
52
43
|
});
|
53
44
|
describe("With a valid document", function () {
|
54
|
-
it("sets all values", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/
|
45
|
+
it("sets all values", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
55
46
|
var rec, expected, i;
|
56
|
-
return
|
57
|
-
while (1) {
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
expected
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
expect(rec.nutrition.total_fat).to.equal('9 grams fat');
|
83
|
-
|
84
|
-
case 17:
|
85
|
-
case "end":
|
86
|
-
return _context2.stop();
|
87
|
-
}
|
47
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
48
|
+
while (1) switch (_context2.prev = _context2.next) {
|
49
|
+
case 0:
|
50
|
+
_context2.next = 2;
|
51
|
+
return _index.Masticate.parse(html);
|
52
|
+
case 2:
|
53
|
+
rec = _context2.sent;
|
54
|
+
expect(rec.author).to.equal("John Smith");
|
55
|
+
expect(rec.cook_time).to.equal(60);
|
56
|
+
expect(rec.description).to.equal("This is a fruit");
|
57
|
+
expect(rec.image_url).to.equal("banana.jpg");
|
58
|
+
expect(rec.ingredients.length).to.equal(2);
|
59
|
+
expected = ["1 ripe bananas", "Melted Chocolate"];
|
60
|
+
for (i = 0; i > rec.ingredients.length; i++) {
|
61
|
+
expect(rec.ingredients[i]).to.equal([expected[i]]);
|
62
|
+
}
|
63
|
+
expect(rec.instructions).to.equal("Eat the banana.");
|
64
|
+
expect(rec.name).to.equal("My Famous Breakfast");
|
65
|
+
expect(rec.prep_time).to.equal(15);
|
66
|
+
expect(rec.published_date).to.equal(Date.parse("2018-02-14"));
|
67
|
+
expect(rec["yield"]).to.equal("1 fruit");
|
68
|
+
expect(rec.nutrition.calories).to.equal('240 calories');
|
69
|
+
expect(rec.nutrition.total_fat).to.equal('9 grams fat');
|
70
|
+
case 17:
|
71
|
+
case "end":
|
72
|
+
return _context2.stop();
|
88
73
|
}
|
89
74
|
}, _callee2);
|
90
75
|
})));
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "masticate",
|
3
|
-
"version": "0.1.
|
3
|
+
"version": "0.1.5",
|
4
4
|
"description": "Chews up HTML, spits out recipes. A library to extract recipe microformats from HTML documents. Inspired by the Ruby GEM hangry.",
|
5
5
|
"keywords": [
|
6
6
|
"module",
|
@@ -36,11 +36,11 @@
|
|
36
36
|
"urijs": "^1.19.6"
|
37
37
|
},
|
38
38
|
"devDependencies": {
|
39
|
-
"@babel/cli": "^7.
|
40
|
-
"@babel/core": "^7.
|
41
|
-
"@babel/eslint-parser": "^7.
|
42
|
-
"@babel/preset-env": "^7.
|
43
|
-
"@babel/register": "^7.
|
39
|
+
"@babel/cli": "^7.23.2",
|
40
|
+
"@babel/core": "^7.23.2",
|
41
|
+
"@babel/eslint-parser": "^7.23.2",
|
42
|
+
"@babel/preset-env": "^7.23.2",
|
43
|
+
"@babel/register": "^7.23.2",
|
44
44
|
"chai": "^4.3.4",
|
45
45
|
"eslint": "^8.6.0",
|
46
46
|
"eslint-plugin-prefer-arrow": "^1.2.3",
|