1 | const dom = require('./dom');
|
2 |
|
3 | const SELECTOR_LIST = 'ol, ul';
|
4 | const SELECTOR_LINK = '> a, p > a';
|
5 | const SELECTOR_PART = 'h2, h3, h4';
|
6 |
|
7 | function 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 |
|
14 | function 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 |
|
39 | function 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 |
|
76 | function isPartNode(el) {
|
77 | return SELECTOR_PART.indexOf(el.name) !== -1;
|
78 | }
|
79 |
|
80 |
|
81 | function getPartTitle(el, $) {
|
82 | return $(el).text().trim();
|
83 | }
|
84 |
|
85 | function 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 |
|
104 | function 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 |
|
117 | function parseNav(html){
|
118 | let $ = dom.parse(html);
|
119 | let data = parseTitleAndLogo($);
|
120 | data.menus = parseMenu($)
|
121 | return data;
|
122 | }
|
123 |
|
124 | module.exports = parseNav;
|