UNPKG

2.8 kBJavaScriptView Raw
1const dom = require('./dom');
2
3const SELECTOR_LIST = 'ol, ul';
4const SELECTOR_LINK = '> a, p > a';
5const SELECTOR_PART = 'h2, h3, h4';
6
7function findList($parent) {
8 let $container = $parent.children('.olist');
9 if ($container.length > 0) $parent = $container.first();
10
11 return $parent.children(SELECTOR_LIST);
12}
13
14function parseList($ul, $) {
15 let items = [];
16
17 $ul.children('li').each(function() {
18 let article = {};
19 let $li = $(this);
20 let $p = $li.children('p');
21 article.title = ($p.text() || dom.textNode($li.get(0))).trim();
22
23 let $a = $li.find(SELECTOR_LINK);
24 if ($a.length > 0) {
25 article.title = $a.first().text();
26 article.ref = $a.attr('href').replace(/\\/g, '/').replace(/^\/+/, '');
27 }
28
29 let $sub = findList($li);
30 article.items = parseList($sub, $);
31
32 if (!article.title) return;
33 items.push(article);
34 });
35
36 return items;
37}
38
39function findParts($parent, $) {
40 let partsAndLists = $parent.children(SELECTOR_LIST + ', ' + SELECTOR_PART);
41
42 let parts = [];
43 let previousPart = null;
44
45 partsAndLists.each(function (i, el) {
46 if (isPartNode(el)) {
47 if (previousPart !== null) {
48 parts.push(previousPart);
49 }
50 previousPart = {
51 title: getPartTitle(el, $),
52 list: null
53 };
54
55 } else {
56 if (previousPart !== null) {
57 previousPart.list = el;
58 } else {
59 previousPart = {
60 title: '',
61 list: el
62 };
63 }
64 parts.push(previousPart);
65 previousPart = null;
66 }
67 });
68
69 if (previousPart !== null) {
70 parts.push(previousPart);
71 }
72
73 return parts;
74}
75
76function isPartNode(el) {
77 return SELECTOR_PART.indexOf(el.name) !== -1;
78}
79
80
81function getPartTitle(el, $) {
82 return $(el).text().trim();
83}
84
85function parseMenu($) {
86
87 let $root = dom.cleanup(dom.root($), $);
88
89 let parts = findParts($root, $);
90
91 let parsedParts = [];
92 let part;
93 for (let i = 0; i < parts.length; ++i) {
94 part = parts[i];
95 parsedParts.push({
96 title: part.title,
97 items: parseList($(part.list), $)
98 });
99 }
100
101 return parsedParts;
102}
103
104function parseTitleAndLogo($){
105
106 let $title = $('h1:first-child');
107 let $logo = $('p>img:first-child').first();
108 let data = {
109 title: $title.text().trim(),
110 logo: $logo.attr('src')
111 }
112 $title.remove();
113 $logo.remove();
114 return data;
115}
116
117function parseNav(html){
118 let $ = dom.parse(html);
119 let data = parseTitleAndLogo($);
120 data.menus = parseMenu($)
121 return data;
122}
123
124module.exports = parseNav;