xml.js 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. var nWord = 0;
  2. var suttaWordList = new Array();
  3. var tranParagraph = new Array();
  4. var g_useMode;
  5. var g_countWordList = 0;
  6. var g_wordListOrderby = "count";
  7. var g_wordListOrder = false;
  8. var g_isDictFavo = false;
  9. var g_autoUpdataDB = true;
  10. var gTextEditMediaType = "";
  11. var gSutta = 0;
  12. var gPar = 0;
  13. var gTran = 0;
  14. var g_bookMark_array = ["a", "x", "1", "2", "3", "4", "5"];
  15. var wordList = new Array();
  16. function getNodeText(inNode, subTagName) {
  17. try {
  18. if (inNode && inNode.getElementsByTagName(subTagName).length > 0) {
  19. if (inNode.getElementsByTagName(subTagName)[0].childNodes.length > 0) {
  20. var mValue = inNode.getElementsByTagName(subTagName)[0].childNodes[0].nodeValue;
  21. mValue = mValue.replace("&lt;", "<");
  22. mValue = mValue.replace("&gt;", ">");
  23. return mValue;
  24. } else {
  25. return "";
  26. }
  27. } else {
  28. return "";
  29. }
  30. } catch (error) {
  31. console.warn(error);
  32. return "";
  33. }
  34. return "";
  35. }
  36. function setNodeText(inNode, subTagName, strValue) {
  37. if (strValue == null) {
  38. return;
  39. }
  40. var mValue = strValue.toString();
  41. mValue = mValue.replace("<", "&lt;");
  42. mValue = mValue.replace(">", "&gt;");
  43. try {
  44. if (inNode && inNode.getElementsByTagName(subTagName).length == 0) {
  45. var newNode = gXmlBookData.createElement(subTagName);
  46. var textnode = gXmlBookData.createTextNode(" ");
  47. newNode.appendChild(textnode);
  48. inNode.appendChild(newNode);
  49. }
  50. if (inNode.getElementsByTagName(subTagName).length > 0) {
  51. if (inNode.getElementsByTagName(subTagName)[0].childNodes.length == 0) {
  52. var textnode = gXmlBookData.createTextNode(" ");
  53. inNode.getElementsByTagName(subTagName)[0].appendChild(textnode);
  54. }
  55. if (inNode.getElementsByTagName(subTagName)[0].childNodes.length > 0) {
  56. inNode.getElementsByTagName(subTagName)[0].childNodes[0].nodeValue = strValue;
  57. } else {
  58. throw "can't accese text node";
  59. }
  60. } else {
  61. throw subTagName + ":not a sub Taget";
  62. }
  63. } catch (error) {
  64. var_dump(error);
  65. return false;
  66. }
  67. return true;
  68. }
  69. function getNodeAttr(inNode, subTagName, attr) {
  70. try {
  71. return inNode.getElementsByTagName(subTagName)[0].getAttribute(attr);
  72. } catch (error) {
  73. console.warn(error);
  74. return "";
  75. }
  76. }
  77. function setNodeAttr(inNode, subTagName, attr, strValue) {
  78. if ( inNode == null || subTagName === "" || attr === "") {
  79. return;
  80. }
  81. let mValue = strValue.toString();
  82. try {
  83. if (inNode.getElementsByTagName(subTagName).length == 0) {
  84. let newNode = gXmlBookData.createElement(subTagName);
  85. let textnode = gXmlBookData.createTextNode(" ");
  86. newNode.appendChild(textnode);
  87. inNode.appendChild(newNode);
  88. }
  89. try {
  90. inNode.getElementsByTagName(subTagName)[0].setAttribute(attr, mValue);
  91. } catch (e) {
  92. newatt = gXmlBookData.createAttribute(attr);
  93. newatt.nodeValue = mValue;
  94. inNode.getElementsByTagName(subTagName)[0].setAttributeNode(newatt);
  95. return true;
  96. }
  97. } catch (error) {
  98. console.error(error);
  99. return false;
  100. }
  101. return true;
  102. }
  103. //根据xmlDocument 对象中的单词序号和单词节点创建单词块
  104. //返回 字符串
  105. function createWordBlockByNode(id, wordNode) {}
  106. function pushNewToList(inArray, strNew) {
  107. //var isExist=false;
  108. for (x in inArray) {
  109. if (inArray[x] == strNew) {
  110. return;
  111. }
  112. }
  113. inArray.push(strNew);
  114. }
  115. function findFirstCaseInDict(inWord) {
  116. var output = "?";
  117. var pali = com_getPaliReal(inWord);
  118. if (mDict[pali]) {
  119. for (var iWord in mDict[pali]) {
  120. {
  121. if (mDict[pali][iWord].parts) {
  122. if (mDict[pali][iWord].parts.length > 0) {
  123. return mDict[pali][iWord].type + "#" + mDict[pali][iWord].gramma;
  124. }
  125. }
  126. }
  127. }
  128. }
  129. return output;
  130. }
  131. function findFirstPartInDict(inWord) {
  132. var output = "?";
  133. var pali = com_getPaliReal(inWord);
  134. if (mDict[pali]) {
  135. for (var iWord in mDict[pali]) {
  136. {
  137. if (mDict[pali][iWord].parts) {
  138. if (mDict[pali][iWord].parts.length > 0) {
  139. return mDict[pali][iWord].parts;
  140. }
  141. }
  142. }
  143. }
  144. }
  145. return output;
  146. }
  147. function LangInclude(lang,testLang){
  148. if(lang.length>0){
  149. return lang.includes(testLang);
  150. }else{
  151. return true;
  152. }
  153. }
  154. /**
  155. * 查找某单词的意思
  156. * @param {string} inWord 要查找的单词拼写
  157. * @returns
  158. */
  159. function findFirstMeanInDict(inWord) {
  160. let output = "?";
  161. let pali = com_getPaliReal(inWord);
  162. if (mDict[pali]) {
  163. for (const iterator of mDict[pali]) {
  164. //if(dict_language_enable.indexOf(mDict[pali][iWord].language)>=0)
  165. {
  166. if (!isEmpty(iterator.mean)) {
  167. return iterator.mean.split("$")[0];
  168. }
  169. }
  170. }
  171. }
  172. return output;
  173. }
  174. /**
  175. * 查找某单词在复合词中的意思
  176. * @param {string} inWord 要查找的单词拼写
  177. * @returns
  178. */
  179. function findFirstPartMeanInDict(inWord) {
  180. let pali = com_getPaliReal(inWord);
  181. if (mDict[pali]) {
  182. for (const iterator of mDict[pali]) {
  183. if(LangInclude(setting['dict.lang'],iterator.language))
  184. {
  185. if (iterator.type == ".part." && !isEmpty(iterator.mean)) {
  186. return iterator.mean.split("$")[0];
  187. }
  188. }
  189. }
  190. for (const iterator of mDict[pali]) {
  191. if(LangInclude(setting['dict.lang'],iterator.language))
  192. {
  193. if (!isEmpty(iterator.mean)) {
  194. return iterator.mean.split("$")[0];
  195. }
  196. }
  197. }
  198. }
  199. return "?";
  200. }
  201. function findAllMeanInDict(inWord, limit) {
  202. output = new Array();
  203. for (var iCurrWord = 0; iCurrWord < g_DictWordList.length; iCurrWord++) {
  204. if (g_DictWordList[iCurrWord].Pali == inWord) {
  205. meanList = g_DictWordList[iCurrWord].Mean.split("$");
  206. for (iMean in meanList) {
  207. if (meanList[iMean].length > 0) {
  208. output.push(meanList[iMean]);
  209. if (output.length > limit) {
  210. return output;
  211. }
  212. }
  213. }
  214. }
  215. }
  216. return output;
  217. }
  218. //确认对单个词的修改
  219. function modifyApply(sWordId, update_user_dict) {
  220. let wordIndex = getWordIndex(sWordId);
  221. let arr_id_word = sWordId.split("-");
  222. let book = arr_id_word[0].slice(1);
  223. let paragraph = arr_id_word[1];
  224. let wId = arr_id_word[2];
  225. let strApplyTo;
  226. if (document.getElementById("checkbox_apply_same").checked) {
  227. strApplyTo = "all";
  228. } else {
  229. strApplyTo = "current";
  230. }
  231. let wordCurrStatus = 9; //草稿
  232. if (update_user_dict) {
  233. wordCurrStatus = 7; //保存为正式
  234. }
  235. //关闭单词修改窗口
  236. closeModifyWindow();
  237. let x = gXmlBookDataBody.getElementsByTagName("word");
  238. let msg_data = new Object();
  239. msg_data.id = sWordId;
  240. //原来的值
  241. let sPaliReal = getNodeText(x[wordIndex], "real");
  242. let sPaliParent = getNodeText(x[wordIndex], "parent");
  243. //new value
  244. let sPali = document.getElementById("id_text_pali").value;
  245. let oldPali = getNodeText(x[wordIndex], "pali");
  246. if (sPali != oldPali) {
  247. setNodeText(x[wordIndex], "pali", sPali);
  248. msg_data.pali = sPali;
  249. }
  250. setNodeAttr(x[wordIndex], "pali", "status", wordCurrStatus);
  251. let sReal = document.getElementById("id_text_real").value;
  252. let oldReal = getNodeText(x[wordIndex], "real");
  253. if (sReal != oldReal) {
  254. setNodeText(x[wordIndex], "real", sReal);
  255. msg_data.real = sReal;
  256. }
  257. setNodeAttr(x[wordIndex], "real", "status", wordCurrStatus);
  258. let sMeaning = document.getElementById("input_meaning").value;
  259. let oldMean = getNodeText(x[wordIndex], "mean");
  260. if (sMeaning != oldMean) {
  261. setNodeText(x[wordIndex], "mean", sMeaning);
  262. msg_data.mean = sMeaning;
  263. }
  264. setNodeAttr(x[wordIndex], "mean", "status", wordCurrStatus);
  265. let sParent = document.getElementById("id_text_parent").value;
  266. let oldParent = getNodeText(x[wordIndex], "parent");
  267. if (sParent != oldParent) {
  268. setNodeText(x[wordIndex], "parent", sParent);
  269. msg_data.parent = sParent;
  270. }
  271. setNodeAttr(x[wordIndex], "parent", "status", wordCurrStatus);
  272. let sParentGrammar = document.getElementById("input_parent_grammar").value;
  273. let oldParentGrammar = getNodeText(x[wordIndex], "pg");
  274. if (sParentGrammar != oldParentGrammar) {
  275. setNodeText(x[wordIndex], "pg", sParentGrammar);
  276. msg_data.pg = sParentGrammar;
  277. }
  278. setNodeAttr(x[wordIndex], "pg", "status", wordCurrStatus);
  279. let sParentParent = document.getElementById("id_text_prt_prt").value;
  280. let oldParentParent = getNodeText(x[wordIndex], "parent2");
  281. if (sParentParent != oldParentParent) {
  282. setNodeText(x[wordIndex], "parent2", sParentParent);
  283. msg_data.parent2 = sParentParent;
  284. }
  285. setNodeAttr(x[wordIndex], "parent2", "status", wordCurrStatus);
  286. let sOrg = document.getElementById("input_org").value;
  287. let oldOrg = getNodeText(x[wordIndex], "org");
  288. if (sOrg != oldOrg) {
  289. setNodeText(x[wordIndex], "org", sOrg);
  290. msg_data.org = sOrg;
  291. }
  292. setNodeAttr(x[wordIndex], "org", "status", wordCurrStatus);
  293. let sOm = document.getElementById("input_om").value;
  294. let oldOm = getNodeText(x[wordIndex], "om");
  295. if (oldOm != sOm) {
  296. setNodeText(x[wordIndex], "om", sOm);
  297. msg_data.om = sOm;
  298. }
  299. setNodeAttr(x[wordIndex], "om", "status", wordCurrStatus);
  300. let sCase = document.getElementById("input_case").value;
  301. let oldCase = getNodeText(x[wordIndex], "case");
  302. if (oldCase != sCase) {
  303. setNodeText(x[wordIndex], "case", sCase);
  304. msg_data.case = sCase;
  305. }
  306. setNodeAttr(x[wordIndex], "case", "status", wordCurrStatus);
  307. let bLocked = document.getElementById("input_lock").checked;
  308. let oldLock = getNodeText(x[wordIndex], "lock");
  309. if (bLocked != oldLock) {
  310. setNodeText(x[wordIndex], "lock", bLocked);
  311. msg_data.lock = bLocked;
  312. }
  313. setNodeAttr(x[wordIndex], "lock", "status", wordCurrStatus);
  314. let txtBookMark = document.getElementById("id_text_bookmark").value;
  315. let oldBookMarkText = getNodeText(x[wordIndex], "bmt");
  316. if (oldBookMarkText != txtBookMark) {
  317. setNodeText(x[wordIndex], "bmt", txtBookMark);
  318. msg_data.bmt = txtBookMark;
  319. }
  320. setNodeAttr(x[wordIndex], "bmt", "status", wordCurrStatus);
  321. let oldBookMarkColor = getNodeText(x[wordIndex], "bmc");
  322. if (oldBookMarkColor == "") {
  323. oldBookMarkColor = "bmc0";
  324. }
  325. if (oldBookMarkColor != g_currBookMarkColor) {
  326. setNodeText(x[wordIndex], "bmc", g_currBookMarkColor);
  327. msg_data.bmc = g_currBookMarkColor;
  328. g_currBookMarkColor = "";
  329. }
  330. setNodeAttr(x[wordIndex], "bmc", "status", wordCurrStatus);
  331. let updateNoteNum = false;
  332. let txtNote = document.getElementById("id_text_note").value;
  333. let prevNote = getNodeText(x[wordIndex], "note");
  334. if (prevNote != txtNote) {
  335. setNodeText(x[wordIndex], "note", txtNote);
  336. //refreshWordNote(x[wordIndex].parentNode.parentNode);
  337. msg_data.note = txtNote;
  338. //updateWordNote(x[wordIndex]);
  339. updateNoteNum = true;
  340. }
  341. let sRalation = $("#id_relation_text").val();
  342. let oldRalation = getNodeText(x[wordIndex], "rala");
  343. if (oldRalation != sRalation) {
  344. setNodeText(x[wordIndex], "rela", sRalation);
  345. msg_data.rela = sRalation;
  346. //updateWordRelation(x[wordIndex]);
  347. updateNoteNum = true;
  348. }
  349. {
  350. setNodeText(x[wordIndex], "status", wordCurrStatus); //自己手动 或 草稿
  351. msg_data.status = wordCurrStatus;
  352. }
  353. user_wbw_push_word(sWordId);
  354. modifyWordDetailByWordIndex(wordIndex);
  355. updataWordHeadByIndex(wordIndex);
  356. if (updateNoteNum) {
  357. refreshWordNoteDiv(x[wordIndex].parentNode.parentNode);
  358. refreshNoteNumber();
  359. }
  360. //send message
  361. let d = new Date();
  362. let msg_doc_id;
  363. if (doc_info.sendmsg) {
  364. if (doc_info.parent_id != "") {
  365. msg_doc_id = doc_info.parent_id;
  366. } else {
  367. msg_doc_id = doc_info.doc_id;
  368. }
  369. msg_push(1, JSON.stringify(msg_data), msg_doc_id, d.getTime(), book, paragraph);
  370. }
  371. //The end of send message
  372. let objWord = new Object();
  373. objWord.Pali = getNodeText(x[wordIndex], "real");
  374. sCase = getNodeText(x[wordIndex], "case");
  375. let mGramma = sCase.split("#");
  376. if (mGramma.length >= 2) {
  377. mType = sCase.split("#")[0];
  378. mGramma = sCase.split("#")[1];
  379. } else {
  380. mType = "";
  381. mGramma = sCase.split("#")[0];
  382. }
  383. //将单词加入内存字典
  384. var objDictItem = new Object(); /*一个字典元素*/
  385. objDictItem.id = 0;
  386. objDictItem.guid = "";
  387. objDictItem.pali = getNodeText(x[wordIndex], "pali");
  388. objDictItem.type = mType;
  389. objDictItem.gramma = mGramma;
  390. objDictItem.parent = getNodeText(x[wordIndex], "parent");
  391. objDictItem.mean = getNodeText(x[wordIndex], "mean");
  392. objDictItem.note = getNodeText(x[wordIndex], "note");
  393. objDictItem.parts = getNodeText(x[wordIndex], "org");
  394. objDictItem.partmean = getNodeText(x[wordIndex], "om");
  395. objDictItem.status = 0;
  396. objDictItem.dict_name = "Memo";
  397. objDictItem.language = "zh";
  398. objDictItem.confidence = 100;
  399. if (objDictItem.type == "" || objDictItem.type.indexOf("?") != -1) {
  400. objDictItem.confidence = objDictItem.confidence * 0.9;
  401. }
  402. if (objDictItem.type != ".un." && objDictItem.type != ".comp.") {
  403. if (objDictItem.gramma == "" || objDictItem.gramma.indexOf("?") != -1 || objDictItem.gramma.indexOf("$") != 0) {
  404. objDictItem.confidence = objDictItem.confidence * 0.9;
  405. }
  406. if (objDictItem.mean == "" || objDictItem.mean.indexOf("?") != -1) {
  407. objDictItem.confidence = objDictItem.confidence * 0.9;
  408. }
  409. if (objDictItem.partmean == "" || objDictItem.partmean.indexOf("?") != -1) {
  410. objDictItem.confidence = objDictItem.confidence * 0.9;
  411. }
  412. }
  413. if (objDictItem.parts == "" || objDictItem.parts.indexOf("?") != -1) {
  414. objDictItem.confidence = objDictItem.confidence * 0.9;
  415. }
  416. if (!mDict[objDictItem.pali]) {
  417. mDict[objDictItem.pali] = new Array();
  418. }
  419. //insert to top of memory dict
  420. mDict[objDictItem.pali].unshift(objDictItem);
  421. let parts = getNodeText(x[wordIndex], "org");
  422. let partmean = getNodeText(x[wordIndex], "om");
  423. //add parent infomation
  424. switch (mType) {
  425. case ".n.":
  426. mType = ".n:base.";
  427. mGramma = mGramma.split("$")[0];
  428. if (mGramma == ".m." || mGramma == ".f." || mGramma == ".nt.") {
  429. } else {
  430. mGramma = "";
  431. }
  432. break;
  433. case ".adj.":
  434. mType = ".adj:base.";
  435. mGramma = "";
  436. break;
  437. case ".ti.":
  438. mType = ".ti:base.";
  439. mGramma = "";
  440. break;
  441. case ".pron.":
  442. d_parentType = ".pron:base.";
  443. d_parentGramma = "";
  444. break;
  445. case ".num.":
  446. d_parentType = ".num:base.";
  447. d_parentGramma = "";
  448. break;
  449. case ".v.":
  450. mType = ".v:base.";
  451. mGramma = "";
  452. break;
  453. }
  454. //将单词base加入内存字典
  455. if (getNodeText(x[wordIndex], "parent") != "") {
  456. var objDictItem = new Object(); /*一个字典元素*/
  457. objDictItem.id = 0;
  458. objDictItem.guid = "";
  459. objDictItem.pali = getNodeText(x[wordIndex], "parent");
  460. objDictItem.type = mType;
  461. objDictItem.gramma = mGramma;
  462. objDictItem.parent = "";
  463. objDictItem.mean = removeFormulaB(getNodeText(x[wordIndex], "mean"), "[", "]");
  464. objDictItem.mean = removeFormulaB(objDictItem.mean, "{", "}");
  465. objDictItem.note = getNodeText(x[wordIndex], "note");
  466. //remove the "[***]" in the end
  467. let d_factors = getNodeText(x[wordIndex], "org");
  468. let fc = d_factors.split("+");
  469. if (fc.length > 0 && fc[fc.length - 1].slice(0, 1) == "[" && fc[fc.length - 1].slice(-1) == "]") {
  470. fc.pop();
  471. }
  472. objDictItem.parts = fc.join("+");
  473. let fm = getNodeText(x[wordIndex], "om").split("+");
  474. fm.length = fc.length;
  475. objDictItem.partmean = fm.join("+");
  476. objDictItem.status = 0;
  477. objDictItem.confidence = 100;
  478. if (objDictItem.type == "" || objDictItem.gramma.indexOf("?") != -1) {
  479. objDictItem.confidence = objDictItem.confidence * 0.9;
  480. }
  481. if (objDictItem.gramma == "" || objDictItem.gramma.indexOf("?") != -1 || objDictItem.gramma.indexOf("$") != 0) {
  482. objDictItem.confidence = objDictItem.confidence * 0.9;
  483. }
  484. if (objDictItem.mean == "" || objDictItem.gramma.indexOf("?") != -1) {
  485. objDictItem.confidence = objDictItem.confidence * 0.9;
  486. }
  487. if (objDictItem.parts == "" || objDictItem.gramma.indexOf("?") != -1) {
  488. objDictItem.confidence = objDictItem.confidence * 0.9;
  489. }
  490. if (objDictItem.partmean == "" || objDictItem.gramma.indexOf("?") != -1) {
  491. objDictItem.confidence = objDictItem.confidence * 0.9;
  492. }
  493. if (!mDict[objDictItem.pali]) {
  494. mDict[objDictItem.pali] = new Array();
  495. }
  496. objDictItem.dict_name = "Memo";
  497. objDictItem.language = "zh";
  498. if (!mDict[objDictItem.pali]) {
  499. mDict[objDictItem.pali] = new Array();
  500. }
  501. mDict[objDictItem.pali].unshift(objDictItem);
  502. }
  503. // The end of memory dictionary
  504. //apply all
  505. let searchBegin = 0;
  506. let searchEnd = 0;
  507. switch (strApplyTo) {
  508. case "all":
  509. searchBegin = 0;
  510. searchEnd = x.length;
  511. break;
  512. case "up":
  513. searchBegin = 0;
  514. searchEnd = wordIndex;
  515. break;
  516. case "down":
  517. searchBegin = wordIndex;
  518. searchEnd = x.length;
  519. break;
  520. }
  521. if (strApplyTo != "current") {
  522. //sPaliWord = x[sWordId].getElementsByTagName("pali")[0].childNodes[0].nodeValue;
  523. let iSameWordCount = 0;
  524. setNodeText(x[wordIndex], "pali", sPali); //拼寫顯示修改僅僅應用當前詞——Kosalla
  525. for (iSearch = searchBegin; iSearch < searchEnd; iSearch++) {
  526. if (sWordId != iSearch) {
  527. //xmlNotePali = x[i].getElementsByTagName("pali")[0].childNodes[0].nodeValue;
  528. xmlNotePali = getNodeText(x[iSearch], "real");
  529. if (xmlNotePali == sPaliReal) {
  530. if (getNodeText(x[iSearch], "lock") != "true") {
  531. setNodeText(x[iSearch], "real", sReal);
  532. setNodeText(x[iSearch], "parent", sParent);
  533. setNodeText(x[iSearch], "mean", sMeaning);
  534. setNodeText(x[iSearch], "org", sOrg);
  535. setNodeText(x[iSearch], "om", sOm);
  536. setNodeText(x[iSearch], "case", sCase);
  537. setNodeText(x[iSearch], "bmc", g_currBookMarkColor);
  538. setNodeText(x[iSearch], "note", txtNote);
  539. switch (editor_word_status(x[iSearch])) {
  540. case 0:
  541. case 1:
  542. case 2:
  543. case 3:
  544. case 4:
  545. case 6:
  546. editor_word_status(x[iSearch], 5);
  547. break;
  548. }
  549. user_wbw_push_word(getNodeText(x[iSearch], "id"));
  550. modifyWordDetailByWordIndex(iSearch);
  551. updataWordHeadByIndex(iSearch);
  552. console.log("updata:" + iSearch + "<br />", 0);
  553. iSameWordCount = iSameWordCount + 1;
  554. }
  555. }
  556. xmlNoteParent = getNodeText(x[iSearch], "parent");
  557. if (
  558. xmlNotePali != sPaliReal &&
  559. xmlNoteParent == sPaliParent &&
  560. xmlNoteParent != "" &&
  561. xmlNoteParent != " "
  562. ) {
  563. if (getNodeText(x[iSearch], "lock") != "true") {
  564. setNodeText(x[iSearch], "mean", sMeaning);
  565. user_wbw_push_word(getNodeText(x[iSearch], "id"));
  566. modifyWordDetailByWordIndex(iSearch);
  567. updataWordHeadByIndex(iSearch);
  568. iSameWordCount = iSameWordCount + 1;
  569. }
  570. }
  571. }
  572. }
  573. var_dump("same word:" + (iSameWordCount - 1));
  574. }
  575. refreshBookMark();
  576. user_wbw_commit();
  577. refreshNoteNumber();
  578. //上传到用户字典
  579. if (update_user_dict) {
  580. upload_to_my_dict();
  581. }
  582. }
  583. function getWordIndex(GUID) {
  584. var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  585. for (var iWord = 0; iWord < xAllWord.length; iWord++) {
  586. if (getNodeText(xAllWord[iWord], "id") == GUID) {
  587. return iWord;
  588. }
  589. }
  590. return -1;
  591. }
  592. function addFavorite() {
  593. g_isDictFavo = !g_isDictFavo;
  594. if (g_isDictFavo) {
  595. document.getElementById("temp").innerHTML = "★";
  596. } else {
  597. document.getElementById("temp").innerHTML = "☆";
  598. }
  599. }
  600. //用单词表中的一个记录更改经文中的单词
  601. function updataWord(id) {
  602. var debugstr;
  603. try {
  604. sPali = document.getElementById("wlpali" + id).value;
  605. sReal = document.getElementById("wlreal" + id).value;
  606. sOrg = document.getElementById("wlorg" + id).value;
  607. sMean = document.getElementById("wlmean" + id).value;
  608. sCase = document.getElementById("wlcase" + id).value;
  609. var m_WordIdList = new Array();
  610. m_WordIdList = wordList[id].wordid.toString().split("$");
  611. var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  612. for (indexWordList = 0; indexWordList < m_WordIdList.length; indexWordList++) {
  613. //将修改结果保存到xml DOM中
  614. if (m_WordIdList[indexWordList] >= 0) {
  615. setNodeText(xAllWord[m_WordIdList[indexWordList]], "pali", sPali);
  616. setNodeText(xAllWord[m_WordIdList[indexWordList]], "real", sReal);
  617. setNodeText(xAllWord[m_WordIdList[indexWordList]], "org", sOrg);
  618. setNodeText(xAllWord[m_WordIdList[indexWordList]], "mean", sMean);
  619. setNodeText(xAllWord[m_WordIdList[indexWordList]], "case", sCase);
  620. var sId = getNodeText(xAllWord[m_WordIdList[indexWordList]], "id");
  621. var wordDetail = renderWordDetailById(sId);
  622. var strDetailName = "detail" + sId;
  623. document.getElementById(strDetailName).innerHTML = wordDetail;
  624. updataWordHeadById(sId);
  625. }
  626. }
  627. var_dump("" + m_WordIdList.length + "");
  628. document.getElementById("wlApply" + id).disabled = true;
  629. } catch (e) {
  630. var_dump(e);
  631. }
  632. }
  633. //比较两个词是否一样
  634. function compareWordInList(word1, word2) {
  635. var sItems1 = new Array();
  636. sItem1 = word1.split(";");
  637. var sItems2 = new Array();
  638. sItem2 = word2.split(";");
  639. var sConcat1 = sItem1[0] + sItem1[1] + sItem1[2] + sItem1[3];
  640. var sConcat2 = sItem2[0] + sItem1[1] + sItem1[2] + sItem1[3];
  641. if (sConcat1 == sConcat2) {
  642. return true;
  643. } else {
  644. return false;
  645. }
  646. }
  647. function sortWordList(strOrderby) {
  648. g_wordListOrderby = strOrderby;
  649. g_wordListOrder = !g_wordListOrder;
  650. refreshWordList();
  651. }
  652. function CountVocabulary() {
  653. var sPali = "";
  654. var sOrg = "";
  655. var sMean = "";
  656. var sCase = "";
  657. var wordList1 = new Array();
  658. var arrCombinWord = new Array();
  659. var arrCombinWordOrder = new Array();
  660. var arrCount = new Array();
  661. var iCount = 0;
  662. var sTableWordList = "";
  663. var arrowCount = "";
  664. var arrowPali = "";
  665. var arrowReal = "";
  666. //提取所有词
  667. var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  668. if (xAllWord.length == 0) {
  669. return "no word data.";
  670. }
  671. var outWordList = "";
  672. for (iword = 0; iword < xAllWord.length; iword++) {
  673. var objWord = new Object();
  674. objWord.id = getNodeText(xAllWord[iword], "id");
  675. objWord.pali = getNodeText(xAllWord[iword], "pali");
  676. objWord.real = getNodeText(xAllWord[iword], "real");
  677. objWord.mean = getNodeText(xAllWord[iword], "mean");
  678. objWord.org = getNodeText(xAllWord[iword], "org");
  679. objWord.om = getNodeText(xAllWord[iword], "om");
  680. objWord.case = getNodeText(xAllWord[iword], "case");
  681. objWord.index = iword;
  682. objWord.count = 1;
  683. objWord.wordid = iword;
  684. if (objWord.real != "") {
  685. addWordToWordList(wordList1, objWord);
  686. }
  687. }
  688. return wordList1.length;
  689. }
  690. //生成单词列表
  691. function makeWordList() {
  692. var sPali = "";
  693. var sOrg = "";
  694. var sMean = "";
  695. var sCase = "";
  696. var arrCombinWord = new Array();
  697. var arrCombinWordOrder = new Array();
  698. var arrCount = new Array();
  699. var iCount = 0;
  700. var sTableWordList = "";
  701. var arrowCount = "";
  702. var arrowPali = "";
  703. var arrowReal = "";
  704. //提取所有词
  705. var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
  706. if (xAllWord.length == 0) {
  707. return "no word data.";
  708. }
  709. var outWordList = "";
  710. for (iword = 0; iword < xAllWord.length; iword++) {
  711. var objWord = new Object();
  712. objWord.id = getNodeText(xAllWord[iword], "id");
  713. objWord.pali = getNodeText(xAllWord[iword], "pali");
  714. objWord.real = getNodeText(xAllWord[iword], "real");
  715. objWord.mean = getNodeText(xAllWord[iword], "mean");
  716. objWord.org = getNodeText(xAllWord[iword], "org");
  717. objWord.om = getNodeText(xAllWord[iword], "om");
  718. objWord.case = getNodeText(xAllWord[iword], "case");
  719. objWord.index = iword;
  720. objWord.count = 1;
  721. objWord.wordid = iword;
  722. if (objWord.real != "") {
  723. addWordToWordList(wordList, objWord);
  724. }
  725. }
  726. switch (g_wordListOrderby) {
  727. case "count":
  728. if (g_wordListOrder) {
  729. wordList.sort(sortCountDesc);
  730. arrowCount = "↓";
  731. } else {
  732. wordList.sort(sortCountAsc);
  733. arrowCount = "↑";
  734. }
  735. break;
  736. case "pali":
  737. if (g_wordListOrder) {
  738. wordList.sort(sortPaliDesc);
  739. arrowPali = "↓";
  740. } else {
  741. wordList.sort(sortPaliAsc);
  742. arrowPali = "↑";
  743. }
  744. break;
  745. case "real":
  746. if (g_wordListOrder) {
  747. wordList.sort(sortRealDesc);
  748. arrowReal = "↓";
  749. } else {
  750. wordList.sort(sortRealAsc);
  751. arrowReal = "↑";
  752. }
  753. break;
  754. }
  755. sTableWordList = sTableWordList + "<table border='0' cellpadding='3' ><tr class='h'>";
  756. sTableWordList = sTableWordList + "<th>序号</th>";
  757. sTableWordList =
  758. sTableWordList + '<th><a herf="" onclick="sortWordList(\'count\')">计数' + arrowCount + "</a></th>";
  759. sTableWordList = sTableWordList + '<th><a herf="" onclick="sortWordList(\'pali\')">Pali' + arrowPali + "</a></th>";
  760. sTableWordList = sTableWordList + '<th><a herf="" onclick="sortWordList(\'real\')">Real' + arrowReal + "</a></th>";
  761. sTableWordList = sTableWordList + "<th>原型</th>";
  762. sTableWordList = sTableWordList + "<th>译文</th>";
  763. sTableWordList = sTableWordList + "<th>语法</th>";
  764. sTableWordList =
  765. sTableWordList +
  766. "<th><button type='button' id='btnApplyAll' onclick=\"applyAllWordInList(this)\" disabled>Apply All</button></th></tr>";
  767. for (var i = 0; i < wordList.length; i++) {
  768. objWord = wordList[i];
  769. sTableWordList += "<tr><td>" + i + "</td>";
  770. sTableWordList += "<td id='tablepali" + i + "'>" + objWord.count + "</td>";
  771. //sTableWordList += "<td>" +objWord.pali + "</td>";
  772. //sTableWordList += "<td>" +objWord.real + "</td>";
  773. sTableWordList +=
  774. '<td><input id="wlpali' +
  775. i +
  776. '" onkeyup="wordListItemChanged(\'wlApply' +
  777. i +
  778. "')\" value = '" +
  779. objWord.pali +
  780. "' />";
  781. sTableWordList +=
  782. '<td><input id="wlreal' +
  783. i +
  784. '" onkeyup="wordListItemChanged(\'wlApply' +
  785. i +
  786. "')\" value = '" +
  787. objWord.real +
  788. "' /></td>";
  789. sTableWordList +=
  790. '<td><input id="wlorg' +
  791. i +
  792. '" onkeyup="wordListItemChanged(\'wlApply' +
  793. i +
  794. "')\" value = '" +
  795. objWord.org +
  796. "' />";
  797. sTableWordList +=
  798. '<td><input id="wlmean' +
  799. i +
  800. '" onkeyup="wordListItemChanged(\'wlApply' +
  801. i +
  802. "')\" value = '" +
  803. objWord.mean +
  804. "' /></td>";
  805. sTableWordList +=
  806. '<td><input id="wlcase' +
  807. i +
  808. '" onkeyup="wordListItemChanged(\'wlApply' +
  809. i +
  810. "')\" value = '" +
  811. objWord.case +
  812. "' /></td>";
  813. sTableWordList +=
  814. '<td><button id="wlApply' +
  815. i +
  816. '" onclick="updataWord(\'' +
  817. i +
  818. "')\" type='button' disabled >Apply</button></td></tr>";
  819. }
  820. sTableWordList = sTableWordList + "</table>";
  821. g_countWordList = wordList.length;
  822. return sTableWordList;
  823. }
  824. function sortCountDesc(a, b) {
  825. return a.count - b.count;
  826. }
  827. function sortCountAsc(a, b) {
  828. return b.count - a.count;
  829. }
  830. function sortPaliDesc(a, b) {
  831. return a.pali.localeCompare(b.pali);
  832. }
  833. function sortPaliAsc(a, b) {
  834. return b.pali.localeCompare(a.pali);
  835. }
  836. function sortRealDesc(a, b) {
  837. return a.real.localeCompare(b.real);
  838. }
  839. function sortRealAsc(a, b) {
  840. return b.real.localeCompare(a.real);
  841. }
  842. function addWordToWordList(wordArray, newWord) {
  843. var index = -1;
  844. for (var i = 0; i < wordArray.length; i++) {
  845. if (wordArray[i].pali == newWord.pali) {
  846. if (wordArray[i].real == newWord.real) {
  847. if (wordArray[i].mean == newWord.mean) {
  848. if (wordArray[i].org == newWord.org) {
  849. if (wordArray[i].om == newWord.om) {
  850. if (wordArray[i].case == newWord.case) {
  851. index = i;
  852. break;
  853. }
  854. }
  855. }
  856. }
  857. }
  858. }
  859. }
  860. if (index >= 0) {
  861. wordArray[index].count++;
  862. wordArray[index].wordid += "$" + newWord.index;
  863. } else {
  864. wordArray.push(newWord);
  865. }
  866. }
  867. function refreshWordList() {
  868. document.getElementById("word_table_inner").innerHTML = makeWordList();
  869. }
  870. function wordListItemChanged(btnApplyId) {
  871. try {
  872. document.getElementById(btnApplyId).disabled = false;
  873. document.getElementById("btnApplyAll").disabled = false;
  874. } catch (e) {
  875. alert(e);
  876. }
  877. }
  878. function applyAllWordInList() {
  879. for (var i = 0; i < g_countWordList; i++) {
  880. if (document.getElementById("wlApply" + i).disabled == false) {
  881. updataWord(i);
  882. }
  883. }
  884. document.getElementById("btnApplyAll").disabled = true;
  885. }
  886. function tran_edit(iSutta, iPar, iTran) {
  887. gTextEditMediaType = "translate";
  888. gSutta = iSutta;
  889. gPar = iPar;
  890. gTran = iTran;
  891. var tranText = getTranText(iSutta, iPar, iTran);
  892. document.getElementById("id_text_edit_area").value = tranText;
  893. document.getElementById("id_text_edit_form").style.display = "block";
  894. }
  895. /*make book mark*/
  896. function bookMark() {
  897. var colorStyle = "";
  898. var strBookMark = "";
  899. var iWordCount = 0;
  900. xWord = gXmlBookDataBody.getElementsByTagName("word");
  901. /*遍历所有单词*/
  902. var xBlock = gXmlBookDataBody.getElementsByTagName("block");
  903. var iWordCount = 0;
  904. for (iBlock = 0; iBlock < xBlock.length; iBlock++) {
  905. var xData = xBlock[iBlock].getElementsByTagName("data")[0];
  906. parInfo = xBlock[iBlock].getElementsByTagName("info")[0];
  907. book = getNodeText(parInfo, "book");
  908. parNo = getNodeText(parInfo, "paragraph");
  909. xWord = xData.getElementsByTagName("word");
  910. for (k = 0; k < xWord.length; k++) {
  911. strWordPali = getNodeText(xWord[k], "pali");
  912. strWordMean = getNodeText(xWord[k], "mean");
  913. strWordId = getNodeText(xWord[k], "id");
  914. strWordBookMarkColor = getNodeText(xWord[k], "bmc");
  915. if (strWordBookMarkColor.length > 0) {
  916. if (strWordBookMarkColor.substr(3, 1) != 0) {
  917. /*屏蔽显示注释的Bug*/
  918. var markString = strWordBookMarkColor.substr(3, 1);
  919. colorStyle = "bookmarkcolor" + markString;
  920. var bookMarkId = "w" + strWordId;
  921. strBookMark +=
  922. '<p class="bm' +
  923. markString +
  924. "\"><span class='bookmarkcolorblock , " +
  925. colorStyle +
  926. "'>" +
  927. markString +
  928. "</span>";
  929. //strBookMark += "<a href=\"#"+bookMarkId+"\">"+strWordPali+":"+strWordMean.substr(3,10)+"</a></p>";
  930. strBookMark +=
  931. "<a onclick=\"editor_goto_link('" +
  932. book +
  933. "'," +
  934. parNo +
  935. ",'" +
  936. bookMarkId +
  937. "')\">" +
  938. strWordPali +
  939. ":" +
  940. strWordMean.substr(3, 10) +
  941. "</a></p>";
  942. }
  943. }
  944. iWordCount++;
  945. }
  946. }
  947. return strBookMark;
  948. }
  949. function setBookmarkVisibility_all() {
  950. var book_MarkId_array = new Array();
  951. var book_MarkClass_array = new Array();
  952. for (bookMark_i in g_bookMark_array) {
  953. book_MarkId_array.push("B_Bookmark_" + g_bookMark_array[bookMark_i]);
  954. book_MarkClass_array.push("bm" + g_bookMark_array[bookMark_i]);
  955. }
  956. var isVisible = document.getElementById("B_Bookmark_All").checked;
  957. for (bookMark_j in book_MarkId_array) {
  958. eval("document.getElementById('" + book_MarkId_array[bookMark_j] + "').checked=isVisible");
  959. getStyleClass(book_MarkClass_array[bookMark_j]).style.display = isVisible ? "block" : "none";
  960. var book_mark_spanId = "";
  961. book_mark_spanId = book_MarkId_array[bookMark_j] + "_span";
  962. if (isVisible == true) {
  963. eval("lock_key(" + book_mark_spanId + ".id,'on','" + book_MarkId_array[bookMark_j] + "','bookmark')");
  964. } else {
  965. eval("lock_key(" + book_mark_spanId + ".id,'off','" + book_MarkId_array[bookMark_j] + "','bookmark')");
  966. }
  967. }
  968. }
  969. function setBookmarkVisibility(className, controlID) {
  970. var isVisible = document.getElementById(controlID).checked;
  971. getStyleClass(className).style.display = isVisible ? "flex" : "none";
  972. }
  973. /*刷新书签*/
  974. function refreshBookMark() {
  975. document.getElementById("navi_bookmark_inner").innerHTML = bookMark();
  976. }
  977. /*Apply all system match words*/
  978. function applyAllSysMatch() {
  979. var iWordCount = 0;
  980. var iModified = 0;
  981. xWord = gXmlBookDataBody.getElementsByTagName("word");
  982. /*遍历此经中所有单词*/
  983. for (k = 0; k < xWord.length; k++) {
  984. {
  985. if (getNodeText(xWord[k], "bmc") == "bmca") {
  986. setNodeText(xWord[k], "bmc", "bmc0");
  987. updataWordBodyByElement(xWord[k]);
  988. iModified++;
  989. }
  990. }
  991. iWordCount++;
  992. }
  993. if (iWordCount > 0) {
  994. document.getElementById("navi_bookmark_inner").innerHTML = bookMark();
  995. }
  996. var_dump(iModified + "个单词被确认。");
  997. }
  998. function setUseMode(strUseMode) {
  999. var multi_trans_strUseMode = gLocal.gui.edit;
  1000. if (strUseMode == "Read") {
  1001. multi_trans_strUseMode =
  1002. '<svg class="icon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="svg/icon.svg#ic_reader_mode"></use></svg>';
  1003. } else {
  1004. multi_trans_strUseMode =
  1005. '<svg class="icon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="svg/icon.svg#ic_mode_edit"></use></svg>';
  1006. }
  1007. document.getElementById("use_mode").innerHTML =
  1008. multi_trans_strUseMode + '<svg class="small_icon"><use xlink:href="svg/icon.svg#ic_down"></use></svg>';
  1009. switch (strUseMode) {
  1010. case "Read":
  1011. g_useMode = "read";
  1012. getStyleClass("edit_tran_button").style.display = "none";
  1013. getStyleClass("edit_tool").style.display = "none";
  1014. getStyleClass("tran_input").style.display = "none";
  1015. break;
  1016. case "Edit":
  1017. g_useMode = "edit";
  1018. getStyleClass("edit_tran_button").style.display = "inline";
  1019. getStyleClass("edit_tool").style.display = "inline";
  1020. getStyleClass("tran_input").style.display = "none";
  1021. break;
  1022. case "Translate":
  1023. g_useMode = "translate";
  1024. getStyleClass("edit_tran_button").style.display = "inline";
  1025. getStyleClass("tran_input").style.display = "block";
  1026. break;
  1027. }
  1028. if (gXmlBookDataBody != null) {
  1029. var mWordNode = gXmlBookDataBody.getElementsByTagName("word");
  1030. /*遍历所有单词*/
  1031. for (k = 0; k < mWordNode.length; k++) {
  1032. modifyWordDetailByWordIndex(k);
  1033. }
  1034. }
  1035. document.getElementById("menuUseMode").style.display = "none";
  1036. }
  1037. function setUseMode_Static(strUseMode) {
  1038. if (strUseMode == "chanting") {
  1039. document.getElementById("use_mode").innerHTML = "Chanting";
  1040. g_useMode = "chanting";
  1041. getStyleClass("chanting_enter").style.display = "block";
  1042. } else {
  1043. document.getElementById("use_mode").innerHTML = "Read";
  1044. g_useMode = "read";
  1045. getStyleClass("chanting_enter").style.display = "none";
  1046. }
  1047. dropbtnClick("menu01");
  1048. }
  1049. function hiddenMenu() {
  1050. getStyleClass("dropdown-content").style.display = "none";
  1051. }
  1052. function sortMeanByDictOrder(wa, wb) {
  1053. var w1 = wa.split("$")[0];
  1054. var w2 = wb.split("$")[0];
  1055. var index1 = wa.split("$")[1];
  1056. var index2 = wb.split("$")[1];
  1057. //order by dictionary index
  1058. order = w1 - w2;
  1059. if (order == 0) {
  1060. //if dictionay is same order by index of meaning array
  1061. order = index1 - index2;
  1062. }
  1063. return order;
  1064. }
  1065. function sortMeanByLanguageOrder(wa, wb) {
  1066. var w1 = wa.split("$")[4];
  1067. var w2 = wb.split("$")[4];
  1068. //order by dictionary index
  1069. order = w1 - w2;
  1070. return order;
  1071. }
  1072. function removeSameWordInArray(wordList) {
  1073. var output = new Array();
  1074. for (indexWord in wordList) {
  1075. oneWord = wordList[indexWord].split("$");
  1076. var isExist = false;
  1077. for (x in output) {
  1078. if (output[x].word == oneWord[3]) {
  1079. isExist = true;
  1080. }
  1081. }
  1082. if (!isExist) {
  1083. var objWord = new Object();
  1084. objWord.word = oneWord[3];
  1085. objWord.parent = oneWord[2];
  1086. output.push(objWord);
  1087. }
  1088. }
  1089. return output;
  1090. }