xml.js 33 KB

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