|
1 | 1 | "use strict";
|
2 | 2 |
|
3 | 3 | /**
|
4 |
| - * div.FileTreeを整形する |
| 4 | + * div.Treeを整形する |
5 | 5 | *
|
6 | 6 | * @param {HTMLDocument} $
|
7 | 7 | * cheerio
|
8 | 8 | */
|
9 | 9 | module.exports = function ($) {
|
10 |
| - $(".FileTree").each(function () { |
| 10 | + $(".Tree").each(function () { |
11 | 11 | var $tree = $(this);
|
12 | 12 | $tree.find("li").each(function (idx, el) {
|
13 | 13 | var $li = $(el);
|
14 | 14 | var $ul = $li.find("> ul");
|
15 |
| - var $liTextNode = $li.contents().filter(function () { |
16 |
| - return this.nodeType === 3 || $(this).is("strong"); |
17 |
| - }); |
18 |
| - var liText = $li.text().trim(); |
| 15 | + var $label = $li.contents().not("ul"); |
| 16 | + var labelText = $label.text().trim(); |
19 | 17 |
|
20 | 18 | // ディレクトリを示す場合は末尾に/がある
|
21 |
| - var isDirectory = /\/\s*$/.test(liText); |
| 19 | + var isDirectory = labelText.endsWith("/"); |
| 20 | + var hasChildren = $ul.length > 0; |
22 | 21 |
|
23 |
| - if ($ul.length > 0) { |
| 22 | + // 中身のあるディレクトリの場合は、details/summaryを使う |
| 23 | + // - details要素でulを囲む |
| 24 | + // - summary要素には、li内のul以外の要素をラベルとして入れる |
| 25 | + if (isDirectory && hasChildren) { |
24 | 26 | var $details = $("<details>");
|
25 | 27 | var $summary = $("<summary>");
|
26 | 28 |
|
27 |
| - // - details要素でulを囲む |
28 |
| - // - summaryにli直下の、テキストまたはstrongで囲まれたテキストを入れる |
29 | 29 | $details.append($ul);
|
30 | 30 | $details.attr("open", "true");
|
31 | 31 | $details.prepend($summary);
|
32 |
| - $summary.append($liTextNode); |
| 32 | + $summary.append($label); |
33 | 33 |
|
34 | 34 | $li.prepend($details);
|
35 | 35 | $li.addClass("directory");
|
36 |
| - } else { |
37 |
| - if (isDirectory) { |
38 |
| - // ディレクトリを示すが、中身がない場合は、ファイルが大量にあることを |
39 |
| - // 省略していることを意味するため、中身は ... とする |
40 |
| - var $details = $("<details>"); |
41 |
| - var $summary = $("<summary>"); |
42 |
| - var $emptyContent = $('<ul><li class="file">...</li></ul>'); |
43 |
| - $details.append($emptyContent); |
44 |
| - $details.prepend($summary); |
45 |
| - $summary.append($liTextNode); |
46 |
| - |
47 |
| - $li.prepend($details); |
48 |
| - $li.addClass("directory"); |
49 |
| - } else { |
50 |
| - // ファイルを示す場合は、拡張子をdata属性に持たせ、CSS側で利用する |
51 |
| - var fileExtension = liText.split(".").pop(); |
52 |
| - $li.attr("data-file-type", fileExtension); |
53 |
| - $li.addClass("file"); |
54 |
| - } |
| 36 | + return; |
55 | 37 | }
|
| 38 | + |
| 39 | + // ディレクトリを示すが、中身がない場合は、ファイルが大量にあることを |
| 40 | + // 省略していることを意味するため、中身は ... とする |
| 41 | + if (isDirectory && !hasChildren) { |
| 42 | + var $details = $("<details>"); |
| 43 | + var $summary = $("<summary>"); |
| 44 | + var $emptyContent = $('<ul><li class="file">...</li></ul>'); |
| 45 | + $details.append($emptyContent); |
| 46 | + $details.prepend($summary); |
| 47 | + $summary.append($label); |
| 48 | + |
| 49 | + $li.prepend($details); |
| 50 | + $li.addClass("directory"); |
| 51 | + return; |
| 52 | + } |
| 53 | + |
| 54 | + // ファイルを示す場合は、拡張子をdata属性に持たせ、CSS側で利用する |
| 55 | + var fileExtension = labelText.split(".").pop(); |
| 56 | + $li.attr("data-file-type", fileExtension); |
| 57 | + $li.addClass("file"); |
56 | 58 | });
|
57 | 59 | });
|
58 | 60 | };
|
0 commit comments