palicanon.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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(arrChapter, 0);
  111. }
  112. );
  113. }
  114. function palicanon_load_chapter(book, para, div_index = 1) {
  115. let lang = getCookie("language");
  116. if (lang == "zh-cn") {
  117. lang = "zh-hans";
  118. } else if (lang == "zh-tw") {
  119. lang = "zh-hant";
  120. } else if (lang == "") {
  121. lang = "en";
  122. }
  123. $.get(
  124. "get_chapter_children.php",
  125. {
  126. book: book,
  127. para: para,
  128. lang: lang,
  129. },
  130. function (data, status) {
  131. let lang = getCookie("language");
  132. if (lang == "zh-cn") {
  133. lang = "zh-hans";
  134. } else if (lang == "zh-tw") {
  135. lang = "zh-hant";
  136. } else if (lang == "") {
  137. lang = "en";
  138. }
  139. let arrChapterList = JSON.parse(data);
  140. palicanon_chapter_list_apply(arrChapterList, div_index);
  141. $.get(
  142. "get_chapter_info.php",
  143. {
  144. book: book,
  145. para: para,
  146. lang: lang,
  147. },
  148. function (data, status) {
  149. let arrChapterInfo = JSON.parse(data);
  150. let html = render_chapter_head(arrChapterInfo, div_index + 1);
  151. $("#chapter_head_" + (parseInt(div_index) + 1)).html(html);
  152. }
  153. );
  154. }
  155. );
  156. }
  157. function render_chapter_head(chapter_info, level) {
  158. let html = "";
  159. let link = "../reader/?view=chapter&book=" + chapter_info.book + "&para=" + chapter_info.paragraph;
  160. html += "<div class='title'>";
  161. if (typeof chapter_info.trans_title == "undefined") {
  162. html += " <div class='title_1'><a href='" + link + "' target='_blank'>" + chapter_info.text + "</a></div>";
  163. } else {
  164. html +=
  165. " <div class='title_1'><a href='" + link + "' target='_blank'>" + chapter_info.trans_title + "</a></div>";
  166. }
  167. html += "<div class='title_2'>" + chapter_info.text + "</div>";
  168. html += "</div>";
  169. html += "<div class='info res_more'>";
  170. html += "<div class='progress'>";
  171. if (chapter_info.progress && chapter_info.progress.length > 0) {
  172. let r = 12;
  173. let perimeter = 2 * Math.PI * r;
  174. for (const iterator of chapter_info.progress) {
  175. let stroke1 = parseInt(perimeter * iterator.all_trans);
  176. let stroke2 = perimeter - stroke1;
  177. html += ' <div class="item">';
  178. html += '<svg class="progress_circle" width="30" height="30" viewbox="0,0,30,30">';
  179. html += '<circle class="progress_bg" cx="15" cy="15" r="12" stroke-width="5" fill="none"></circle>';
  180. html +=
  181. '<circle class="progress_color" cx="15" cy="15" r="12" stroke-width="5" fill="none" stroke-dasharray="' +
  182. stroke1 +
  183. " " +
  184. stroke2 +
  185. '"></circle>';
  186. html += "</svg>";
  187. html += "<div>" + iterator.lang + "-" + parseInt(iterator.all_trans * 100) + "%</div>";
  188. html += " </div>";
  189. }
  190. } else {
  191. html += "无译文";
  192. }
  193. html += "</div>";
  194. html += "</div>";
  195. return html;
  196. }
  197. function palicanon_chapter_list_apply(chapterList, div_index) {
  198. let iDiv = parseInt(div_index);
  199. let html = "";
  200. html += "<div id='chapter_head_" + (iDiv + 1) + "' class='chapter_head'></div>";
  201. html += "<ul id='list-" + (iDiv + 1) + "' class='grid' level='" + (iDiv + 1) + "'>";
  202. for (const iterator of chapterList) {
  203. html += palicanon_render_chapter_row(iterator);
  204. }
  205. html += "</ul>";
  206. $("#list_shell_" + (iDiv + 1)).html(html);
  207. $("#list_shell_" + (iDiv + 1)).removeClass();
  208. $("#list_shell_" + (iDiv + 1)).addClass("show");
  209. //隐藏之后的列表
  210. for (let index = iDiv + 2; index <= 8; index++) {
  211. $("#list_shell_" + index).removeClass();
  212. $("#list_shell_" + index).addClass("hidden");
  213. }
  214. //收缩当前的
  215. $("#list-" + iDiv).removeClass();
  216. $("#list-" + iDiv).addClass("list");
  217. $("#list_shell_" + iDiv).removeClass();
  218. $("#list_shell_" + iDiv).addClass("list");
  219. }
  220. function chapter_onclick(obj) {
  221. let book = $(obj).attr("book");
  222. let para = $(obj).attr("para");
  223. let level = $(obj).parent().attr("level");
  224. $(obj).siblings().removeClass("selected");
  225. $(obj).addClass("selected");
  226. $("#tag_list").slideUp();
  227. palicanon_load_chapter(book, para, level);
  228. }
  229. function palicanon_render_chapter_row(chapter) {
  230. let html = "";
  231. let levelClass = "";
  232. if (chapter.level == 1) {
  233. levelClass = " level_1";
  234. }
  235. html +=
  236. '<li class="' +
  237. levelClass +
  238. '" book="' +
  239. chapter.book +
  240. '" para="' +
  241. chapter.para +
  242. '" onclick="chapter_onclick(this)">';
  243. html += '<div class="title">';
  244. if (typeof chapter.trans_title == "undefined") {
  245. html += " <div class='title_1'>" + chapter.title + "</div>";
  246. } else {
  247. html += " <div class='title_1'>" + chapter.trans_title + "</div>";
  248. }
  249. html += ' <div class="title_2" lang="pali">' + chapter.title + "</div>";
  250. html += "</div>";
  251. html += '<div class="resource">';
  252. if (chapter.progress) {
  253. let r = 12;
  254. let perimeter = 2 * Math.PI * r;
  255. let stroke1 = parseInt(perimeter * chapter.progress.all_trans);
  256. let stroke2 = perimeter - stroke1;
  257. html += '<svg class="progress_circle" width="30" height="30" viewbox="0,0,30,30">';
  258. html += '<circle class="progress_bg" cx="15" cy="15" r="12" stroke-width="5" fill="none"></circle>';
  259. html +=
  260. '<circle class="progress_color" cx="15" cy="15" r="12" stroke-width="5" fill="none" stroke-dasharray="' +
  261. stroke1 +
  262. " " +
  263. stroke2 +
  264. '"></circle>';
  265. html += "</svg>";
  266. /*
  267. for (const iterator of chapter.progress) {
  268. html += ' <div class="item">';
  269. html += "<div>" + iterator.lang + "-" + parseInt(iterator.all_trans * 100) + "%</div>";
  270. html += " </div>";
  271. }
  272. */
  273. }
  274. html += ' <div class="res_more">';
  275. html += " 更多";
  276. html += " </div>";
  277. html += "</div>";
  278. html += "</li>";
  279. return html;
  280. }
  281. function tag_get_local_word(word) {
  282. let termKey = term_lookup_my(word, "", getCookie("userid"), getCookie("language"));
  283. if (termKey) {
  284. return termKey.meaning;
  285. } else {
  286. return word;
  287. }
  288. }
  289. function tag_render_others() {
  290. let strOthersTag = "";
  291. currTagLevel0 = new Array();
  292. $(".tag_others").html("");
  293. document.getElementById("main_tag").style.margin = 1 + "em";
  294. document.getElementById("main_tag").style.fontSize = 100 + "%";
  295. for (const key in allTags) {
  296. if (allTags.hasOwnProperty(key)) {
  297. if ($("#tag_input").val().length > 0) {
  298. if (key.indexOf($("#tag_input").val()) >= 0) {
  299. strOthersTag =
  300. '<button class="canon-tag" onclick ="tag_click(\'' + key + "')\" >" + key + "</button>";
  301. }
  302. } else {
  303. let keyname = tag_get_local_word(key);
  304. strOthersTag =
  305. '<button class="canon-tag" title="' +
  306. key +
  307. '" onclick ="tag_click(\'' +
  308. key +
  309. "')\" >" +
  310. keyname +
  311. "</button>";
  312. }
  313. let thisLevel = 100;
  314. if (tag_level.hasOwnProperty(key)) {
  315. thisLevel = tag_level[key].level;
  316. if (tag_level[key].level == 0) {
  317. currTagLevel0[key] = 1;
  318. }
  319. }
  320. $(".tag_others[level='" + thisLevel + "']").html(
  321. $(".tag_others[level='" + thisLevel + "']").html() + strOthersTag
  322. );
  323. }
  324. }
  325. }
  326. function tag_click(tag) {
  327. list_tag.push(tag);
  328. render_tag_list();
  329. tag_changed();
  330. }
  331. function render_tag_list() {
  332. $("#tag_list").slideDown();
  333. let strListTag = gLocal.gui.selected + ":";
  334. for (const iterator of list_tag) {
  335. strListTag += '<tag><span class="textt" title="' + iterator + '">' + tag_get_local_word(iterator) + "</span>";
  336. strListTag += '<span class="tag-delete" onclick ="tag_remove(\'' + iterator + "')\">✕</span></tag>";
  337. }
  338. strListTag +=
  339. "<div style='display:inline-block;width:20em;'>" +
  340. "<input id='tag_input' type='input' placeholder='tag' size='20' />" +
  341. "</div>";
  342. $("#tag_selected").html(strListTag);
  343. }
  344. function tag_remove(tag) {
  345. for (let i = 0; i < list_tag.length; i++) {
  346. if (list_tag[i] == tag) {
  347. list_tag.splice(i, 1);
  348. }
  349. }
  350. render_tag_list();
  351. tag_changed();
  352. }
  353. function sortNumber(a, b) {
  354. return b - a;
  355. }
  356. function tag_list_slide_toggle() {
  357. $("#tag_list").slideToggle();
  358. }