palicanon.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. var main_tag = "";
  2. var list_tag = new Array();
  3. var currTagLevel0 = new Array();
  4. var allTags = new Array();
  5. var arrMyTerm = new Array();
  6. palicanon_load_term();
  7. function palicanon_onload() {
  8. $("span[tag]").click(function () {
  9. $(this).siblings().removeClass("select");
  10. $(this).addClass("select");
  11. main_tag = $(this).attr("tag");
  12. list_tag = new Array();
  13. tag_changed();
  14. render_tag_list();
  15. });
  16. $("#tag_input").keypress(function () {
  17. tag_render_others();
  18. });
  19. }
  20. function palicanon_load_term() {
  21. $.post(
  22. "../term/get_term_index.php",
  23. {
  24. lang: getCookie("language"),
  25. },
  26. function (data) {
  27. let result = JSON.parse(data);
  28. if (result.status == 0) {
  29. arrMyTerm = result.data;
  30. render_main_tag();
  31. } else {
  32. alert(result.error);
  33. }
  34. }
  35. );
  36. }
  37. function render_main_tag() {
  38. $("#main_tag")
  39. .children()
  40. .each(function () {
  41. $(this).html(tag_get_local_word($(this).attr("tag")));
  42. });
  43. }
  44. function tag_changed() {
  45. let strTags = "";
  46. if (list_tag.length > 0) {
  47. strTags = main_tag + "," + list_tag.join();
  48. } else {
  49. strTags = main_tag;
  50. }
  51. console.log(strTags);
  52. let lang = getCookie("language");
  53. if (lang == "zh-cn") {
  54. lang = "zh-hans";
  55. } else if (lang == "zh-tw") {
  56. lang = "zh-hant";
  57. } else if (lang == "") {
  58. lang = "en";
  59. }
  60. $.get(
  61. "book_tag.php",
  62. {
  63. tag: strTags,
  64. lang: lang,
  65. },
  66. function (data, status) {
  67. let arrBookList = JSON.parse(data);
  68. let html = "";
  69. allTags = new Array();
  70. let arrChapter = new Array();
  71. for (const iterator of arrBookList) {
  72. let tag0 = "";
  73. let tags = iterator.tag.split("::");
  74. let currTag = new Array();
  75. currTag[main_tag] = 1;
  76. for (const scondTag of list_tag) {
  77. currTag[scondTag] = 1;
  78. }
  79. for (let tag of tags) {
  80. if (tag.slice(0, 1) == ":") {
  81. tag = tag.slice(1);
  82. }
  83. if (tag.slice(-1) == ":") {
  84. tag = tag.slice(0, -1);
  85. }
  86. if (currTagLevel0.hasOwnProperty(tag)) {
  87. tag0 = tag;
  88. }
  89. if (!currTag.hasOwnProperty(tag)) {
  90. if (allTags.hasOwnProperty(tag)) {
  91. allTags[tag] += 1;
  92. } else {
  93. allTags[tag] = 1;
  94. }
  95. }
  96. }
  97. if (arrBookList.length < 100 || (arrBookList.length > 100 && iterator.level == 1)) {
  98. arrChapter.push(iterator);
  99. }
  100. }
  101. let newTags = new Array();
  102. for (const oneTag in allTags) {
  103. if (allTags[oneTag] < arrBookList.length) {
  104. newTags[oneTag] = allTags[oneTag];
  105. }
  106. }
  107. allTags = newTags;
  108. allTags.sort(sortNumber);
  109. tag_render_others();
  110. palicanon_chapter_list_apply(0);
  111. $("#list-1").html(render_chapter_list(arrChapter));
  112. }
  113. );
  114. }
  115. function palicanon_load_chapter(book, para, div_index = 1) {
  116. let lang = getCookie("language");
  117. if (lang == "zh-cn") {
  118. lang = "zh-hans";
  119. } else if (lang == "zh-tw") {
  120. lang = "zh-hant";
  121. } else if (lang == "") {
  122. lang = "en";
  123. }
  124. $.get(
  125. "get_chapter_info.php",
  126. {
  127. book: book,
  128. para: para,
  129. lang: lang,
  130. },
  131. function (data, status) {
  132. palicanon_chapter_list_apply(div_index);
  133. let arrChapterInfo = JSON.parse(data);
  134. let html = render_chapter_head(arrChapterInfo, div_index + 1);
  135. $("#chapter_head_" + (parseInt(div_index) + 1)).html(html);
  136. let lang = getCookie("language");
  137. if (lang == "zh-cn") {
  138. lang = "zh-hans";
  139. } else if (lang == "zh-tw") {
  140. lang = "zh-hant";
  141. } else if (lang == "") {
  142. lang = "en";
  143. }
  144. $.get(
  145. "get_chapter_children.php",
  146. {
  147. book: book,
  148. para: para,
  149. lang: lang,
  150. },
  151. function (data, status) {
  152. let arrChapterList = JSON.parse(data);
  153. $("#list-" + (parseInt(div_index) + 1)).html(render_chapter_list(arrChapterList));
  154. //palicanon_chapter_list_apply(arrChapterList, div_index);
  155. }
  156. );
  157. }
  158. );
  159. }
  160. function render_chapter_head(chapter_info, level) {
  161. let html = "";
  162. let link = "../reader/?view=chapter&book=" + chapter_info.book + "&para=" + chapter_info.paragraph;
  163. html += "<div class='title'>";
  164. if (typeof chapter_info.trans_title == "undefined") {
  165. html += " <div class='title_1'><a href='" + link + "' target='_blank'>" + chapter_info.text + "</a></div>";
  166. } else {
  167. html +=
  168. " <div class='title_1'><a href='" + link + "' target='_blank'>" + chapter_info.trans_title + "</a></div>";
  169. }
  170. html += "<div class='title_2'>" + chapter_info.text + "</div>";
  171. html += "</div>";
  172. html += "<div class='res res_more'>";
  173. html += "<h2>译文</h2>";
  174. html += "<div class='progress'>";
  175. if (chapter_info.progress && chapter_info.progress.length > 0) {
  176. let r = 12;
  177. let perimeter = 2 * Math.PI * r;
  178. for (const iterator of chapter_info.progress) {
  179. let stroke1 = parseInt(perimeter * iterator.all_trans);
  180. let stroke2 = perimeter - stroke1;
  181. html += ' <div class="item">';
  182. html += '<svg class="progress_circle" width="30" height="30" viewbox="0,0,30,30">';
  183. html += '<circle class="progress_bg" cx="15" cy="15" r="12" stroke-width="5" fill="none"></circle>';
  184. html +=
  185. '<circle class="progress_color" cx="15" cy="15" r="12" stroke-width="5" fill="none" stroke-dasharray="' +
  186. stroke1 +
  187. " " +
  188. stroke2 +
  189. '"></circle>';
  190. html += "</svg>";
  191. html += "<div class='lang'>" + iterator.lang + "-" + parseInt(iterator.all_trans * 100) + "%</div>";
  192. html += " </div>";
  193. }
  194. } else {
  195. html += "无译文";
  196. }
  197. html += "</div>";
  198. html += "</div>";
  199. return html;
  200. }
  201. function render_chapter_list(chapterList) {
  202. let html = "";
  203. for (const iterator of chapterList) {
  204. html += palicanon_render_chapter_row(iterator);
  205. }
  206. return html;
  207. }
  208. function palicanon_chapter_list_apply(div_index) {
  209. let iDiv = parseInt(div_index);
  210. let html = "";
  211. html += "<div id='chapter_head_" + (iDiv + 1) + "' class='chapter_head'></div>";
  212. html += "<ul id='list-" + (iDiv + 1) + "' class='grid' level='" + (iDiv + 1) + "'>";
  213. /*
  214. for (const iterator of chapterList) {
  215. html += palicanon_render_chapter_row(iterator);
  216. }
  217. */
  218. html += "</ul>";
  219. $("#list_shell_" + (iDiv + 1)).html(html);
  220. $("#list_shell_" + (iDiv + 1)).removeClass();
  221. $("#list_shell_" + (iDiv + 1)).addClass("show");
  222. //隐藏之后的列表
  223. for (let index = iDiv + 2; index <= 8; index++) {
  224. $("#list_shell_" + index).removeClass();
  225. $("#list_shell_" + index).addClass("hidden");
  226. }
  227. //收缩当前的
  228. $("#list-" + iDiv).removeClass();
  229. $("#list-" + iDiv).addClass("list");
  230. $("#list_shell_" + iDiv).removeClass();
  231. $("#list_shell_" + iDiv).addClass("list");
  232. }
  233. function chapter_onclick(obj) {
  234. let book = $(obj).attr("book");
  235. let para = $(obj).attr("para");
  236. let level = $(obj).parent().attr("level");
  237. $(obj).siblings().removeClass("selected");
  238. $(obj).addClass("selected");
  239. $("#tag_list").slideUp();
  240. palicanon_load_chapter(book, para, level);
  241. }
  242. function palicanon_render_chapter_row(chapter) {
  243. let html = "";
  244. let levelClass = "";
  245. if (chapter.level == 1) {
  246. levelClass = " level_1";
  247. }
  248. html +=
  249. '<li class="' +
  250. levelClass +
  251. '" book="' +
  252. chapter.book +
  253. '" para="' +
  254. chapter.para +
  255. '" onclick="chapter_onclick(this)">';
  256. html += '<div class="title">';
  257. if (typeof chapter.trans_title == "undefined") {
  258. html += " <div class='title_1'>" + chapter.title + "</div>";
  259. } else {
  260. html += " <div class='title_1'>" + chapter.trans_title + "</div>";
  261. }
  262. html += ' <div class="title_2" lang="pali">' + chapter.title + "</div>";
  263. html += "</div>";
  264. html += '<div class="resource">';
  265. if (chapter.progress) {
  266. let r = 12;
  267. let perimeter = 2 * Math.PI * r;
  268. let stroke1 = parseInt(perimeter * chapter.progress.all_trans);
  269. let stroke2 = perimeter - stroke1;
  270. html += '<svg class="progress_circle" width="30" height="30" viewbox="0,0,30,30">';
  271. html += '<circle class="progress_bg" cx="15" cy="15" r="12" stroke-width="5" fill="none"></circle>';
  272. html +=
  273. '<circle class="progress_color" cx="15" cy="15" r="12" stroke-width="5" fill="none" stroke-dasharray="' +
  274. stroke1 +
  275. " " +
  276. stroke2 +
  277. '"></circle>';
  278. html += "</svg>";
  279. }
  280. html += '<div class="res_more">';
  281. html += " ";
  282. html += " </div>";
  283. html += "</div>";
  284. html += "</li>";
  285. return html;
  286. }
  287. function tag_get_local_word(word) {
  288. let termKey = term_lookup_my(word, "", getCookie("userid"), getCookie("language"));
  289. if (termKey) {
  290. return termKey.meaning;
  291. } else {
  292. return word;
  293. }
  294. }
  295. function tag_render_others() {
  296. let strOthersTag = "";
  297. currTagLevel0 = new Array();
  298. $(".tag_others").html("");
  299. document.getElementById("main_tag").style.margin = 1 + "em";
  300. document.getElementById("main_tag").style.fontSize = 100 + "%";
  301. for (const key in allTags) {
  302. if (allTags.hasOwnProperty(key)) {
  303. if ($("#tag_input").val().length > 0) {
  304. if (key.indexOf($("#tag_input").val()) >= 0) {
  305. strOthersTag =
  306. '<button class="canon-tag" onclick ="tag_click(\'' + key + "')\" >" + key + "</button>";
  307. }
  308. } else {
  309. let keyname = tag_get_local_word(key);
  310. strOthersTag =
  311. '<button class="canon-tag" title="' +
  312. key +
  313. '" onclick ="tag_click(\'' +
  314. key +
  315. "')\" >" +
  316. keyname +
  317. "</button>";
  318. }
  319. let thisLevel = 100;
  320. if (tag_level.hasOwnProperty(key)) {
  321. thisLevel = tag_level[key].level;
  322. if (tag_level[key].level == 0) {
  323. currTagLevel0[key] = 1;
  324. }
  325. }
  326. $(".tag_others[level='" + thisLevel + "']").html(
  327. $(".tag_others[level='" + thisLevel + "']").html() + strOthersTag
  328. );
  329. }
  330. }
  331. }
  332. function tag_click(tag) {
  333. list_tag.push(tag);
  334. render_tag_list();
  335. tag_changed();
  336. }
  337. function render_tag_list() {
  338. $("#tag_list").slideDown();
  339. let strListTag = gLocal.gui.selected + ":";
  340. for (const iterator of list_tag) {
  341. strListTag += '<tag><span class="textt" title="' + iterator + '">' + tag_get_local_word(iterator) + "</span>";
  342. strListTag += '<span class="tag-delete" onclick ="tag_remove(\'' + iterator + "')\">✕</span></tag>";
  343. }
  344. strListTag +=
  345. "<div style='display:inline-block;width:20em;'>" +
  346. "<input id='tag_input' type='input' placeholder='tag' size='20' />" +
  347. "</div>";
  348. $("#tag_selected").html(strListTag);
  349. }
  350. function tag_remove(tag) {
  351. for (let i = 0; i < list_tag.length; i++) {
  352. if (list_tag[i] == tag) {
  353. list_tag.splice(i, 1);
  354. }
  355. }
  356. render_tag_list();
  357. tag_changed();
  358. }
  359. function sortNumber(a, b) {
  360. return b - a;
  361. }
  362. function tag_list_slide_toggle() {
  363. $("#tag_list").slideToggle();
  364. }