Procházet zdrojové kódy

Merge branch 'master' of https://github.com/visuddhinanda/mint

Bhikkhu-Kosalla před 5 roky
rodič
revize
61758ccde3

+ 1 - 1
app/dict/index.php

@@ -294,7 +294,7 @@ function GetPageScroll()
             border-bottom: 2px solid var(--link-hover-color);
         }
     </style>
-	<script language="javascript" src="dict.js"></script>
+	<script language="javascript" src="./dict.js"></script>
 
 	<div id="dict_search_result" style="background-color:white;color:black;">
 	</div>

+ 7 - 1
app/dict/word_statistics.php

@@ -73,7 +73,13 @@ require_once "../public/load_lang_js.php";//语言文件
     word : "<?php echo $_GET["word"] ?>"
   },
   function(data,status){
-    let worddata =  JSON.parse(data);
+    let worddata;
+      try {
+          worddata =  JSON.parse(data);
+      } catch (error) {
+          console(error);
+      }
+    
     // Splice in transparent for the center circle
     Highcharts.getOptions().colors.splice(0, 0, 'transparent');
 

+ 6 - 1
app/doc/coop.js

@@ -31,7 +31,12 @@ function username_search(keyword) {
             username: keyword
         },
         function (data, status) {
-            let result = JSON.parse(data);
+            let result;
+            try {
+                result = JSON.parse(data);
+            } catch (error) {
+                console(error);
+            }
             let html = "<ul id='user_search_list'>";
             if (result.length > 0) {
                 for (x in result) {

+ 2 - 2
app/install/step5.php

@@ -133,12 +133,12 @@ else{
 	if(!file_exists($db[0])){
         echo "<span style='color:red;'>数据库不存在</span>";
     	echo "</div>"; 
-        echo '<div style="flex:2;"><a href="step5.php?index='.$i.'">建立</a></div>';    
+        echo '<div style="flex:2;"><a href="step5.php?index=0">建立</a></div>';    
 	}
 	else{
         echo "<span style='color:green;'>已存在</span>";
     	echo "</div>"; 
-        echo '<div style="flex:2;"><a href="step5.php?index='.$i.'">清空</a><span style="color:red;">注意!此操作将删除原数据库中所有数据!</span></div>';
+        echo '<div style="flex:2;"><a href="step5.php?index=0">清空</a><span style="color:red;">注意!此操作将删除原数据库中所有数据!</span></div>';
     }
 	echo "</div>";  
 	?>

+ 0 - 0
app/pcdl/_FILE_DB_RES_INDEX_


+ 28 - 3
app/pcdl/css/reader.css

@@ -50,6 +50,7 @@
 }
 
 #main_text_view{
+    padding-left: 21em;
     padding-top:2.5em;
     font-family: 'Noto Sans', 'Noto Sans SC', 'Noto Sans TC', Arial, Verdana;
 }
@@ -274,6 +275,7 @@ input[type="submit"]:disabled {
     z-index: 15;
     -webkit-transition-duration: 0.4s;
     transition-duration: 0.4s;
+    border-right: 1px solid gray;
 }
 .viewswitch_on {
     -webkit-transform:translateX(0em);
@@ -282,9 +284,10 @@ input[type="submit"]:disabled {
     box-shadow: 5px 0 20px 5px var(--shadow-color);
 }
 .viewswitch_off {
--webkit-transform:translateX(-82em);
--moz-transform:translateX(-82em);
-transform:translateX(-82em);
+    -webkit-transform:translateX(0em);
+    -moz-transform:translateX:(0em);
+    transform:translateX:(0em);
+    box-shadow: 5px 0 20px 5px var(--shadow-color);
 }
 
 .common-tab {
@@ -419,4 +422,26 @@ color:red;
 
 #tool_bar_fix{
 	display:none;
+}
+
+#left_menu_hide{
+    display:none;
+}
+
+#toc_content>div{
+    padding: 4px 8px;
+}
+#toc_content>div>a{
+    width: 100%;
+    display: inline-block;
+    color: black;
+    text-decoration: none;
+}
+
+#toc_content>div:hover{
+	background-color:#f1f1f1
+}
+
+#para_nav_next_a , #para_nav_prev_a{
+    display:none;
 }

+ 24 - 0
app/pcdl/css/reader_mob.css

@@ -0,0 +1,24 @@
+.viewswitch_on {
+    -webkit-transform:translateX(0em);
+    -moz-transform:translateX:(0em);
+    transform:translateX:(0em);
+    box-shadow: 5px 0 20px 5px var(--shadow-color);
+}
+.viewswitch_off {
+-webkit-transform:translateX(-82em);
+-moz-transform:translateX(-82em);
+transform:translateX(-82em);
+}
+
+#main_text_view{
+    padding-left: 1em;
+    padding-top:2.5em;
+    font-family: 'Noto Sans', 'Noto Sans SC', 'Noto Sans TC', Arial, Verdana;
+}
+
+#para_nav_prev , #para_nav_next{
+    display:none;
+}
+#para_nav_next_a , #para_nav_prev_a{
+    display:inline-block;
+}

+ 3 - 3
app/pcdl/dighest.php

@@ -91,7 +91,7 @@ else{
 	}	
 
 //更新索引数据库
-	$db_file =  _FILE_DB_RES_INDEX_;
+	$db_file =  _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");
 
 	// 开始一个事务,关闭自动提交
@@ -99,7 +99,7 @@ else{
 	$query="INSERT INTO 'index' ('id','book','paragraph','level','type','language','title','author','editor','edition','share','album','update_time') VALUES (NULL,?,?,?,?,?,?,?,?,?,?,?,?)";
 	$stmt = $PDO->prepare($query);
 
-	$newData=array($first_book,$first_paragraph,$new_index,,'dighest','sc',$title,4,4,1,4,$first_album,time());
+	$newData = array($first_book,$first_paragraph,$new_index,'dighest','sc',$title,4,4,1,4,$first_album,time());
 	$stmt->execute($newData);
 
 
@@ -114,7 +114,7 @@ else{
 	}
 
 //更新tag数据库
-	$db_file =  _FILE_DB_RES_INDEX_;
+	$db_file =  _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");
 
 	// 开始一个事务,关闭自动提交

+ 1 - 1
app/pcdl/get_best.php

@@ -24,7 +24,7 @@ else{
 	echo "no op";
 	exit;
 }
-	$db_file = _FILE_DB_RES_INDEX_;
+	$db_file = _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");
 	switch($op){
 		case "all":

+ 2 - 2
app/pcdl/get_res_index.php

@@ -50,7 +50,7 @@ else{
 		return($str_size);
 	}
 
-	PDO_Connect("sqlite:"._FILE_DB_RES_INDEX_);
+	PDO_Connect("sqlite:"._FILE_DB_RESRES_INDEX_);
 
 //资源名称
 	$res_title="";
@@ -156,7 +156,7 @@ else{
 			echo "</div>";
 			echo "</div>";		
 			
-			PDO_Connect("sqlite:"._FILE_DB_RES_INDEX_);			
+			PDO_Connect("sqlite:"._FILE_DB_RESRES_INDEX_);			
 			$query = "select resindex.id,resindex.title,resindex.type,resindex.album,author.name from 'index' as resindex LEFT JOIN author ON resindex.author = author.id where resindex.book='$book' and resindex.paragraph=$paragraph and resindex.type<>7 group by resindex.album";
 			$Fetch = PDO_FetchAll($query);
 			$iFetch=count($Fetch);

+ 1 - 1
app/pcdl/getfilelist.php

@@ -24,7 +24,7 @@ else{
 
 //获取服务器端文件列表
 
-$db_file = _FILE_DB_RES_INDEX_;
+$db_file = _FILE_DB_RESRES_INDEX_;
 PDO_Connect("sqlite:$db_file");
 /*
 $files = scandir($dir);

+ 463 - 132
app/pcdl/reader.php

@@ -1,80 +1,18 @@
-<?php
-require_once "../public/_pdo.php";
-require_once "../path.php";
-
-if(isset($_GET["album"])){
-	$album=$_GET["album"];
-}
-
-if(isset($_GET["book"])){
-	$book=$_GET["book"];
-}
-else{
-	echo "no book id";
-	exit;
-}
-if(substr($book,0,1)=='p'){
-	$book=substr($book,1);
-}
-if(isset($_GET["paragraph"])){
-	$paragraph = $_GET["paragraph"];
-}
-else{
-	$paragraph = -1;
-}
-?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html>
 <head>
 	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 	<meta name="viewport" content="width=device-width, initial-scale=1.0">
 	<link type="text/css" rel="stylesheet" href="css/reader.css"/>
-	<title>PCD Reader</title>
-	<style>
-	.word{
-		display:inline-block;
-		padding: 1px 3px;
-	}
-	.mean{
-		font-size: 65%;
-	}
-		/* 下拉内容 (默认隐藏) */
-	#mean_menu {
-		margin: 0.3em;
-		position: absolute;
-		background-color: white;
-		min-width: 8em;
-		max-width: 30em;
-		margin: -1px 0px;
-		box-shadow: 0px 3px 13px 0px black;
-		color: var(--main-color);
-		z-index: 200;
-	}
+	<link type="text/css" rel="stylesheet" href="css/reader_mob.css" media="screen and (max-width:767px)">
+	<title id="page_title">PCD Reader</title>
 
-	/* 下拉菜单的链接 */
-	#mean_menu a {
-		/*padding: 0.3em 0.4em;*/
-		line-height: 160%;
-		text-decoration: none;
-		display: block;
-		cursor: pointer;
-		text-align: left;
-		font-size:80%;
-	}
-
-	/* 鼠标移上去后修改下拉菜单链接颜色 */
-	.mean_menu a:hover {
-		background-color: blue;
-		color: white;
-	}
-
-	</style>
 	<script src="js/jquery-3.3.1.min.js"></script>
 	<script src="js/fixedsticky.js"></script>
 	<script src="js/reader.js"></script>
+	<script src="../term/term.js"></script>
+	<script src="../term/note.js"></script>
 	
-	<script src="../appdata/dict/3rd/bh.js"></script>
-	<script src="../appdata/dict/system/sys_regular.js"></script>
 	<script>
 		var curr_tool="";
 		var dighest_count=0;//书摘段落数量
@@ -398,7 +336,100 @@ else{
 
 		}
 	</script>
-<body class="reader_body" onload="">
+<body class="reader_body" >
+
+<?php
+require_once "../public/_pdo.php";
+require_once "../path.php";
+?>
+
+<style>
+		#para_nav {
+			display: flex;
+			justify-content: space-between;
+			padding: 5px 1em;
+			border-top: 1px solid gray;
+		}
+
+	.word{
+		display:inline-block;
+		padding: 1px 3px;
+	}
+	.mean{
+		font-size: 65%;
+	}
+		/* 下拉内容 (默认隐藏) */
+	#mean_menu {
+		margin: 0.3em;
+		position: absolute;
+		background-color: white;
+		min-width: 8em;
+		max-width: 30em;
+		margin: -1px 0px;
+		box-shadow: 0px 3px 13px 0px black;
+		color: var(--main-color);
+		z-index: 200;
+	}
+
+	/* 下拉菜单的链接 */
+	#mean_menu a {
+		/*padding: 0.3em 0.4em;*/
+		line-height: 160%;
+		text-decoration: none;
+		display: block;
+		cursor: pointer;
+		text-align: left;
+		font-size:80%;
+	}
+
+	/* 鼠标移上去后修改下拉菜单链接颜色 */
+	.mean_menu a:hover {
+		background-color: blue;
+		color: white;
+	}
+
+.par_pali_div{
+	margin-top:1em;
+}
+.par_pali_div{
+	font-weight:700;
+}
+sent{
+	font-weight:500;
+	font-size:110%;
+	line-height: 150%;
+}
+sent:hover{
+	background-color:#fefec1;
+}
+para{
+    color: white;
+    background-color: #b76f03a3;
+    min-width: 2em;
+    display: inline-block;
+    text-align: center;
+    padding: 2px 10px;
+    border-radius: 99px;
+	margin-right: 5px;
+	cursor:pointer;
+}
+para:hover{
+
+}
+
+.sent_count{
+	font-size:80%;
+    color: white;
+    background-color: #1cb70985;
+    min-width: 2em;
+    display: inline-block;
+    text-align: center;
+    padding: 2px 0;
+    border-radius: 99px;
+	margin-left: 5px;	
+	cursor:pointer;
+}
+</style>
 		<!-- tool bar begin-->
 		<div id="main_tool_bar" class='reader_toolbar'>
 			<div id="index_nav">
@@ -408,17 +439,16 @@ else{
 				<span id="tool_bar_title">Title</span>
 			</div>
 			<div>
-				<a>☆★</a>
 				<div class="case_dropdown">
 					<p class="case_dropbtn"><button>A</button></p>
-					<div class="case_dropdown-content" style="width:25em;">
+					<div class="case_dropdown-content" style="right: 0;width:10em;">
 						<div ><button>A+</button><button>A-</button></div>
 						<div ><button>白</button><button>棕</button><button>夜s</button></div>
 					</div>
 				</div>
 				<div class="case_dropdown">
 					<p class="case_dropbtn"><button>┇</button></p>
-					<div class="case_dropdown-content">
+					<div class="case_dropdown-content" style="right: 2em;min-width:6em;">
 						<a onclick="tool_changed('dighest')">书摘</a>
 						<a onclick="tool_changed('comments')">批注</a>
 						<a onclick="tool_changed('target')">标签</a>
@@ -473,73 +503,292 @@ else{
 		<!--tool bar end -->
 		
 		<div id="main_text_view" style="padding-bottom: 10em;">
+		
 <?php
+$tocHtml="";
 
-	PDO_Connect("sqlite:"._FILE_DB_RES_INDEX_);
-	if(isset($album)){
-		//更新点击
-		$query = "select * from 'index' where book='$book' and paragraph='$paragraph' and album=$album";
-		$FetchRes = PDO_FetchAll($query);
-		if(count($FetchRes)>0){
-			$id=$FetchRes[0]["id"];
-			$hit=$FetchRes[0]["hit"]+1;
-			$query ="UPDATE 'index' SET hit = $hit WHERE id = $id";
-			$stmt = @PDO_Execute($query);
-					if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
-						$error = PDO_ErrorInfo();
-						print_r($error[2]);
-					}
+if(isset($_GET["album"])){
+	$album=$_GET["album"];
+}
+
+if(isset($_GET["book"])){
+	$book=$_GET["book"];
+}
+else{
+	echo "no book id";
+}
+if(substr($book,0,1)=='p'){
+	$book=substr($book,1);
+}
+if(isset($_GET["paragraph"])){
+	$paragraph = $_GET["paragraph"];
+}
+else if(isset($_GET["para"])){
+	$paragraph = $_GET["para"];
+}
+else{
+	$paragraph = -1;
+}
+
+	if(isset($_GET["view"])){
+		$_view = $_GET["view"];
+	}
+	else{
+		echo "Error : 未定义必要的参数view";
+		exit;
+	}
+
+	if(isset($_GET["display"])){
+		$_display = $_GET["display"];
+	}
+	else{
+		if($_view=="para" || $_view=="sent"){
+			$_display = "sent";//默认值
+		}
+		else{
+			$_display = "para";
+		}
+	}
+	if($_view=="chapter" || $_view=="para" || $_view=="sent" ){
+		PDO_Connect("sqlite:"._FILE_DB_PALITEXT_);
+		//获取段落信息 如 父段落 下一个段落等
+		$query = "select * from 'pali_text' where book='$book' and paragraph='$paragraph'";
+		$FetchParInfo = PDO_FetchAll($query);
+		if(count($FetchParInfo)==0){
+			echo "Error:no paragraph info";
+			echo $query;
+		}
+		$par_begin=$paragraph+1-1;
+		if($_view=="para"){
+			$par_end = $par_begin;
+		}
+		else{
+			$par_end=$par_begin+$FetchParInfo[0]["chapter_len"]-1;	
+		}
+		
+		$par_next=$FetchParInfo[0]["next_chapter"];	
+		$par_prev=$FetchParInfo[0]["prev_chapter"];	
+		$par_parent=$FetchParInfo[0]["parent"];	
+		if($par_parent >= 0){
+			$query = "select toc from 'pali_text' where book='$book' and paragraph='$par_parent'";
+			$FetchToc = PDO_FetchAll($query);
+			if(count($FetchToc)>0){
+				$_parent_title = $FetchToc[0]["toc"];
+			}
 		}
+		$query = "select paragraph,toc from 'pali_text' where book='$book' and parent='$paragraph' and level < '8'";
+		$FetchParent = PDO_FetchAll($query);
+		foreach ($FetchParent as $key => $value) {
+			$tocHtml .= "<div><a href='reader.php?view=chapter&book={$book}&para={$value["paragraph"]}'>{$value["toc"]}</a></div>";
+		}
+
+		//查询标题
+		if($_view=="chapter"){
+			$par_title = $FetchParInfo[0]["toc"];
+		}
+		else{
+			$par_title = $_parent_title;
+		}
+		//导航按钮		
+		if($_view=="sent"){
+			$next_para_link = "";
+			$prev_para_link = "";
+		}
+		else{
+			if($par_next != -1){
+				$query = "select paragraph , toc from 'pali_text' where book='$book' and paragraph='$par_next' ";
+				$FetchPara = PDO_FetchAll($query);
+				if(count($FetchPara)>0){
+					$next_para_link = "<a href='reader.php?view={$_view}&book={$book}&para={$par_next}'><span id='para_nav_next'>{$FetchPara[0]["toc"]}</span><span  id='para_nav_next_a'>下一个</span></a>〉";
+				}
+				else{
+					$next_para_link = "没有查询到标题";
+				}
+			}
+			else{
+				$next_para_link = "没了";
+			}
+
+			if($par_prev != -1){
+				$query = "select paragraph , toc from 'pali_text' where book='$book' and paragraph='$par_prev' ";
+				$FetchPara = PDO_FetchAll($query);
+				if(count($FetchPara)>0){
+					$prev_para_link = "〈<a href='reader.php?view={$_view}&book={$book}&para={$par_prev}'><span id='para_nav_prev_a'>前一个</span><span id='para_nav_prev'>{$FetchPara[0]["toc"]}</span></a>";
+				}
+				else{
+					$prev_para_link = "没有查询到标题";
+				}
+			}
+			else{
+				$prev_para_link = "没了";
+			}			
+		}
+
+
 	}
-	//获取段落信息 如 父段落 下一个段落等
-	$query = "select * from 'paragraph_info' where book='$book' and paragraph='$paragraph'";
-	$FetchParInfo = PDO_FetchAll($query);
-	if(!$FetchParInfo){
-		echo "Error:no paragraph info";
+		//设置标题栏的经文名称
+		echo "<script>";
+		echo "document.getElementById('tool_bar_title').innerHTML='".$par_title."'";
+		echo "</script>";
+
+	//上一级
+	echo "<div>";
+	switch($_view){
+		case 1 :
+		break;
+		case 2:
+		break;
+		case 3:
+		break;
+		case 4:
+		break;
+		case 5:
+		break;
+		case 5:
+		break;
+		case 6:
+		break;
+		case "chapter":
+			if($par_parent >= 0){
+				echo "<a href='reader.php?view={$_view}&book={$book}&paragraph={$par_parent}'>▲{$_parent_title}</a>";
+			}
+		break;
+		case "para":
+			if($par_parent >= 0){
+				echo "<a href='reader.php?view=chapter&book={$book}&paragraph={$par_parent}'>▲{$_parent_title}</a>";
+			}
+		break;
+		case "sent":
+				echo "<a href='reader.php?view=para&book={$book}&paragraph={$paragraph}'>▲{$paragraph}</a>";
+		break;
+		case 10:
+		break;
 	}
-	$par_begin=$paragraph+1-1;
-	$par_end=$par_begin+$FetchParInfo[0]["length"]-1;	
-	$par_next=$FetchParInfo[0]["next"];
+	echo "</div>";
 	//生成一个段落空壳 等会儿查询数据,按照不同数据类型填充进去
-	for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
-		echo "<div id='par-b$book-$iPar' class='par_div'>";
-		echo "<div id='par-pali-b$book-$iPar' class='par_pali_div'>";
-		echo "</div>";
-		echo "<div id='par-wbwdiv-b$book-$iPar' class='par_translate_div'>";
-		echo "</div>";
-		echo "<div id='par-translate-b$book-$iPar' class='par_translate_div'>";
-		echo "</div>";
-		echo "<div id='par-note-b$book-$iPar' class='par_translate_div'>";
-		echo "</div>";
-		echo "</div>";
-	}
-	
-	//先查pali text 因为要获取段落标题级别
-	$db_file = _FILE_DB_PALITEXT_;
-	PDO_Connect("sqlite:"._FILE_DB_PALITEXT_);
+	PDO_Connect("sqlite:"._FILE_DB_PALI_SENTENCE_);
 
-	if($par_begin==-1){
-		$query="SELECT * FROM \"pali_text\" WHERE book = '{$book}' ";
+	if($_display=="sent"){
+		//逐句显示
+		for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
+			if($_view=="sent"){
+				$query = "select text, begin, end from 'pali_sent' where book='$book' and paragraph='$paragraph' and begin='{$_GET["begin"]}' and end ='{$_GET["end"]}'";
+			}
+			else{
+				$query = "select text, begin, end from 'pali_sent' where book='$book' and paragraph='$iPar'";
+			}
+			
+			$FetchSent = PDO_FetchAll($query);
+			echo "<div id='par-b$book-$iPar' class='par_div'>";
+			echo "<para book='$book' para='$iPar'>$iPar</para>";
+			foreach ($FetchSent as $key => $value) {
+				echo "<div id='sent-pali-b$book-$iPar-{$value["begin"]}' class='par_pali_div'>";
+				$pali_sent = str_replace("{","<b>",$value["text"]);
+				$pali_sent = str_replace("}","</b>",$pali_sent);
+				echo "<sent book='{$book}' para='{$iPar}' begin='{$value["begin"]}' end='{$value["end"]}' >".$pali_sent."</sent>";
+				echo "</div>";
+				echo "<div id='sent-wbwdiv-b$book-$iPar-{$value["begin"]}' class='par_translate_div'>";
+				echo "</div>";
+				echo "<div id='sent-translate-b$book-$iPar-{$value["begin"]}' class='par_translate_div'>";
+				echo "</div>";
+			}
+			echo "</div>";
+		}
 	}
 	else{
-		$query="SELECT * FROM \"pali_text\" WHERE book = '{$book}' and  (\"paragraph\" BETWEEN ".$PDO->quote($par_begin)." AND ".$PDO->quote($par_end).") ";
+		//段落显示
+		for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
+			$query = "select text , begin, end  from 'pali_sent' where book='$book' and paragraph='$iPar'";
+			$FetchSent = PDO_FetchAll($query);
+			echo "<div id='par-b$book-$iPar' class='par_div'>";
+			echo "<div id='par-pali-b$book-$iPar' class='par_pali_div'>";
+			echo "<para book='$book' para='$iPar'>$iPar</para>";
+			foreach ($FetchSent as $key => $value) {
+				$sent_text = str_replace("{","<b>",$value["text"]) ;
+				$sent_text = str_replace("}","</b>",$sent_text) ;	
+				echo "<sent book='{$book}' para='{$iPar}' begin='{$value["begin"]}' end='{$value["end"]}' >{$sent_text}</sent>";
+			}
+			echo "</div>";
+			echo "<div id='par-wbwdiv-b$book-$iPar' class='par_translate_div'>";
+			echo "</div>";
+			echo "<div id='par-translate-b$book-$iPar' class='par_translate_div'>";
+			echo "</div>";
+			echo "<div id='par-note-b$book-$iPar' class='par_translate_div'>";
+			echo "</div>";
+			echo "</div>";
+		}
+	}	
+
+
+	if(isset($_GET["sent_mode"])){
+
 	}
-	//查询pali text内容
-	$FetchText = PDO_FetchAll($query);
-	$iFetchText=count($FetchText);
-	if($iFetchText>0){
-		for($i=0;$i<$iFetchText;$i++){
-			$currParNo=$FetchText[$i]["paragraph"];
-			$currParLevel=$FetchText[$i]["level"];
-			$par_level["$currParNo"]=$currParLevel;
-			echo "<div id='par-palitext-b{$book}-{$currParNo}' class='palitext_text'><div class=\"text_level_{$currParLevel}\">".$FetchText[$i]["text"]."</div></div>";
-			echo "<script>";
-			echo "document.getElementById('par-pali-b{$book}-{$currParNo}').appendChild(document.getElementById('par-palitext-b{$book}-{$currParNo}'));";
-			echo "</script>";					
+
+	PDO_Connect("sqlite:"._FILE_DB_SENTENCE_);
+	$dbh = new PDO("sqlite:"._FILE_DB_PALI_SENTENCE_, "", "");
+    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+	for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
+		if($_view=="sent"){
+			$FetchPaliSent = array(array("begin" => $_GET["begin"] , "end" => $_GET["end"]));
+		}
+		else{
+			$query = "select begin, end from 'pali_sent' where book='$book' and paragraph='$iPar'";
+			$stmt = $dbh->query($query);
+			$FetchPaliSent = $stmt->fetchAll(PDO::FETCH_ASSOC);			
 		}
 
-	}	
-	//巴利原文加载结束
+		foreach ($FetchPaliSent as $key => $value) {
+			$begin = $value["begin"];
+			$end = $value["end"];
+			if($_view=="sent"){
+				$query="SELECT * FROM \"sentence\" WHERE (book = '{$book}' AND  \"paragraph\" = ".$PDO->quote($iPar)." AND begin = '$begin' AND end = '$end' AND length(text)>0 )  order by modify_time  DESC";
+			}
+			else{
+				$query = "SELECT * FROM \"sentence\" WHERE book = '{$book}' AND  \"paragraph\" = ".$PDO->quote($iPar)." AND begin = '$begin' AND end = '$end' AND length(text)>0  order by modify_time DESC  limit 0, 1";
+			}
+
+			$query_count = "SELECT count(book) FROM \"sentence\" WHERE book = '{$book}' AND  \"paragraph\" = ".$PDO->quote($iPar)." AND begin = '$begin' AND end = '$end' AND length(text)>0  ";
+			$sent_count = PDO_FetchOne($query_count);
+			if($sent_count>9){
+				$sent_count = "9+";
+			}
+			$FetchText = PDO_FetchAll($query);
+			$iFetchText=count($FetchText);
+			if($iFetchText>0){
+				for($i=0;$i<$iFetchText;$i++){
+					$currParNo=$iPar;
+					if($_display=="sent"){
+						$sent_style = "display:block";
+					}
+					else{
+						$sent_style = "";
+					}
+					$tran_text = str_replace("[[","<term status='0'>",$FetchText[$i]["text"]);
+					$tran_text = str_replace("]]","</term>",$tran_text);
+					echo "<sent_trans style='{$sent_style}' id='sent-tran-b{$book}-{$currParNo}-{$FetchText[$i]["begin"]}-{$i}' class='sent_trans ' book='$book' para='$currParNo' begin='{$FetchText[$i]["begin"]}'>".$tran_text;
+					if($_view!="sent" && $_display=="sent"){
+						echo "<span class='sent_count'>$sent_count</span>";
+					}
+					echo "</sent_trans>";
+					echo "<script>";
+					if($_display=="sent"){
+						echo "document.getElementById('sent-translate-b{$book}-{$currParNo}-{$FetchText[$i]["begin"]}').appendChild(document.getElementById('sent-tran-b{$book}-{$currParNo}-{$FetchText[$i]["begin"]}-{$i}'));";
+					}
+					else{
+						echo "document.getElementById('par-translate-b{$book}-{$currParNo}').appendChild(document.getElementById('sent-tran-b{$book}-{$currParNo}-{$FetchText[$i]["begin"]}-{$i}'));";
+					}
+					echo "</script>";
+				}
+			}
+	
+		}
+	}
+		//查询句子译文内容
+
+		//查询句子译文内容结束
+
+	echo "<div id='para_nav'><div>$prev_para_link</div><div>$next_para_link</div></div>";
+
 	if(isset($album)){
 
 		/*
@@ -572,7 +821,8 @@ else{
 		*/
 		
 		
-		PDO_Connect("sqlite:"._FILE_DB_RES_INDEX_);
+
+		PDO_Connect("sqlite:"._FILE_DB_RESRES_INDEX_);
 		$query = "select * from 'album' where id='$album'";
 		$Fetch = PDO_FetchAll($query);
 		$iFetch=count($Fetch);
@@ -734,12 +984,13 @@ else{
 			</div>
 		</div>
 	</div>
-	
+	<!-- 全屏 黑色背景 -->	
+	<div id="BV" class="blackscreen" onclick="setNaviVisibility()"></div>
 		<!-- nav begin--> 
 
 		<div id="leftmenuinner" class="viewswitch_off">
 			<div class="win_caption">
-				<div><button onclick="setNaviVisibility()">返回</button></div>
+				<div><button id="left_menu_hide" onclick="setNaviVisibility()">返回</button></div>
 				<div id="menubartoolbar_New">
 					<ul class="common-tab">
 						<li id="content_menu_li" class="common-tab_li_act" onclick="menuSelected_2(menu_toc,'content_menu_li')">目录</li>
@@ -754,7 +1005,7 @@ else{
 			<!-- toc begin -->
 			<div class="menu" id="menu_toc">
 				<a name="_Content" ></a>
-				<select name="menu" onchange="show_toc_level(this)">
+				<select name="menu" onchange="show_toc_level(this)" style="display:none;">
 					<option value="1">1</option>
 					<option value="2">2</option>
 					<option value="3">3</option>
@@ -763,7 +1014,7 @@ else{
 					<option value="6">6</option>
 					<option value="7">7</option>
 				</select>
-				<div class="tocitems" id="content"><?php echo $tocHtml; ?></div>
+				<div  id="toc_content"><?php echo $tocHtml; ?></div>
 			</div>
 			<!-- toc end -->
 			<!-- comments begin -->
@@ -788,12 +1039,12 @@ else{
 			</div>
 			<!-- book mark end -->
 			
-						
 			</div>
 		
 		</div>
 		<!-- nav end -->	
-		<div id="BV" class="blackscreen" onclick="setNaviVisibility()"></div>
+
+
 		<div id="mean_menu" ></div>
 		<script>
 		//lookup();
@@ -814,6 +1065,86 @@ else{
 		  
 		});
 
+		$("sent").click(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			let begin = $(this).attr("begin");
+			let end = $(this).attr("end");
+			window.location.assign("reader.php?view=sent&book="+book+"&para="+para+"&begin="+begin+"&end="+end);
+		});
+		$("sent").mouseenter(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			let begin = $(this).attr("begin");
+			$(this).css("background-color","#fefec1");
+			$("sent_trans[book='"+book+"'][para='"+para+"'][begin='"+begin+"']").css("background-color","#fefec1");
+		});
+		$("sent").mouseleave(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			let begin = $(this).attr("begin");
+			$(this).css("background-color","unset");
+			$("sent_trans[book='"+book+"'][para='"+para+"'][begin='"+begin+"']").css("background-color","unset");
+		});
+
+		$("para").mouseenter(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			$("sent[book='"+book+"'][para='"+para+"']").css("background-color","#fefec1");
+		});
+		$("para").mouseleave(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			$("sent[book='"+book+"'][para='"+para+"']").css("background-color","unset");
+		});
+
+		$("sent_trans").mouseenter(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			let begin = $(this).attr("begin");
+			$(this).css("background-color","#fefec1");
+			$("sent[book='"+book+"'][para='"+para+"'][begin='"+begin+"']").css("background-color","#fefec1");
+		});
+		$("sent_trans").mouseleave(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			let begin = $(this).attr("begin");
+			$(this).css("background-color","unset");
+			$("sent[book='"+book+"'][para='"+para+"'][begin='"+begin+"']").css("background-color","unset");
+		});
+
+		$("para").click(function(e){
+			let book = $(this).attr("book");
+			let para = $(this).attr("para");
+			window.location.assign("reader.php?view=para&book="+book+"&para="+para);
+		});
+
+		term_updata_translation();
+		var wordlist =  new Array();
+	$("term").each(function(index,element){
+		wordlist.push($(this).attr("pali"));
+	}
+	);
+	
+	function haha(){
+		var wordquery ="('" + wordlist.join("','")+"')";
+		$.post("../term/term.php",
+		{
+			op:"extract",
+			words:wordquery
+		},
+		function(data,status){
+			if(data.length>0){
+				try{
+					arrMyTerm = JSON.parse(data);
+					term_updata_translation();
+				}
+				catch(e){
+					console.error(e.error+" data:"+data);
+				}
+			}
+		});			
+	}
 
 		</script>
 	

+ 821 - 0
app/pcdl/reader_old.php

@@ -0,0 +1,821 @@
+<?php
+require_once "../public/_pdo.php";
+require_once "../path.php";
+
+if(isset($_GET["album"])){
+	$album=$_GET["album"];
+}
+
+if(isset($_GET["book"])){
+	$book=$_GET["book"];
+}
+else{
+	echo "no book id";
+	exit;
+}
+if(substr($book,0,1)=='p'){
+	$book=substr($book,1);
+}
+if(isset($_GET["paragraph"])){
+	$paragraph = $_GET["paragraph"];
+}
+else{
+	$paragraph = -1;
+}
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<link type="text/css" rel="stylesheet" href="css/reader.css"/>
+	<title>PCD Reader</title>
+	<style>
+	.word{
+		display:inline-block;
+		padding: 1px 3px;
+	}
+	.mean{
+		font-size: 65%;
+	}
+		/* 下拉内容 (默认隐藏) */
+	#mean_menu {
+		margin: 0.3em;
+		position: absolute;
+		background-color: white;
+		min-width: 8em;
+		max-width: 30em;
+		margin: -1px 0px;
+		box-shadow: 0px 3px 13px 0px black;
+		color: var(--main-color);
+		z-index: 200;
+	}
+
+	/* 下拉菜单的链接 */
+	#mean_menu a {
+		/*padding: 0.3em 0.4em;*/
+		line-height: 160%;
+		text-decoration: none;
+		display: block;
+		cursor: pointer;
+		text-align: left;
+		font-size:80%;
+	}
+
+	/* 鼠标移上去后修改下拉菜单链接颜色 */
+	.mean_menu a:hover {
+		background-color: blue;
+		color: white;
+	}
+
+	</style>
+	<script src="js/jquery-3.3.1.min.js"></script>
+	<script src="js/fixedsticky.js"></script>
+	<script src="js/reader.js"></script>
+	
+	<script src="../appdata/dict/3rd/bh.js"></script>
+	<script src="../appdata/dict/system/sys_regular.js"></script>
+	<script>
+		var curr_tool="";
+		var dighest_count=0;//书摘段落数量
+		var res_list=new Array();
+		var new_comments_album=-1;
+		var new_comments_book=-1;
+		var new_comments_paragraph=-1;
+		function add_new_res(album,book,paragraph,text){
+			var new_res=new Object();
+			new_res.album=album;
+			new_res.book=book;
+			new_res.paragraph=paragraph;
+			new_res.dighest=false;
+			new_res.text=text;
+			new_res.textchanged=false;
+			res_list.push(new_res);
+		}
+		function tool_changed(tool_name){
+			if(tool_name==curr_tool){
+				return;
+			}
+			$("#main_tool_bar").fadeOut();
+			curr_tool=tool_name;
+			switch(tool_name){
+				case "comments":
+					$("#tool_bar_dighest").fadeOut();
+					$("#tool_bar_comments").fadeIn();
+				break;
+				case "dighest":
+					$("#tool_bar_comments").fadeOut();
+					$("#tool_bar_dighest").fadeIn();
+				break;
+				case "fix":
+					$("#tool_bar_comments").fadeOut();
+					$("#tool_bar_fix").fadeIn();
+					render_all_tran();
+				break;
+			}
+			
+		}
+		function paragraph_click(album,book,paragraph){
+			switch(curr_tool){
+				case "comments":
+					new_comments(album,book,paragraph);
+				break;
+				case "dighest":
+					dighest_par_click(album,book,paragraph);
+				break;
+			}
+		}
+		function new_comments(album,book,paragraph){
+			new_comments_album=album;
+			new_comments_book=book;
+			new_comments_paragraph=paragraph;
+			document.getElementById("new-comm-a"+album+"-b"+book+"-"+paragraph).appendChild(document.getElementById("new_comm_div"));
+			
+		}
+		function new_comm_cancel(){
+			$("#tool_bar_comments").fadeOut();
+			$("#main_tool_bar").fadeIn();			
+			document.getElementById("new_comm_text").value="";
+			document.getElementById("new_comm_shell").appendChild(document.getElementById("new_comm_div"));
+			curr_tool="";
+		}
+		function new_comm_submit(){
+			$("#tool_bar_comments").fadeOut();
+			$("#main_tool_bar").fadeIn();
+			curr_tool="";
+			var comm_text=document.getElementById("new_comm_text").value;
+			$.post("comments.php",
+			{
+				album:new_comments_album,
+				book:new_comments_book,
+				paragraph:new_comments_paragraph,
+				text:comm_text
+			},
+			function(data,status){
+				alert("Data: " + data + "\nStatus: " + status);
+			});
+		}
+		
+		//书摘处理		
+		function dighest_par_click(album,book,paragraph){
+			for (var x in res_list){
+				if(
+				res_list[x].album==album && 
+				res_list[x].book==book && 
+				res_list[x].paragraph==paragraph){
+					if(res_list[x].dighest==false){
+						res_list[x].dighest=true;
+						res_list[x].text=document.getElementById("text-a"+album+"-b"+book+"-"+paragraph).innerHTML;
+						$("#text-a"+album+"-b"+book+"-"+paragraph).css("background-color","yellow");
+						dighest_count++;
+					}
+					else{
+						res_list[x].dighest=false;
+						$("#text-a"+album+"-b"+book+"-"+paragraph).css("background-color","white");
+						dighest_count--;
+					}
+				}
+			}
+			$("#dighest_message").text="已经选择"+dighest_count+"段";
+		}
+
+		//将段落列表重置
+		function dighest_reset_res_list(){
+			for (var x in res_list){
+				var album=res_list[x].album;
+				var book=res_list[x].book;
+				var paragraph=res_list[x].paragraph;
+
+					if(res_list[x].dighest==false){
+						dighest_count=0;
+					}
+					else{
+						res_list[x].dighest=false;
+						$("#text-a"+album+"-b"+book+"-"+paragraph).css("background-color","white");
+						dighest_count=0;
+					}
+
+			}
+		}
+		
+		function dighest_cancle(){
+			$("#tool_bar_dighest").fadeOut();
+			$("#main_tool_bar").fadeIn();
+			curr_tool="";
+			//将段落列表重置
+			dighest_reset_res_list();
+		}
+		function dighest_ok(){
+			var output="";
+			for (var x in res_list){
+				if(res_list[x].dighest==true){
+					output+="<p>"+res_list[x].text+"</p>";
+				}
+			}
+			//书摘文字预览
+			document.getElementById("dighest_text_preview").innerHTML=output;
+			$("#tool_bar_dighest").fadeOut();
+			$("#dighest_edit_div").fadeIn();
+
+		}
+		
+		function dighest_edit_cancle(){
+			$("#dighest_edit_div").fadeOut();
+			$("#main_tool_bar").fadeIn();
+			curr_tool="";
+			//将段落列表重置
+			dighest_reset_res_list();
+		}
+		function dighest_edit_submit(){
+			$("#dighest_edit_div").fadeOut();
+			$("#main_tool_bar").fadeIn();
+			curr_tool="";
+
+			//计算书摘数量 生成书摘字符串
+			if(res_list.length==0){
+				return;
+			}
+			var output=new Array();
+			for (var x in res_list){
+				if(res_list[x].dighest==true){
+					output.push(res_list[x].album+"-"+res_list[x].book+"-"+res_list[x].paragraph);
+				}
+			}
+
+			var dighest_text=output.join();
+			var dighest_title=document.getElementById("dighest_edit_title").value;
+			var dighest_summary=document.getElementById("dighest_edit_summary").value;
+			var dighest_tag=document.getElementById("dighest_edit_taget").value;
+			if(dighest_title==""){alert("标题不能为空");return;}
+			if(dighest_summary==""){alert("简介不能为空");return;}
+			if(dighest_tag==""){alert("标签不能为空");return;}
+			$.post("dighest.php",
+			{
+				title:dighest_title,
+				summary:dighest_summary,
+				tag:dighest_tag,
+				data:dighest_text
+			},
+			function(data,status){
+				alert("Data: " + data + "\nStatus: " + status);
+			});	
+			//将段落列表重置
+			dighest_reset_res_list();			
+		}
+		
+		function setNaviVisibility(){
+			var objNave = document.getElementById('leftmenuinner');
+			var objblack = document.getElementById('BV');
+			if ( objNave.className=='viewswitch_off'){
+				objblack.style.display = "block";
+				objNave.className = "viewswitch_on";
+			}
+			else{
+				objblack.style.display = "none";
+				objNave.className = "viewswitch_off";
+			}
+		}
+		
+		function render_all_tran(mode="fix"){
+			for (var x in res_list){
+				var album=res_list[x].album;
+				var book=res_list[x].book;
+				var paragraph=res_list[x].paragraph;
+				var text=res_list[x].text;
+				if(mode=="fix"){
+					var new_text=getSuperTranslateModifyString(x);
+				}
+				else{
+					var new_text=text;
+				}
+				var obj=document.getElementById("text-a"+album+"-b"+book+"-"+paragraph);
+				if(obj){
+					obj.innerHTML=new_text;
+				}
+			}
+		}
+		function getSuperTranslateModifyString(index){
+			var newString = res_list[index].text.replace(/。/g,"。#");
+			newString = newString.replace(/,/g,",#");
+			newString = newString.replace(/!/g,"!#");
+			newString = newString.replace(/?/g,"?#");
+			newString = newString.replace(/”/g,"”#");
+			newString = newString.replace(/“/g,"“#");
+			newString = newString.replace(/’/g,"’#");
+			
+			arrString = newString.split("#");
+			
+			var output="";
+			var str_pos=0;
+			for (x in arrString){
+				var str_len=arrString[x].length;
+				str_pos+=str_len;
+				output +=arrString[x]+"<span  class=\"tooltip\">※<span class=\"tooltiptext tooltip-bottom\"><button onclick='text_move("+index+"," + str_pos + ",0)'>▲</button> <button onclick='text_move("+index+"," + str_pos + ",1)'>▼</button> </span> </span> ";	
+			}
+			return output;
+		}
+		
+		function text_move(index,str_pos,updown){
+			if(updown==0 && index==0){
+				return;
+			}
+			if(updown==1 && index==res_list.length-1){
+				return;
+			}
+			if(updown==0){
+				res_list[index-1].text+=res_list[index].text.substring(0,str_pos);
+				res_list[index-1].textchanged=true;
+				res_list[index].text=res_list[index].text.substring(str_pos);
+				res_list[index].textchanged=true;
+				
+			}
+			else{
+				res_list[index+1].text=res_list[index].text.substring(str_pos)+res_list[index+1].text;
+				res_list[index+1].textchanged=true;
+				res_list[index].text=res_list[index].text.substring(0,str_pos);
+				res_list[index].textchanged=true;
+			}
+			render_all_tran();
+		}
+		
+		function fix_cancle(){
+			$("#tool_bar_fix").fadeOut();
+			$("#main_tool_bar").fadeIn();
+			curr_tool="";
+			render_all_tran("");
+		}
+		function fix_ok(){
+			$("#tool_bar_fix").fadeOut();
+			$("#main_tool_bar").fadeIn();
+			curr_tool="";
+			render_all_tran("");
+
+			//计算书摘数量 生成书摘字符串
+			if(res_list.length==0){
+				return;
+			}
+			var output=new Array();
+			for (var x in res_list){
+				if(res_list[x].textchanged==true){
+					output.push(res_list[x].album+"@"+res_list[x].book+"@"+res_list[x].paragraph+"@"+res_list[x].text);
+					res_list[x].textchanged=false;
+				}
+			}
+
+			var fix_text=output.join("#");
+			var fix_album=res_list[0].album;
+			$.post("tran_text.php",
+			{
+				album:fix_album,
+				data:fix_text
+			},
+			function(data,status){
+				alert("Data: " + data + "\nStatus: " + status);
+			});	
+		}
+		
+		function lookup(){
+			var xPali=document.getElementsByClassName("pali");
+			for (var x in xPali){
+				var pali = xPali[x].innerHTML;
+				var xMean=xPali[x].nextSibling;
+				if(bh[pali]){
+					var arrMean=bh[pali].split("$");
+					if(arrMean.length>0){
+					xMean.innerHTML=arrMean[0];
+					}
+				}
+				else if(sys_r[pali]){
+					var word_parent=sys_r[pali];
+					if(bh[word_parent]){
+						var arrMean=bh[word_parent].split("$");
+						if(arrMean.length>0){
+							xMean.innerHTML=arrMean[0];
+						}
+					}
+				}
+			}
+
+		}
+	</script>
+<body class="reader_body" onload="">
+		<!-- tool bar begin-->
+		<div id="main_tool_bar" class='reader_toolbar'>
+			<div id="index_nav">
+				<button onclick="setNaviVisibility()">M</button>
+			</div>
+			<div>
+				<span id="tool_bar_title">Title</span>
+			</div>
+			<div>
+				<a>☆★</a>
+				<div class="case_dropdown">
+					<p class="case_dropbtn"><button>A</button></p>
+					<div class="case_dropdown-content" style="width:25em;">
+						<div ><button>A+</button><button>A-</button></div>
+						<div ><button>白</button><button>棕</button><button>夜s</button></div>
+					</div>
+				</div>
+				<div class="case_dropdown">
+					<p class="case_dropbtn"><button>┇</button></p>
+					<div class="case_dropdown-content">
+						<a onclick="tool_changed('dighest')">书摘</a>
+						<a onclick="tool_changed('comments')">批注</a>
+						<a onclick="tool_changed('target')">标签</a>
+						<a onclick="tool_changed('layout')">布局</a>
+						<a onclick="tool_changed('porpername')">术语</a>
+						<a onclick="tool_changed('share')">分享</a>		
+						<a onclick="tool_changed('fix')">修改</a>								
+					</div>
+				</div>			
+			
+			</div>
+		</div>	
+		
+		<div id="tool_bar_comments">
+			<div class='reader_toolbar' style="height:auto;">
+			<div>
+			</div>
+			<div>
+				<span>单击段落文字添加批注</span>
+			</div>
+			<div>			
+			</div>
+			</div>
+		</div>	
+		<div id="tool_bar_dighest">
+			<div  class='reader_toolbar'  style="height:auto;">
+			<div>
+				<button onclick="dighest_cancle()">取消</button>
+			</div>
+			<div>
+				<span id="dighest_message">单击文字选择段落</span>
+			</div>
+			<div>
+				<button onclick="dighest_ok()">完成</button>
+			</div>
+			</div>
+		</div>	
+		
+		<div id="tool_bar_fix">
+			<div  class='reader_toolbar'  style="height:auto;">
+			<div>
+				<button onclick="fix_cancle()">取消</button>
+			</div>
+			<div>
+				<span id="fix_message">单击按钮调整段落</span>
+			</div>
+			<div>
+				<button onclick="fix_ok()">完成</button>
+			</div>
+			</div>
+		</div>	
+		<!--tool bar end -->
+		
+		<div id="main_text_view" style="padding-bottom: 10em;">
+<?php
+
+	PDO_Connect("sqlite:"._FILE_DB_RESRES_INDEX_);
+	if(isset($album)){
+		//更新点击
+		$query = "select * from 'index' where book='$book' and paragraph='$paragraph' and album=$album";
+		$FetchRes = PDO_FetchAll($query);
+		if(count($FetchRes)>0){
+			$id=$FetchRes[0]["id"];
+			$hit=$FetchRes[0]["hit"]+1;
+			$query ="UPDATE 'index' SET hit = $hit WHERE id = $id";
+			$stmt = @PDO_Execute($query);
+					if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
+						$error = PDO_ErrorInfo();
+						print_r($error[2]);
+					}
+		}
+	}
+	//获取段落信息 如 父段落 下一个段落等
+	$query = "select * from 'paragraph_info' where book='$book' and paragraph='$paragraph'";
+	$FetchParInfo = PDO_FetchAll($query);
+	if(!$FetchParInfo){
+		echo "Error:no paragraph info";
+	}
+	$par_begin=$paragraph+1-1;
+	$par_end=$par_begin+$FetchParInfo[0]["length"]-1;	
+	$par_next=$FetchParInfo[0]["next"];
+	//生成一个段落空壳 等会儿查询数据,按照不同数据类型填充进去
+	for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
+		echo "<div id='par-b$book-$iPar' class='par_div'>";
+		echo "<div id='par-pali-b$book-$iPar' class='par_pali_div'>";
+		echo "</div>";
+		echo "<div id='par-wbwdiv-b$book-$iPar' class='par_translate_div'>";
+		echo "</div>";
+		echo "<div id='par-translate-b$book-$iPar' class='par_translate_div'>";
+		echo "</div>";
+		echo "<div id='par-note-b$book-$iPar' class='par_translate_div'>";
+		echo "</div>";
+		echo "</div>";
+	}
+	
+	//先查pali text 因为要获取段落标题级别
+	$db_file = _FILE_DB_PALITEXT_;
+	PDO_Connect("sqlite:"._FILE_DB_PALITEXT_);
+
+	if($par_begin==-1){
+		$query="SELECT * FROM \"pali_text\" WHERE book = '{$book}' ";
+	}
+	else{
+		$query="SELECT * FROM \"pali_text\" WHERE book = '{$book}' and  (\"paragraph\" BETWEEN ".$PDO->quote($par_begin)." AND ".$PDO->quote($par_end).") ";
+	}
+	//查询pali text内容
+	$FetchText = PDO_FetchAll($query);
+	$iFetchText=count($FetchText);
+	if($iFetchText>0){
+		for($i=0;$i<$iFetchText;$i++){
+			$currParNo=$FetchText[$i]["paragraph"];
+			$currParLevel=$FetchText[$i]["level"];
+			$par_level["$currParNo"]=$currParLevel;
+			echo "<div id='par-palitext-b{$book}-{$currParNo}' class='palitext_text'><div class=\"text_level_{$currParLevel}\">".$FetchText[$i]["text"]."</div></div>";
+			echo "<script>";
+			echo "document.getElementById('par-pali-b{$book}-{$currParNo}').appendChild(document.getElementById('par-palitext-b{$book}-{$currParNo}'));";
+			echo "</script>";					
+		}
+
+	}	
+	//巴利原文加载结束
+	if(isset($album)){
+
+		/*
+		//自动逐词译
+		$db_file = "../appdata/palicanon/templet/p".$book."_tpl.db3";
+		PDO_Connect("sqlite:$db_file");
+		for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
+			$query="SELECT * FROM \"main\" WHERE (\"paragraph\" = ".$PDO->quote($iPar)." ) ";
+			$Fetch = PDO_FetchAll($query);
+			$iFetch=count($Fetch);
+			if($iFetch>0){
+				echo "<div id='par-wbw-b$book-$iPar' class='wbw_par'>";
+				for($i=0;$i<$iFetch;$i++){
+					$type=$Fetch[$i]["type"];
+					if($type!=".ctl."){
+					echo "<div class='word'>";
+					echo "<div class='pali'>".$Fetch[$i]["word"]."</div>";
+					echo "<div class='mean'>".$Fetch[$i]["mean"]."</div>";
+					echo "</div>";
+					}
+				}
+				echo "</div>";
+				echo "<script>";
+				echo "document.getElementById('par-wbwdiv-b$book-$iPar').appendChild(document.getElementById('par-wbw-b$book-$iPar'));";
+				echo "</script>";					
+
+				}		
+		}
+		////自动逐词译结束
+		*/
+		
+		
+		PDO_Connect("sqlite:"._FILE_DB_RESRES_INDEX_);
+		$query = "select * from 'album' where id='$album'";
+		$Fetch = PDO_FetchAll($query);
+		$iFetch=count($Fetch);
+		if($iFetch>0){
+			switch($Fetch[0]["type"]){
+				case 1://巴利原文
+				break;
+				case 2://逐词译
+					$db_file =_DIR_PALICANON_WBW_."/p{$book}_wbw.db3";
+					PDO_Connect("sqlite:$db_file");
+					for($iPar=$par_begin;$iPar<=$par_end;$iPar++){
+						$table="p{$book}_wbw_data";
+						$query="SELECT * FROM \"{$table}\" WHERE (\"paragraph\" = ".$PDO->quote($iPar)." ) and album_id={$album} ";
+						$Fetch = PDO_FetchAll($query);
+						$iFetch=count($Fetch);
+						if($iFetch>0){
+							echo "<div id='par-wbw-b$book-$iPar' class='wbw_par'>";
+							for($i=0;$i<$iFetch;$i++){
+								$wordtype=$Fetch[$i]["type"];
+								if($wordtype!=".ctl."){
+								echo "<div class='word'>";
+								echo "<div class='pali'>{$Fetch[$i]["word"]}</div>";
+								echo "<div class='mean'>{$Fetch[$i]["mean"]}</div>";
+								echo "<div class='case'>{$wordtype}#{$Fetch[$i]["gramma"]}</div>";
+								echo "</div>";
+								}
+							}
+							echo "</div>";
+							echo "<script>";
+							echo "document.getElementById('par-wbwdiv-b$book-$iPar').appendChild(document.getElementById('par-wbw-b$book-$iPar'));";
+							echo "</script>";					
+
+							}		
+					}
+				break;
+				case 3:
+					//译文
+					$tocHtml="";
+					//打开翻译数据文件
+					$db_file =_DIR_PALICANON_TRAN_."/p{$book}_translate.db3";
+					PDO_Connect("sqlite:{$db_file}");
+					$this_album_id=$album;
+					$table="p{$book}_translate_info";
+					if($par_begin==-1){
+						//全文
+						$query="SELECT * FROM '{$table}' WHERE album_id=$this_album_id ";
+					}
+					else{
+						//部分段落
+						$query="SELECT * FROM '{$table}' WHERE (\"paragraph\" BETWEEN ".$PDO->quote($par_begin)." AND ".$PDO->quote($par_end).") and album_id=$this_album_id ";
+					}
+
+					//查询翻译经文内容
+					$FetchText = PDO_FetchAll($query);
+					$iFetchText=count($FetchText);
+					if($iFetchText>0){
+						for($i=0;$i<$iFetchText;$i++){
+							$currParNo=$FetchText[$i]["paragraph"];
+							//查另一个表,获取段落文本。一句一条记录。有些是一段一条记录
+							$table_data="p{$book}_translate_data";
+							$query="SELECT * FROM '{$table_data}' WHERE info_id={$FetchText[$i]["id"]}";
+							$aParaText = PDO_FetchAll($query);
+							$par_text="";
+							foreach($aParaText as $sent){
+								$par_text.=$sent["text"];
+							}
+							//获取段落文本结束。
+							$par_text=str_replace("<pb></pb>","<br/><pb></pb>",$par_text);
+							echo "<div id='par-translate-a$album-b$book-$currParNo' class='translate_text'>";
+							echo "<a name='par_$currParNo'></a>";
+							echo "<div id='text-a$album-b$book-$currParNo' class='text_level_".$par_level["$currParNo"]."' onclick='paragraph_click($album,$book,$currParNo)'>".$par_text."</div>";
+							echo "<div id='comm-a$album-b$book-$currParNo' class='comments'>";
+							echo "<div id='new-comm-a$album-b$book-$currParNo'  class='new_comments'></div>";
+							echo "</div>";
+							echo "</div>";
+							echo "<script>";
+							echo "add_new_res($album,$book,$currParNo,'$par_text');";
+							echo "document.getElementById('par-translate-b$book-$currParNo').appendChild(document.getElementById('par-translate-a$album-b$book-$currParNo'));";
+							echo "</script>";
+							//目录字符串
+							$tocLevel=$par_level["$currParNo"]+1-1;
+							if($tocLevel>0 && $tocLevel<8){
+								$tocHtml.="<div class='toc_item level_$tocLevel'><a href='#par_$currParNo'>{$par_text}</a></div>";
+							}
+						}
+						//设置标题栏的经文名称
+						echo "<script>";
+						echo "document.getElementById('tool_bar_title').innerHTML='".$FetchText[0]["title"]."'";
+						echo "</script>";
+					}
+					break;
+				case 4:
+				break;
+				case 5:
+				break;
+				case 6:
+				break;
+				case 7:
+				break;
+			}
+		}
+		//添加注解
+		PDO_Connect("sqlite:"._FILE_DB_COMMENTS_);
+
+		if($par_begin==-1){
+			$query="SELECT * FROM \"comments\" WHERE album='$album'  order by id DESC";
+		}
+		else{
+			$query="SELECT * FROM \"comments\" WHERE  album='$album' AND (\"paragraph\" BETWEEN ".$PDO->quote($par_begin)." AND ".$PDO->quote($par_end).") order by id DESC ";
+		}
+		//查询注解内容
+		$FetchText = PDO_FetchAll($query);
+		$iFetchText=count($FetchText);
+		if($iFetchText>0){
+			for($i=0;$i<$iFetchText;$i++){
+				$currParNo=$FetchText[$i]["paragraph"];
+				$comm_id=$FetchText[$i]["id"];
+				
+				echo "<div id='comm-id-".$comm_id."' class='comments_text_div'><div class='comments_text'>".$FetchText[$i]["text"]."</div><div><button>赞</button>".$FetchText[$i]["reputable"]."</div></div>";
+				echo "<script>";
+				echo "document.getElementById('comm-a$album-b$book-$currParNo').appendChild(document.getElementById('comm-id-".$comm_id."'));";
+				echo "</script>";					
+			}
+
+		}
+
+		if($par_next!=-1){
+			echo "<a href='reader.php?book=$book&album=$album&paragraph=$par_next'>Next</a>";
+		}
+		
+	}
+?>
+
+	</div><!--main_text_view end-->
+	
+	<div id="new_comm_shell" style="display:none;">
+		<div id="new_comm_div">
+		<textarea id="new_comm_text"></textarea>
+		<button onclick="new_comm_submit()">提交</button><button onclick="new_comm_cancel()">取消</button>
+		</div>
+	</div>
+	
+	<div id="dighest_edit_div" class="full_screen_window">
+		<div class="win_caption">
+		<div><button onclick="dighest_edit_cancle()">取消</button></div>
+		<div><button onclick="dighest_edit_submit()">提交</button></div>
+		</div>
+		<div id="dighest_edit_body" class="win_body">
+			<div>
+				标题:<input id="dighest_edit_title" />
+			</div>
+			<div>
+				简介:<textarea id="dighest_edit_summary"></textarea>
+			</div>
+			<div>
+				标签:<input id="dighest_edit_taget" />
+			</div>
+			<div id="dighest_text_preview">
+			</div>
+		</div>
+	</div>
+	
+		<!-- nav begin--> 
+
+		<div id="leftmenuinner" class="viewswitch_off">
+			<div class="win_caption">
+				<div><button onclick="setNaviVisibility()">返回</button></div>
+				<div id="menubartoolbar_New">
+					<ul class="common-tab">
+						<li id="content_menu_li" class="common-tab_li_act" onclick="menuSelected_2(menu_toc,'content_menu_li')">目录</li>
+						<li id="palicanon_menu_li" class="common-tab_li" onclick="menuSelected_2(menu_pali_cannon,'palicanon_menu_li')">批注</li>
+						<li id="bookmark_menu_li" class="common-tab_li" onclick="menuSelected_2(menu_bookmark,'bookmark_menu_li')">书签</li>
+					</ul>
+				</div>			
+			</div>
+			
+			
+			<div class='toc' id='leftmenuinnerinner'>	
+			<!-- toc begin -->
+			<div class="menu" id="menu_toc">
+				<a name="_Content" ></a>
+				<select name="menu" onchange="show_toc_level(this)">
+					<option value="1">1</option>
+					<option value="2">2</option>
+					<option value="3">3</option>
+					<option value="4">4</option>
+					<option value="5">5</option>
+					<option value="6">6</option>
+					<option value="7">7</option>
+				</select>
+				<div class="tocitems" id="content"><?php echo $tocHtml; ?></div>
+			</div>
+			<!-- toc end -->
+			<!-- comments begin -->
+			<div class="menu" id="menu_comments">
+				<div id="navi_comments_inner"></div>
+			</div>
+			<!-- comments end -->			
+			<!-- book mark begin -->
+			<div class="menu" id="menu_bookmark" style="display:none;">
+				<div>
+					<input id="B_Bookmark_All" onclick="setBookmarkVisibility('all')" type="checkbox" style="width: 20px; height: 20px"  />
+					<input id="B_Bookmark_A" onclick="setBookmarkVisibility('bma','B_Bookmark_A')" type="checkbox" style="width: 20px; height: 20px"  /><span class="bookmarkcolora , bookmarkcolorblock" >a</span>
+					<input id="B_Bookmark_X" onclick="setBookmarkVisibility('bmx','B_Bookmark_X')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolorx , bookmarkcolorblock" >?</span>
+					<input id="B_Bookmark_1" onclick="setBookmarkVisibility('bm1','B_Bookmark_1')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolor1 , bookmarkcolorblock" >1</span>
+					<input id="B_Bookmark_2" onclick="setBookmarkVisibility('bm2','B_Bookmark_2')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolor2 , bookmarkcolorblock" >2</span>
+					<input id="B_Bookmark_3" onclick="setBookmarkVisibility('bm3','B_Bookmark_3')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolor3 , bookmarkcolorblock" >3</span>
+					<input id="B_Bookmark_4" onclick="setBookmarkVisibility('bm4','B_Bookmark_4')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolor4 , bookmarkcolorblock" >4</span>
+					<input id="B_Bookmark_5" onclick="setBookmarkVisibility('bm5','B_Bookmark_5')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolor5 , bookmarkcolorblock" >5</span>
+					<input id="B_Bookmark_0" onclick="setBookmarkVisibility('bm0','B_Bookmark_0')" type="checkbox" style="width: 20px; height: 20px" checked /><span class="bookmarkcolor0 , bookmarkcolorblock" >0</span>
+					</div>
+				<div id="navi_bookmark_inner"></div>
+			</div>
+			<!-- book mark end -->
+			
+						
+			</div>
+		
+		</div>
+		<!-- nav end -->	
+		<div id="BV" class="blackscreen" onclick="setNaviVisibility()"></div>
+		<div id="mean_menu" ></div>
+		<script>
+		//lookup();
+		$(".pali").mouseover(function(e){
+			var targ
+			if (!e) var e = window.event;
+			if (e.target) targ = e.target;
+			else if (e.srcElement) targ = e.srcElement;
+			if (targ.nodeType == 3) // defeat Safari bug
+			   targ = targ.parentNode;
+			var pali_word;
+			pali_word=targ.innerHTML;
+			objCurrMouseOverPaliMean=targ.nextSibling;
+			
+			$("#tool_bar_title").html(pali_word);
+			$("#mean_menu").html(getWordMeanMenu(pali_word));
+			targ.parentNode.appendChild(document.getElementById("mean_menu"));
+		  
+		});
+
+
+		</script>
+	
+</body>
+</html>

+ 0 - 0
app/pcdl/res.db3


+ 2 - 2
app/pcdl/search.php

@@ -18,7 +18,7 @@ else{
 	exit;
 }
 _load_book_index();
-	$db_file = _FILE_DB_RES_INDEX_;
+	$db_file = _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");
 switch($op){
 	case "pre":
@@ -97,7 +97,7 @@ switch($op){
 			echo "</div>";
 		}
 	}
-	$db_file = _FILE_DB_RES_INDEX_;
+	$db_file = _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");	
 	//查标签
 	$query = "select count(*) from 'index' where tag like '%$word%'";

+ 1 - 1
app/pcdl/tag_search.php

@@ -16,7 +16,7 @@ else{
 	$order="";
 }
 
-	$db_file = _FILE_DB_RES_INDEX_;
+	$db_file = _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");
 	$tag_string='{'.$tag.'}';
 	$query = "select * from 'index' where tag like '%$tag_string%' ";

+ 1 - 1
app/pcdl/tran_text.php

@@ -19,7 +19,7 @@ else{
 
 	$log="";
 	
-	$db_file = _FILE_DB_RES_INDEX_;
+	$db_file = _FILE_DB_RESRES_INDEX_;
 	PDO_Connect("sqlite:$db_file");
 	$query = "select * from 'album' where id='$album'";
 	$Fetch = PDO_FetchAll($query);

+ 2 - 2
app/pcdl/update_index.php

@@ -149,7 +149,7 @@ switch($res_type){
 			*/
 
 			
-			$db_file = _FILE_DB_RES_INDEX_;
+			$db_file = _FILE_DB_RESRES_INDEX_;
 			PDO_Connect("sqlite:$db_file");			
 			$query="select * from album where guid = '$guid'";
 			$search_album = PDO_FetchAll($query);
@@ -345,7 +345,7 @@ switch($res_type){
 	
 	break;
 	case "album":
-		$db_file = _FILE_DB_RES_INDEX_;
+		$db_file = _FILE_DB_RESRES_INDEX_;
 		PDO_Connect("sqlite:$db_file");			
 		$query="select * from album where 1";
 		$search_album = PDO_FetchAll($query);

+ 1 - 1
app/pcdl/update_translate.php

@@ -59,7 +59,7 @@ echo "<h2>$from</h2>";
 			
 			
 			
-			$db_file =_FILE_DB_RES_INDEX_;
+			$db_file =_FILE_DB_RESRES_INDEX_;
 			PDO_Connect("sqlite:$db_file");			
 			$query="select * from album where guid = '$guid'";
 			$search_album = PDO_FetchAll($query);

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 6 - 0
app/public/js/localforage.min.js


+ 10 - 5
app/search/bold_search.php

@@ -5,6 +5,7 @@ require_once '../public/casesuf.inc';
 require_once '../public/union.inc';
 require_once "../public/_pdo.php";
 require_once "../public/function.php";
+require_once "../public/load_lang.php";
 
 _load_book_index();
 
@@ -199,7 +200,9 @@ switch($op){
 						}
 					}
 					$path=$bookPath.$path."No. ".$paragraph;
-					echo  "<div class='mean'>$path</div>";
+					//echo  "<div class='mean'>$path</div>";
+					echo  "<div class='mean'><a href='../pcdl/reader.php?view=para&book={$book}&paragraph={$paragraph}' target='_blank'>$path</a></div>";
+
 					
 								if(substr($paliword,-1)=="n"){
 									$paliword=substr($paliword,0,-1);
@@ -253,7 +256,7 @@ switch($op){
 							}
 						}
 					}
-					echo  "<div class='search_para_tools'><button onclick=\"dict_edit_now('{$book}','{$paragraph}','{$sFirstParentTitle}')\">{$_local->gui->edit_now}</button></div>";		
+					echo  "<div class='search_para_tools'><button onclick=\"search_edit_now('{$book}','{$paragraph}','{$sFirstParentTitle}')\">{$_local->gui->edit_now}</button></div>";		
 					echo  "</div>";
 				}
 			}
@@ -356,9 +359,11 @@ switch($op){
 							break;
 						}
 					}
-					$path="<div>{$bookPath}>{$path} No. {$paragraph}</div>";
-					echo  "<div class='mean'>$path</div>";
-					
+					$path="<span>{$bookPath}>{$path} No. {$paragraph}</span>";
+					//echo  "<div class='mean'>$path</div>";
+					echo  "<div class='mean'><a href='../pcdl/reader.php?view=para&book={$book}&paragraph={$paragraph}' target='_blank'>$path</a></div>";
+
+			
 									if(substr($paliword,-1)=="n"){
 										$paliword=substr($paliword,0,-1);
 									}

+ 2 - 1
app/search/paliword_search.php

@@ -218,7 +218,8 @@ switch($op){
 						}
 					}
 					$path=$path_1.$path."para. ".$paragraph;
-					echo  "<div class='mean'><a href='../pcdl/reader.php?book={$book}&paragraph={$FetchPaliText[0]["parent"]}' target='_blank'>$path</a></div>";
+					//$FetchPaliText[0]["parent"]
+					echo  "<div class='mean'><a href='../pcdl/reader.php?view=para&book={$book}&paragraph={$paragraph}' target='_blank'>$path</a></div>";
 					
 					for($iPali=0;$iPali<$countPaliText;$iPali++){
 						if(substr($paliword,-1)=="n"){

+ 1 - 1
app/search/title_search.php

@@ -207,7 +207,7 @@ switch($op){
 				$book=$Fetch[$i]["book"];		
 				$paragraph=$Fetch[$i]["paragraph"];							
 				echo "<div style='margin: 10px 0;padding: 5px;border-bottom: 1px solid var(--border-line-color);'>";
-				echo  "<div style='font-size: 130%;font-weight: 700;'><a href='../pcdl/reader.php?book={$book}&paragraph={$paragraph}' target='_blank'>$title</a></div><br/>";		
+				echo  "<div style='font-size: 130%;font-weight: 700;'><a href='../pcdl/reader.php?view=chapter&book={$book}&paragraph={$paragraph}' target='_blank'>$title</a></div><br/>";		
 
 				$bookInfo = _get_book_info($book);
 				$bookname=$bookInfo->title;

+ 1 - 0
app/studio/editor.php

@@ -55,6 +55,7 @@ else{$currDevice="computer";}
 	<script language="javascript" src="sent/sent.js"></script>
 	<script language="javascript" src="../public/js/notify.js"></script>
 	<script language="javascript" src="../public/js/comm.js"></script>
+	<script language="javascript" src="../public/js/localforage.min.js"></script>
 	<script language="javascript" src="../public/script/my.js"></script>
 	
 	<script language="javascript" src="module/editor/language/default.js"></script>	

+ 70 - 49
app/studio/js/data.js

@@ -29,6 +29,7 @@ var lstResHeading = new Array();
 
 var doc_info = new Object();
 
+
 doc_info.msg_run = function (value) {
 	if (value) {
 		this.sendmsg = value;
@@ -37,6 +38,16 @@ doc_info.msg_run = function (value) {
 		return (this.sendmsg);
 	}
 }
+
+var isTransaction = false;
+function doc_beginTransaction() {
+	isTransaction = true;
+}
+function doc_commit() {
+
+	isTransaction = false;
+}
+
 function createXmlDoc() {
 	var strXml = "";
 	strXml += "<set>\n"
@@ -175,30 +186,36 @@ function doc_file_info_get() {
 			doc_id: g_docid
 		},
 		function (data, status) {
-			arrDocFileInfo = JSON.parse(data);
-			if (arrDocFileInfo.parent_id == null) {
-				doc_info.parent_id = "";
-			}
-			else {
-				doc_info.parent_id = arrDocFileInfo.parent_id;
-			}
-			doc_info.doc_id = arrDocFileInfo.id;
-			doc_info.share = arrDocFileInfo.share;
-			if (arrDocFileInfo.parent_id && arrDocFileInfo.parent_id != null && arrDocFileInfo.parent_id.length > 0) {
-				strMsgDocList = arrDocFileInfo.parent_id;
-				msg_start();//该文档是他人分享的文档,需要发送消息
-				doc_info.sendmsg = true;
-			}
-			else {
-				if (parseInt(arrDocFileInfo.share) == 1) {
-					strMsgDocList = arrDocFileInfo.id;
-					msg_start();
-					doc_info.sendmsg = true;//共享给其他人,需要发送消息
+			try {
+				let arrDocFileInfo = JSON.parse(data);
+				if (arrDocFileInfo.parent_id == null) {
+					doc_info.parent_id = "";
 				}
 				else {
-					doc_info.sendmsg = false;//无需发送消息
+					doc_info.parent_id = arrDocFileInfo.parent_id;
 				}
+				doc_info.doc_id = arrDocFileInfo.id;
+				doc_info.share = arrDocFileInfo.share;
+				if (arrDocFileInfo.parent_id && arrDocFileInfo.parent_id != null && arrDocFileInfo.parent_id.length > 0) {
+					strMsgDocList = arrDocFileInfo.parent_id;
+					msg_start();//该文档是他人分享的文档,需要发送消息
+					doc_info.sendmsg = true;
+				}
+				else {
+					if (parseInt(arrDocFileInfo.share) == 1) {
+						strMsgDocList = arrDocFileInfo.id;
+						msg_start();
+						doc_info.sendmsg = true;//共享给其他人,需要发送消息
+					}
+					else {
+						doc_info.sendmsg = false;//无需发送消息
+					}
+				}
+			}
+			catch (e) {
+				console(e);
 			}
+
 		});
 }
 
@@ -354,17 +371,13 @@ function doc_head(key, value = null) {
 function doc_msg_push(msgobj) {
 
 	gDocMsgList.push(msgobj);
-	if (gXmlBookDataMsg) {
-		var newNode = gXmlBookData.createElement("msg");
-		setNodeText(newNode, "id", msgobj.id);
-		setNodeText(newNode, "sender", msgobj.sender);
-		setNodeText(newNode, "type", msgobj.type);
-		setNodeText(newNode, "docid", msgobj.docid);
-		setNodeText(newNode, "time", msgobj.time);
-		setNodeText(newNode, "read", msgobj.read);
-		setNodeText(newNode, "data", msgobj.data);
-		gXmlBookDataMsg.appendChild(newNode);
-	}
+	localforage.setItem("msg_" + g_docid, gDocMsgList).then(function (value) {
+		// This will output `1`.
+		console.log(value.length);
+	}).catch(function (err) {
+		// This code runs if there were any errors
+		console.log(err);
+	});
 }
 
 function doc_block(strSelector = "") {
@@ -619,25 +632,33 @@ function projectDataParse(xmlBookData) {
 		gXmlBookDataMsg = null;
 	}
 	//解析消息队列
-	if (gXmlBookDataMsg) {
-		var msgElements = gXmlBookDataMsg.getElementsByTagName("msg");
-		for (var iMsg = 0; iMsg < msgElements.length; iMsg++) {
-			var objMsg = new Object();
-			objMsg.id = getNodeText(msgElements[iMsg], "id");
-			objMsg.sender = getNodeText(msgElements[iMsg], "sender");
-			objMsg.type = getNodeText(msgElements[iMsg], "type");
-			objMsg.docid = getNodeText(msgElements[iMsg], "docid");
-			objMsg.time = getNodeText(msgElements[iMsg], "time");
-			objMsg.read = getNodeText(msgElements[iMsg], "read");
-			strData = getNodeText(msgElements[iMsg], "data");
-			try {
-				objMsg.data = JSON.parse(strData);
-				gDocMsgList.push(objMsg);//添加到消息列表数组
-			}
-			catch (e) {
-			}
+	localforage.getItem("msg_" + g_docid).then(function (value) {
+		if (value == null) {
+			console.log("离线消息数据不存在");
+			localforage.setItem("msg_" + g_docid, gDocMsgList).then(function (value) {
+				doc_head("msg_db_max_id", "1");
+				msg_init(1);
+				console.log("离线消息创建成功" + value.length);
+			}).catch(function (err) {
+				// This code runs if there were any errors
+				console.log(err);
+			});
 		}
-	}
+		else {
+			localforage.getItem("msg_" + g_docid).then(function (value) {
+				gDocMsgList = value;
+				console.log(value.length);
+			}).catch(function (err) {
+				// This code runs if there were any errors
+				console.log(err);
+			});
+		}
+	}).catch(function (err) {
+		// This code runs if there were any errors
+		console.log(err);
+	});
+	//
+
 
 
 	com_XmlAllWordRefresh();

+ 10 - 3
app/studio/js/editor.js

@@ -4818,8 +4818,11 @@ function fieldListChanged(inWordId, inField, inChangeTo, sParent = null) {
 		else {
 			msg_doc_id = doc_info.doc_id;
 		}
-
-		msg_push(1, "{\"id\":\"" + inWordId + "\",\"" + inField + "\":\"" + inChangeTo + "\",\"status\":\"7\"}", msg_doc_id, d.getTime(), book, paragraph);
+		let msg_data = new Object();
+		msg_data.id = inWordId;
+		msg_data[inField] = inChangeTo;
+		msg_data.status = 7;
+		msg_push(1, JSON.stringify(msg_data), msg_doc_id, d.getTime(), book, paragraph);
 	}
 	modifyWordDetailByWordIndex(wordIndex);
 
@@ -4837,7 +4840,11 @@ function fieldListChanged(inWordId, inField, inChangeTo, sParent = null) {
 				//准备消息数据
 				if (doc_info.sendmsg) {
 					let wordid = getNodeText(xAllWord[i], "id");
-					msg_push(1, "{\"id\":\"" + wordid + "\",\"" + inField + "\":\"" + inChangeTo + "\",\"status\":\"5\"}", msg_doc_id, d.getTime(), book, paragraph);
+					let msg_data = new Object();
+					msg_data.id = wordid;
+					msg_data[inField] = inChangeTo;
+					msg_data.status = 5;
+					msg_push(1, JSON.stringify(msg_data), msg_doc_id, d.getTime(), book, paragraph);
 				}
 				modifyWordDetailByWordIndex(i);
 			}

+ 40 - 6
app/studio/js/message.js

@@ -84,12 +84,14 @@ function msg_send() {
 			}
 
 			if (msgXml == null) {
-				alert("error:can not load Project. xml obj is null.");
+				console.error("error:can not load Project. xml obj is null.");
 				return;
 			}
 			let arrMsg = msgXml.getElementsByTagName("msg");
 			var arrWordNewMsg = new Array();
 
+			//开始一个事务,关闭自动提交
+			doc_beginTransaction();
 			for (var x = 0; x < arrMsg.length; x++) {
 				switch (getNodeText(arrMsg[x], "type")) {
 					case "maxid":
@@ -98,8 +100,8 @@ function msg_send() {
 						console.log("iMsgLastUpdateId:" + iMsgLastUpdateId);
 						break;
 					default:
-
-						if (gXmlBookDataMsg) {
+						//if (gXmlBookDataMsg) 
+						{
 							var obj = new Object();
 							obj.id = getNodeText(arrMsg[x], "id");
 							obj.sender = getNodeText(arrMsg[x], "sender");
@@ -119,7 +121,7 @@ function msg_send() {
 							//尝试用此消息更新文档数据
 							if (msg_apply_data(obj)) {
 								//如果已经使用此消息,xml标记为已读
-								setNodeText(arrMsg[x], "read", "2");
+								//setNodeText(arrMsg[x], "read", "2");
 							}
 							doc_msg_push(obj);
 							msg_show_content(msg_curr_show_content_type, msg_curr_show_content_id);
@@ -140,11 +142,14 @@ function msg_send() {
 								case "2":
 									break;
 							}
-							gXmlBookDataMsg.appendChild(arrMsg[x].cloneNode(true));
+							//gXmlBookDataMsg.appendChild(arrMsg[x].cloneNode(true));
 						}
 						break;
 				}
 			}
+			//提交一个事务
+			doc_commit();
+			user_wbw_commit();
 
 			for (let i = 0; i < arrWordNewMsg.length; i++) {
 				updataWordHeadById(arrWordNewMsg[i]);
@@ -218,6 +223,7 @@ function msg_apply_data(obj) {
 					let newWord = new Object();
 					newWord.real = sReal;
 					newWord.vaild = false;
+					let wordChanged = false;
 					if ((wordStatus != 7 && wordStatus != 5) && obj.sender != getCookie("username")) {
 						msg_read(obj, 2);
 						if (obj.data.real != null && obj.data.real != "") {
@@ -234,50 +240,66 @@ function msg_apply_data(obj) {
 							newWord.mean = obj.data.mean;
 							newWord.vaild = true;
 							wordBodyChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.org != null) {
 							setNodeText(xWord, "org", obj.data.org);
 							newWord.parts = obj.data.org;
 							newWord.vaild = true;
 							wordBodyChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.om != null) {
 							setNodeText(xWord, "om", obj.data.om);
 							newWord.partmean = obj.data.om;
 							newWord.vaild = true;
 							wordBodyChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.case != null) {
 							setNodeText(xWord, "case", obj.data.case);
 							newWord.case = obj.data.case;
 							newWord.vaild = true;
 							wordBodyChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.parent != null) {
 							setNodeText(xWord, "parent", obj.data.parent);
+							wordChanged = true;
 						}
 						if (obj.data.note != null) {
 							setNodeText(xWord, "note", obj.data.note);
 							wordNoteChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.rela != null) {
 							//setNodeText(xWord,"rela",decodeURI(obj.data.rela));
 							setNodeText(xWord, "rela", obj.data.rela);
 							wordRelationChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.bmc != null) {
 							setNodeText(xWord, "bmc", obj.data.bmc);
 							wordBodyChange = true;
+							wordChanged = true;
 						}
 						if (obj.data.bmt != null) {
 							setNodeText(xWord, "bmt", obj.data.bmt);
+							wordChanged = true;
 						}
 						if (obj.data.lock != null) {
 							setNodeText(xWord, "lock", obj.data.lock);
 							wordBodyChange = true;
+							wordChanged = true;
+						}
+						if (wordChanged) {
+							setNodeText(xWord, "status", 6);
+							//提交用户逐词解析数据库
+							user_wbw_push_word(obj.data.id);
 						}
-						setNodeText(xWord, "status", 6);
+
 					}
+
 					if (wordHeadChange) {
 						updataWordHeadByIndex(wIndex);
 					}
@@ -343,6 +365,9 @@ function msg_apply_data(obj) {
 }
 
 function msg_word_msg_num(wid) {
+	if (gDocMsgList == null) {
+		return;
+	}
 	var iMsg = 0;
 	for (var i = 0; i < gDocMsgList.length; i++) {
 		if (gDocMsgList[i].type == 1) {
@@ -355,6 +380,9 @@ function msg_word_msg_num(wid) {
 }
 
 function msg_set_tool_bar_msg_counter() {
+	if (gDocMsgList == null) {
+		return;
+	}
 	var iMsg = 0;
 	for (var i = 0; i < gDocMsgList.length; i++) {
 		if (gDocMsgList[i].read == 0) {
@@ -399,6 +427,9 @@ function time_standardize(date) {
 
 //显示消息内容
 function msg_show_content(type, id) {
+	if (gDocMsgList == null) {
+		return;
+	}
 	if (type == "" || id == "") {
 		return;
 	}
@@ -541,6 +572,9 @@ function msg_show_content(type, id) {
 
 //刷新消息列表
 function msg_update_msg_list() {
+	if (gDocMsgList == null) {
+		return;
+	}
 	let strHtml = "";
 	let msgList = new Array();
 

+ 474 - 474
app/term/term.js

@@ -5,650 +5,650 @@ var arrAllMean = new Array();
 var arrTermAllPali = new Array();
 var arrWordIdTermId = new Array();
 
-var strTermTanslationTmp="[%mean%](%pali% %mean2% %mymean%)";
-var strTermTanslationTmp2="[%mean%]";
-var termCounter=new Array();
-var noteCounter=0; //正文内注释计数器
+var strTermTanslationTmp = "[%mean%](%pali% %mean2% %mymean%)";
+var strTermTanslationTmp2 = "[%mean%]";
+var termCounter = new Array();
+var noteCounter = 0; //正文内注释计数器
 
-function note(noteId,strDef="unkow"){
+function note(noteId, strDef = "unkow") {
 	document.write("haha");
 }
 
-function note_replace(strIn){
+function note_replace(strIn) {
 	/*
 	
 	*/
-	var output = strIn.replace("/*","<script>");
-	output = output.replace("*/","</script>");
-	return(output);
+	var output = strIn.replace("/*", "<script>");
+	output = output.replace("*/", "</script>");
+	return (output);
 }
 
 
-function term_init(){
-	
+function term_init() {
+
 }
-var str_term_fun_word_link="term_show_win";
-function term_word_link_fun(fun_name){
+var str_term_fun_word_link = "term_show_win";
+function term_word_link_fun(fun_name) {
 	str_term_fun_word_link = fun_name;
 }
 //将存储状态的字符串转换为预显示字符串
 //设置状态为 0:未处理的原始状态
-function term_std_str_to_tran(strIn){
-	return(strIn.replace(/\[\[/g,"<term status='0'>").replace(/\]\]/g,"</term>"));	
+function term_std_str_to_tran(strIn) {
+	return (strIn.replace(/\[\[/g, "<term status='0'>").replace(/\]\]/g, "</term>"));
 }
 
-function term_std_str_to_edit(strIn){
+function term_std_str_to_edit(strIn) {
 	var arrText = strIn.split("/");
-	for(var i in arrText){
+	for (var i in arrText) {
 		//头尾是*
-		if(arrText[i].substring(0,1)=="*" && arrText[i].substring(arrText[i].length-1)=="*"){
-			var arrOneTermWord=arrText[i].split("@");
-			if(arrOneTermWord.length==2){
-				arrText[i]="*"+arrOneTermWord[1];
+		if (arrText[i].substring(0, 1) == "*" && arrText[i].substring(arrText[i].length - 1) == "*") {
+			var arrOneTermWord = arrText[i].split("@");
+			if (arrOneTermWord.length == 2) {
+				arrText[i] = "*" + arrOneTermWord[1];
 			}
 		}
 	}
 
-	return(arrText.join("/"));
+	return (arrText.join("/"));
 }
 
-function term_tran_edit_replace(strIn){
-	var strEdit=strIn;
-	for(var x=0;x<arrTerm2.length;x++){
-		var strReplace="strEdit=strEdit.replace(/"+arrTerm2[x].meaning+"/g,\"/*"+arrTerm2[x].meaning+"*/\")";
+function term_tran_edit_replace(strIn) {
+	var strEdit = strIn;
+	for (var x = 0; x < arrTerm2.length; x++) {
+		var strReplace = "strEdit=strEdit.replace(/" + arrTerm2[x].meaning + "/g,\"/*" + arrTerm2[x].meaning + "*/\")";
 		eval(strReplace);
 	}
 	//strEdit=strEdit.replace(/\/*\/*/g,"\/*");
 	//strEdit=strEdit.replace(/\*\/\*\//g,"*\/");
-	return(strEdit);
+	return (strEdit);
 }
 
-function term_edit_to_std_str(strIn){
+function term_edit_to_std_str(strIn) {
 	var arrText = strIn.split("/");
-	for(var i in arrText){
+	for (var i in arrText) {
 		//头尾是*
-		if(arrText[i].substring(0,1)=="*" && arrText[i].substring(arrText[i].length-1)=="*"){
-			var wordMeaning=arrText[i].substring(1,arrText[i].length-1);
-			arrText[i]="*"+term_get_std_str(wordMeaning)+"*";
+		if (arrText[i].substring(0, 1) == "*" && arrText[i].substring(arrText[i].length - 1) == "*") {
+			var wordMeaning = arrText[i].substring(1, arrText[i].length - 1);
+			arrText[i] = "*" + term_get_std_str(wordMeaning) + "*";
 		}
 	}
-	return(arrText.join("/"));
+	return (arrText.join("/"));
 }
-function term_get_std_str(strMean){
-	for(var x=0;x<arrTerm2.length;x++){
-		if(arrTerm2[x].meaning==strMean){
-			return(arrTerm2[x].guid+"@"+strMean);
+function term_get_std_str(strMean) {
+	for (var x = 0; x < arrTerm2.length; x++) {
+		if (arrTerm2[x].meaning == strMean) {
+			return (arrTerm2[x].guid + "@" + strMean);
 		}
 	}
-	return("unkow@"+strMean);
+	return ("unkow@" + strMean);
 }
-function term_get_my_std_str(strMean){
-	for(var x in arrMyTerm){
-		if(arrMyTerm[x].meaning==strMean){
-			return(arrMyTerm[x].guid+"@"+strMean);
+function term_get_my_std_str(strMean) {
+	for (var x in arrMyTerm) {
+		if (arrMyTerm[x].meaning == strMean) {
+			return (arrMyTerm[x].guid + "@" + strMean);
 		}
 	}
-	return("unkow@"+strMean);
+	return ("unkow@" + strMean);
 }
 
-function note_lookup(word,showto){
-	$("#"+showto).load("../term/term.php?op=search&word="+word+"&username="+getCookie("username"),function(responseTxt,statusTxt,xhr){
-    if(statusTxt=="success"){
-		$(".term_note").each(function(index,element){
-			$(this).html(note_init($(this).html()));
-			$(this).attr("status",1);
-			note_refresh_new();
-		});			
-	}
-	else if(statusTxt=="error"){
-      console.error("Error: "+xhr.status+": "+xhr.statusText);
-	}
-  });
-}
-
-function note_lookup_guid_json(guid,showto){
-  
-  	$.get("../term/term.php",
-	{
-		op:"load_id",
-		id:guid,
-		format:"json"
-	},
-	function(data,status){
-		let html="";
-		if(status=="success"){
-			try{
-				let result= JSON.parse(data)[0];
-				html = "<div class='term_block'>";
-				
-				html += "<h2>"+result.word+"</h2>";
-				html += "<div class='meaning'>"+result.meaning+"</div>";
-				html += "<div class='term_note' status='1'>"+note_init(result.note)+"</div>";
-				html += "</div>";
-				$("#"+showto).html(html);
+function note_lookup(word, showto) {
+	$("#" + showto).load("../term/term.php?op=search&word=" + word + "&username=" + getCookie("username"), function (responseTxt, statusTxt, xhr) {
+		if (statusTxt == "success") {
+			$(".term_note").each(function (index, element) {
+				$(this).html(note_init($(this).html()));
+				$(this).attr("status", 1);
 				note_refresh_new();
-			}
-			catch(e){
-				console.error("note_lookup_guid_json:"+e+" data:"+data);
-			}
-		
+			});
+		}
+		else if (statusTxt == "error") {
+			console.error("Error: " + xhr.status + ": " + xhr.statusText);
 		}
 	});
 }
 
-var term_get_word_to_div_callback=null;
-function term_get_word_to_div(strWord,div,callback){
-	term_get_word_to_div_callback=callback;
-  	$.get("../term/term.php",
-	{
-		op:"get",
-		word:strWord,
-		format:"json"
-	},
-	function(data,status){
-		let html="";
-		if(status=="success"){
-			try{
-				let result= JSON.parse(data);
-				let html="";
-				if(result.length>0){
-					
-					let type=new Array();
-					let authors=new Array();
-					for(x in result){
-						if(result[x].tag==""){
-							result[x].tag="_null_";
-						}
-						if(type[result[x].tag]==null){
-							type[result[x].tag]=new Array();
-						}
-						type[result[x].tag].push(result[x].meaning);
-						authors[result[x].owner]=1;
-					}
-					
-					html += "<div class='term_word_head'>";
-					html += "<div class='term_word_head_pali'>";
-					html += result[0].word;
+function note_lookup_guid_json(guid, showto) {
+
+	$.get("../term/term.php",
+		{
+			op: "load_id",
+			id: guid,
+			format: "json"
+		},
+		function (data, status) {
+			let html = "";
+			if (status == "success") {
+				try {
+					let result = JSON.parse(data)[0];
+					html = "<div class='term_block'>";
+
+					html += "<h2>" + result.word + "</h2>";
+					html += "<div class='meaning'>" + result.meaning + "</div>";
+					html += "<div class='term_note' status='1'>" + note_init(result.note) + "</div>";
 					html += "</div>";
-					for(y in type){
-						html += "<div class='term_word_head_mean'>";
-						if(y!="_null_"){
-							html += y+":";
-						}
-						for(k in type[y]){
-							html += type[y][k];
+					$("#" + showto).html(html);
+					note_refresh_new();
+				}
+				catch (e) {
+					console.error("note_lookup_guid_json:" + e + " data:" + data);
+				}
+
+			}
+		});
+}
+
+var term_get_word_to_div_callback = null;
+function term_get_word_to_div(strWord, div, callback) {
+	term_get_word_to_div_callback = callback;
+	$.get("../term/term.php",
+		{
+			op: "get",
+			word: strWord,
+			format: "json"
+		},
+		function (data, status) {
+			let html = "";
+			if (status == "success") {
+				try {
+					let result = JSON.parse(data);
+					let html = "";
+					if (result.length > 0) {
+
+						let type = new Array();
+						let authors = new Array();
+						for (x in result) {
+							if (result[x].tag == "") {
+								result[x].tag = "_null_";
+							}
+							if (type[result[x].tag] == null) {
+								type[result[x].tag] = new Array();
+							}
+							type[result[x].tag].push(result[x].meaning);
+							authors[result[x].owner] = 1;
 						}
+
+						html += "<div class='term_word_head'>";
+						html += "<div class='term_word_head_pali'>";
+						html += result[0].word;
 						html += "</div>";
-					}
-					html += "<div class='term_word_head_authors'>贡献者:";
-					for(y in authors){
-						html += "<a onclick=\"\">"+y+"</a> "
-					}
-					
-					html += "</div>";
-					html += "</div>";
-					
-					for(x in result){
-						html += "<div class='term_block'>";
-						html += "<div class='term_block_bar'>";
-						html += "<div class='term_block_bar_left'>";
-						
-						html += "<div class='term_block_bar_left_icon'>";
-						html += result[x].owner.slice(0,1);
-						html += "</div>";
-						
-						html += "<div class='term_block_bar_left_info'>";
-						html += "<div class='term_meaning'>"+result[x].meaning;
-						if(result[x].tag!="_null_"){
-							html += "<span class='term_tag'>"+result[x].tag+"</span>";
+						for (y in type) {
+							html += "<div class='term_word_head_mean'>";
+							if (y != "_null_") {
+								html += y + ":";
+							}
+							for (k in type[y]) {
+								html += type[y][k];
+							}
+							html += "</div>";
 						}
+						html += "<div class='term_word_head_authors'>贡献者:";
+						for (y in authors) {
+							html += "<a onclick=\"\">" + y + "</a> "
+						}
+
 						html += "</div>";
-						html += "<div class='term_author'>"+result[x].owner+"</div>";
-						html += "</div>";
-						
-						html += "</div>";
-						html += "<div class='term_block_bar_right'>";
-						html += "<span><a href='#'>[编辑]</a><a href='#'>[赞]</a><a href='#'>[收藏]</a></span>";
-						html += "</div>";
-						html += "</div>";
-						//html += "<div class='term_meaning2'>"+result[x].other_meaning+"</div>";
-						html += "<div class='term_note' status='1'>"+note_init(result[x].note)+"</div>";
 						html += "</div>";
+
+						for (x in result) {
+							html += "<div class='term_block'>";
+							html += "<div class='term_block_bar'>";
+							html += "<div class='term_block_bar_left'>";
+
+							html += "<div class='term_block_bar_left_icon'>";
+							html += result[x].owner.slice(0, 1);
+							html += "</div>";
+
+							html += "<div class='term_block_bar_left_info'>";
+							html += "<div class='term_meaning'>" + result[x].meaning;
+							if (result[x].tag != "_null_") {
+								html += "<span class='term_tag'>" + result[x].tag + "</span>";
+							}
+							html += "</div>";
+							html += "<div class='term_author'>" + result[x].owner + "</div>";
+							html += "</div>";
+
+							html += "</div>";
+							html += "<div class='term_block_bar_right'>";
+							html += "<span><a href='#'>[编辑]</a><a href='#'>[赞]</a><a href='#'>[收藏]</a></span>";
+							html += "</div>";
+							html += "</div>";
+							//html += "<div class='term_meaning2'>"+result[x].other_meaning+"</div>";
+							html += "<div class='term_note' status='1'>" + note_init(result[x].note) + "</div>";
+							html += "</div>";
+						}
+					}
+					else {
+						html += "<div >词条尚未创建</div>";
+						html += "<div ><input type=\"input\" value=\"\" placeholder=\"pali\"/></div>";
+						html += "<div ><input type=\"input\" value=\"\" placeholder=\"meaning\"/></div>";
+						html += "<div ><input type=\"input\" value=\"\" placeholder=\"other meaning\"/></div>";
+						html += "<div ><input type=\"input\" value=\"\" placeholder=\"category\"/></div>";
+						html += "<div ><input type=\"input\" value=\"\" placeholder=\"language\"/></div>";
+						html += "<div ><textarea></textarea></div>";
+					}
+					$("#" + div).html(html);
+
+					note_refresh_new();
+
+					if (term_get_word_to_div_callback != null) {
+						term_get_word_to_div_callback(result);
 					}
 				}
-				else{
-					html += "<div >词条尚未创建</div>";
-					html += "<div ><input type=\"input\" value=\"\" placeholder=\"pali\"/></div>";
-					html += "<div ><input type=\"input\" value=\"\" placeholder=\"meaning\"/></div>";
-					html += "<div ><input type=\"input\" value=\"\" placeholder=\"other meaning\"/></div>";
-					html += "<div ><input type=\"input\" value=\"\" placeholder=\"category\"/></div>";
-					html += "<div ><input type=\"input\" value=\"\" placeholder=\"language\"/></div>";
-					html += "<div ><textarea></textarea></div>";
-				}
-				$("#"+div).html(html);
-				
-				note_refresh_new();
-				
-				if(term_get_word_to_div_callback!=null){
-					term_get_word_to_div_callback(result);
+				catch (e) {
+					console.error("term_get_word_to_div:" + e + " data:" + data);
 				}
-			}
-			catch(e){
-				console.error("term_get_word_to_div:"+e+" data:"+data);
-			}
 
-		}
-	});	
+			}
+		});
 }
-function term_get_guid_to_html(strGuid){
-	
+function term_get_guid_to_html(strGuid) {
+
 }
-function term_apply(guid){
-	if(g_eCurrWord){
-		setNodeText(g_eCurrWord,"note","=term("+guid+")");
+function term_apply(guid) {
+	if (g_eCurrWord) {
+		setNodeText(g_eCurrWord, "note", "=term(" + guid + ")");
 		term_array_updata();
 	}
 }
 
-function term_data_copy_to_me(guid){
-	$("#term_dict").load("term.php?op=copy&wordid="+guid);
+function term_data_copy_to_me(guid) {
+	$("#term_dict").load("term.php?op=copy&wordid=" + guid);
 }
 
 //我的术语字典进入编辑模式
-function term_edit(guid){
-	$("#term_edit_btn1_"+guid).hide();
-	$("#term_edit_btn2_"+guid).show();
-	document.getElementById("term_dict_my_"+guid).style.display="none";
-	document.getElementById("term_dict_my_edit_"+guid).style.display="block";
+function term_edit(guid) {
+	$("#term_edit_btn1_" + guid).hide();
+	$("#term_edit_btn2_" + guid).show();
+	document.getElementById("term_dict_my_" + guid).style.display = "none";
+	document.getElementById("term_dict_my_edit_" + guid).style.display = "block";
 }
 
 //我的术语字典退出编辑模式
-function term_data_esc_edit(guid){
-	$("#term_edit_btn1_"+guid).show();
-	$("#term_edit_btn2_"+guid).hide();
-	document.getElementById("term_dict_my_"+guid).style.display="block";
-	document.getElementById("term_dict_my_edit_"+guid).style.display="none";
-	
+function term_data_esc_edit(guid) {
+	$("#term_edit_btn1_" + guid).show();
+	$("#term_edit_btn2_" + guid).hide();
+	document.getElementById("term_dict_my_" + guid).style.display = "block";
+	document.getElementById("term_dict_my_edit_" + guid).style.display = "none";
+
 }
 //我的术语字典 编辑模式 保存
 
-function term_data_save(guid){
-	if(guid==""){
-		var strWord=$("#term_new_word").val();
-		var strMean=$("#term_new_mean").val();
-		var strMean2=$("#term_new_mean2").val();
-		var strNote=$("#term_new_note").val();
-		var strTag=$("#term_new_tag").val();
+function term_data_save(guid) {
+	if (guid == "") {
+		var strWord = $("#term_new_word").val();
+		var strMean = $("#term_new_mean").val();
+		var strMean2 = $("#term_new_mean2").val();
+		var strNote = $("#term_new_note").val();
+		var strTag = $("#term_new_tag").val();
 		let newTerm = new Object();
-		newTerm.guid=com_guid();
-		newTerm.word=strWord;
+		newTerm.guid = com_guid();
+		newTerm.word = strWord;
 		newTerm.meaning = strMean;
 		newTerm.other_meaning = strMean2;
 		arrMyTerm.push(newTerm);
 	}
-	else{
-		var strWord=$("#term_edit_word_"+guid).val();
-		var strMean=$("#term_edit_mean_"+guid).val();
-		var strMean2=$("#term_edit_mean2_"+guid).val();
-		var strTag=$("#term_edit_tag_"+guid).val();
-		var strNote=$("#term_edit_note_"+guid).val();
+	else {
+		var strWord = $("#term_edit_word_" + guid).val();
+		var strMean = $("#term_edit_mean_" + guid).val();
+		var strMean2 = $("#term_edit_mean2_" + guid).val();
+		var strTag = $("#term_edit_tag_" + guid).val();
+		var strNote = $("#term_edit_note_" + guid).val();
 	}
 	$.get("../term/term.php",
-	{
-		op:"save",
-		guid:guid,
-		word:strWord,
-		mean:strMean,
-		mean2:strMean2,
-		tag:strTag,
-		note:strNote,
-		username:getCookie("username")
-	},
-	function(data,status){
-		try{
-			let result= JSON.parse(data);
-			if(result.status==0){
-				note_lookup(result.message,"term_dict");
+		{
+			op: "save",
+			guid: guid,
+			word: strWord,
+			mean: strMean,
+			mean2: strMean2,
+			tag: strTag,
+			note: strNote,
+			username: getCookie("username")
+		},
+		function (data, status) {
+			try {
+				let result = JSON.parse(data);
+				if (result.status == 0) {
+					note_lookup(result.message, "term_dict");
+				}
+				else {
+					ntf_show("term error" + result.message);
+				}
 			}
-			else{
-				ntf_show("term error"+result.message);
+			catch (e) {
+				console.error("term_get_all_pali:" + e + " data:" + data);
+				ntf_show("term error");
 			}
-		}
-		catch(e){
-			console.error("term_get_all_pali:"+e+" data:"+data);
-			ntf_show("term error");
-		}
-		
-		
-	});
+
+
+		});
 }
-function term_get_all_pali(){
- 	$.get("term.php",
-	{
-		op:"allpali"
-	},
-	function(data,status){
-		if(data.length>0){
-			try{
-			arrTermAllPali = JSON.parse(data);
-			}
-			catch(e){
-				console.error("term_get_all_pali:"+e+" data:"+data);
+function term_get_all_pali() {
+	$.get("term.php",
+		{
+			op: "allpali"
+		},
+		function (data, status) {
+			if (data.length > 0) {
+				try {
+					arrTermAllPali = JSON.parse(data);
+				}
+				catch (e) {
+					console.error("term_get_all_pali:" + e + " data:" + data);
+				}
 			}
-		}
-	});
+		});
 }
-function term_lookup_all(pali){
-	for(var x in arrTermAllPali){
-		if(arrTermAllPali[x].word==pali){
-			return(arrTermAllPali[x]);
+function term_lookup_all(pali) {
+	for (var x in arrTermAllPali) {
+		if (arrTermAllPali[x].word == pali) {
+			return (arrTermAllPali[x]);
 		}
 	}
-	return(null);
+	return (null);
 }
 
-function term_get_my(){
- 	$.get("term.php",
-	{
-		op:"my"
-	},
-	function(data,status){
-		if(data.length>0){
-			try{
-				arrMyTerm = JSON.parse(data);
-			}
-			catch(e){
-				console.error(e.error+" data:"+data);
+function term_get_my() {
+	$.get("term.php",
+		{
+			op: "my"
+		},
+		function (data, status) {
+			if (data.length > 0) {
+				try {
+					arrMyTerm = JSON.parse(data);
+				}
+				catch (e) {
+					console.error(e.error + " data:" + data);
+				}
 			}
-		}
-	});
-	
+		});
+
 }
 
 //在我的术语字典里查询
-function term_lookup_my(pali){
-	for(var x in arrMyTerm){
-		if(arrMyTerm[x].meaning==pali){
-			return(arrMyTerm[x]);
-		}		
-		if(arrMyTerm[x].word==pali){
-			return(arrMyTerm[x]);
+function term_lookup_my(pali) {
+	for (var x in arrMyTerm) {
+		if (arrMyTerm[x].meaning == pali) {
+			return (arrMyTerm[x]);
+		}
+		if (arrMyTerm[x].word == pali) {
+			return (arrMyTerm[x]);
 		}
 	}
-	return(null);
+	return (null);
 }
-function term_lookup_my_id(id){
-	for(var x in arrMyTerm){
-		if(arrMyTerm[x].guid==id){
-			return(arrMyTerm[x]);
-		}		
+function term_lookup_my_id(id) {
+	for (var x in arrMyTerm) {
+		if (arrMyTerm[x].guid == id) {
+			return (arrMyTerm[x]);
+		}
 	}
-	return(null);
+	return (null);
 }
 
-function term_get_all_meaning(word){
- 	$.get("term.php",
-	{
-		op:"allmean",
-		word:word
-	},
-	function(data,status){
-		$("#term_win_other_mean").html(data);
-	});
+function term_get_all_meaning(word) {
+	$.get("term.php",
+		{
+			op: "allmean",
+			word: word
+		},
+		function (data, status) {
+			$("#term_win_other_mean").html(data);
+		});
 }
 
 //刷新文档正在使用的术语数据
-function term_array_updata(){
-	arrTerm2=new Array();
-	var arrTermDownLoadList=new Array();
-	var arrWordIdTermId=new Array();
+function term_array_updata() {
+	arrTerm2 = new Array();
+	var arrTermDownLoadList = new Array();
+	var arrWordIdTermId = new Array();
 	var xAllWord = gXmlBookDataBody.getElementsByTagName("word");
-	for(var x=0;x<xAllWord.length;x++){
-		var sNote = getNodeText(xAllWord[x],"note");
-		var wid=getNodeText(xAllWord[x],"id");
-		if(sNote.substring(0,6)=="=term("){
-			var termId=sNote.slice(6,-1);
-			if(!arrTerm[termId]){
+	for (var x = 0; x < xAllWord.length; x++) {
+		var sNote = getNodeText(xAllWord[x], "note");
+		var wid = getNodeText(xAllWord[x], "id");
+		if (sNote.substring(0, 6) == "=term(") {
+			var termId = sNote.slice(6, -1);
+			if (!arrTerm[termId]) {
 				arrTermDownLoadList.push(termId);
 			}
 			//person={wid:wid,tid:termId};
-			arrWordIdTermId.push({wid:wid,tid:termId});
+			arrWordIdTermId.push({ wid: wid, tid: termId });
 		}
 	}
-	if(arrTermDownLoadList.length>0){
-		var idlist=arrTermDownLoadList.join();
-		idlist = idlist.replace(/,/g,"','");
-		idlist = "'"+ idlist + "'";
- 		$.get("term.php",
-		{
-		op:"extract",
-		list:idlist
-		},
-		function(data,status){
-			var obj = JSON.parse(data);
-			for(var x in obj){
-				arrTerm[obj[x].guid]=obj[x];
-				arrTerm2.push(obj[x]);
-			}
-			if(g_eCurrWord){
-				updataWordHeadById(getNodeText(g_eCurrWord,"id"));
-				refreshWordNote(g_eCurrWord.parentNode.parentNode);
-			}
-			for(var i=0;i<arrWordIdTermId.length;i++){
-				var wid=arrWordIdTermId[i].wid;
-				var sMean=arrTerm[arrWordIdTermId[i].tid].meaning;
-				doc_setWordDataById(wid,"mean",sMean);
-				updateWordBodyById(wid);
-			}
-				
-		});
-		
+	if (arrTermDownLoadList.length > 0) {
+		var idlist = arrTermDownLoadList.join();
+		idlist = idlist.replace(/,/g, "','");
+		idlist = "'" + idlist + "'";
+		$.get("term.php",
+			{
+				op: "extract",
+				list: idlist
+			},
+			function (data, status) {
+				var obj = JSON.parse(data);
+				for (var x in obj) {
+					arrTerm[obj[x].guid] = obj[x];
+					arrTerm2.push(obj[x]);
+				}
+				if (g_eCurrWord) {
+					updataWordHeadById(getNodeText(g_eCurrWord, "id"));
+					refreshWordNote(g_eCurrWord.parentNode.parentNode);
+				}
+				for (var i = 0; i < arrWordIdTermId.length; i++) {
+					var wid = arrWordIdTermId[i].wid;
+					var sMean = arrTerm[arrWordIdTermId[i].tid].meaning;
+					doc_setWordDataById(wid, "mean", sMean);
+					updateWordBodyById(wid);
+				}
+
+			});
+
 	}
 }
 
-function term_updata_translation(){
-	termCounter=new Array();
-	noteCounter=1;
-	$("term").each(function(){
-		let status=$(this).attr("status");
+function term_updata_translation() {
+	termCounter = new Array();
+	noteCounter = 1;
+	$("term").each(function () {
+		let status = $(this).attr("status");
 		let termText = $(this).text();
-		
-		if(termText.slice(0,1)=="#"){
-			if(status==0){
-				$(this).attr("status","1");
-				$(this).attr("type","1");
-				$(this).attr("text",termText.slice(1));
+
+		if (termText.slice(0, 1) == "#") {
+			if (status == 0) {
+				$(this).attr("status", "1");
+				$(this).attr("type", "1");
+				$(this).attr("text", termText.slice(1));
 			}
-			let noteText=$(this).attr("text");
-			$(this).html("<a onclick=\"alert('"+noteText+"')\">["+noteCounter+"]</a>");
+			let noteText = $(this).attr("text");
+			$(this).html("<a onclick=\"alert('" + noteText + "')\">[" + noteCounter + "]</a>");
 			noteCounter++;
 		}
-		else{
-			if(status==0 || status==2){
-				let myterm=term_lookup_my(termText);//我的术语字典
-				if(myterm){
-					$(this).attr("status","1");
-					$(this).attr("type","0");
-					$(this).attr("guid",myterm.guid);
-					$(this).attr("pali",myterm.word);
-					$(this).attr("mean",myterm.meaning);
-					$(this).attr("mean2",myterm.other_meaning);
-					$(this).attr("replace",myterm.meaning);
+		else {
+			if (status == 0 || status == 2) {
+				let myterm = term_lookup_my(termText);//我的术语字典
+				if (myterm) {
+					$(this).attr("status", "1");
+					$(this).attr("type", "0");
+					$(this).attr("guid", myterm.guid);
+					$(this).attr("pali", myterm.word);
+					$(this).attr("mean", myterm.meaning);
+					$(this).attr("mean2", myterm.other_meaning);
+					$(this).attr("replace", myterm.meaning);
 				}
-				else{
-					$(this).attr("status","2");
-					$(this).attr("pali",termText);
+				else {
+					$(this).attr("status", "2");
+					$(this).attr("pali", termText);
 				}
 			}
-			let guid=$(this).attr("guid");
-			let pali=$(this).attr("pali");
-			let mean=$(this).attr("mean");
-			let mean2=$(this).attr("mean2");
-			var renderTo=$(this).attr("pos");
-			var noteText="";
-			
-			if(termCounter[guid]){
-				termCounter[guid]=2;
+			let guid = $(this).attr("guid");
+			let pali = $(this).attr("pali");
+			let mean = $(this).attr("mean");
+			let mean2 = $(this).attr("mean2");
+			var renderTo = $(this).attr("pos");
+			var noteText = "";
+
+			if (termCounter[guid]) {
+				termCounter[guid] = 2;
+			}
+			else {
+				termCounter[guid] = 1;
 			}
-			else{
-				termCounter[guid]=1;
+			var myterm = term_lookup_my(pali);//我的术语字典
+			let linkclass = "";
+			if (myterm) {
+				linkclass = "term_link";
 			}
-			var myterm=term_lookup_my(pali);//我的术语字典
-			let linkclass="";
-			if(myterm){
-				linkclass="term_link";
+			else {
+				linkclass = "term_link_new";
 			}
-			else{
-				linkclass="term_link_new";
-			}			
-			if(guid){
-				
-				if(renderTo=="wbw"){
-					noteText="%note%";
+			if (guid) {
+
+				if (renderTo == "wbw") {
+					noteText = "%note%";
 				}
-				else{
-					if(termCounter[guid]==1){
-						noteText=strTermTanslationTmp;
+				else {
+					if (termCounter[guid] == 1) {
+						noteText = strTermTanslationTmp;
 					}
-					else{
-						noteText=strTermTanslationTmp2;
+					else {
+						noteText = strTermTanslationTmp2;
 					}
 				}
 
-				noteText=noteText.replace("[","<span class='"+linkclass+"' onclick=\""+str_term_fun_word_link+"('"+guid+"','"+pali+"')\">");
-				noteText=noteText.replace("]","</span>");
-				noteText=noteText.replace("%mean%","<span class='term_mean'>"+mean+"</span>");
-				noteText=noteText.replace("%pali%","<span class='term_pali'>"+pali+"</span>");
-				noteText=noteText.replace("%mean2%","<span class='term_mean2'>"+mean2+"</span>");
-				noteText=noteText.replace("%note%","<span class='term_note'>"+""+"</span>");
-				if(myterm){
-					if(myterm.meaning!=mean){
-						noteText=noteText.replace("%mymean%","<span class='term_mean_my'>"+myterm.meaning+"</span>");
+				noteText = noteText.replace("[", "<span class='" + linkclass + "' onclick=\"" + str_term_fun_word_link + "('" + guid + "','" + pali + "')\">");
+				noteText = noteText.replace("]", "</span>");
+				noteText = noteText.replace("%mean%", "<span class='term_mean'>" + mean + "</span>");
+				noteText = noteText.replace("%pali%", "<span class='term_pali'>" + pali + "</span>");
+				noteText = noteText.replace("%mean2%", "<span class='term_mean2'>" + mean2 + "</span>");
+				noteText = noteText.replace("%note%", "<span class='term_note'>" + "" + "</span>");
+				if (myterm) {
+					if (myterm.meaning != mean) {
+						noteText = noteText.replace("%mymean%", "<span class='term_mean_my'>" + myterm.meaning + "</span>");
 					}
-					else{
-						noteText=noteText.replace("%mymean%","");
+					else {
+						noteText = noteText.replace("%mymean%", "");
 					}
 				}
-				else{
-					noteText=noteText.replace("%mymean%","");
+				else {
+					noteText = noteText.replace("%mymean%", "");
 				}
 			}
-			else{
-				noteText="<span class='"+linkclass+"'  onclick=\""+str_term_fun_word_link+"('','"+termText+"')\">"+termText+"</span>";
+			else {
+				noteText = "<span class='" + linkclass + "'  onclick=\"" + str_term_fun_word_link + "('','" + termText + "')\">" + termText + "</span>";
 			}
 			$(this).html(noteText);
 		}
 	});
 }
 
-function term_show_win(guid,keyWord=""){
-	if(guid==""){
-		$(term_body).html("当前词条未创建。<br /><a onclick=\"term_add_new('"+keyWord+"')\">现在创建</a>");
+function term_show_win(guid, keyWord = "") {
+	if (guid == "") {
+		$(term_body).html("当前词条未创建。<br /><a onclick=\"term_add_new('" + keyWord + "')\">现在创建</a>");
 	}
-	else{
+	else {
 		let currWord = term_lookup_my_id(guid);
-		if(currWord){
-			let termString="";
-			let pali=currWord.word;
-			let pali_1= pali.substring(0,1).toUpperCase();
-			pali=pali_1+pali.substring(1);
-			let mean=currWord.meaning;
-			let myterm=term_lookup_my(currWord.word);//我的术语字典
-			termString+="<div class='term_win_mean'>"+pali+"</div>";
-			termString+="<div class='term_win_pali'>意思:"+currWord.meaning+"</div>";
-			termString+="<div class='term_win_mean2'>其他意思:"+currWord.other_meaning+"</div>";
-			termString+="<div class='term_win_mymean'>我的词库:";
-			if(myterm){
-				termString+="<b>"+myterm.meaning+"</b> ";
+		if (currWord) {
+			let termString = "";
+			let pali = currWord.word;
+			let pali_1 = pali.substring(0, 1).toUpperCase();
+			pali = pali_1 + pali.substring(1);
+			let mean = currWord.meaning;
+			let myterm = term_lookup_my(currWord.word);//我的术语字典
+			termString += "<div class='term_win_mean'>" + pali + "</div>";
+			termString += "<div class='term_win_pali'>意思:" + currWord.meaning + "</div>";
+			termString += "<div class='term_win_mean2'>其他意思:" + currWord.other_meaning + "</div>";
+			termString += "<div class='term_win_mymean'>我的词库:";
+			if (myterm) {
+				termString += "<b>" + myterm.meaning + "</b> ";
 			}
-			else{
-				termString+="<input type='input'  placeholder='我的释义'>";
+			else {
+				termString += "<input type='input'  placeholder='我的释义'>";
 			}
-			termString+="<span>其他:</span><span id='term_win_other_mean'></span>";
-			termString+="</div>";
-			
-			if(currWord.note){
-				termString+="<div class='term_win_note'>"+currWord.note+"</div>";
+			termString += "<span>其他:</span><span id='term_win_other_mean'></span>";
+			termString += "</div>";
+
+			if (currWord.note) {
+				termString += "<div class='term_win_note'>" + currWord.note + "</div>";
 			}
-			else{
-				termString+="<div class='term_win_note'>Loading</div>";
+			else {
+				termString += "<div class='term_win_note'>Loading</div>";
 			}
 			$(term_body).html(termString);
 			term_get_all_meaning(currWord.word);
-			
-			if(!currWord.note){
+
+			if (!currWord.note) {
 				$.get("term.php",
-				{
-					op:"load_id",
-					id:currWord.guid
-				},
-				function(data,status,xhr){
-					switch(status){
-						case "success":
-							try{
-								let loadWord = JSON.parse(data);
-								$("#term_win_note").html(loadWord[0].note);
-								//修改内存数据
-								for(let x in arrMyTerm){
-									if(arrMyTerm[x].guid==loadWord[0].guid){
-										arrMyTerm[x].note=loadWord[0].note;
-										return;
+					{
+						op: "load_id",
+						id: currWord.guid
+					},
+					function (data, status, xhr) {
+						switch (status) {
+							case "success":
+								try {
+									let loadWord = JSON.parse(data);
+									$("#term_win_note").html(loadWord[0].note);
+									//修改内存数据
+									for (let x in arrMyTerm) {
+										if (arrMyTerm[x].guid == loadWord[0].guid) {
+											arrMyTerm[x].note = loadWord[0].note;
+											return;
+										}
 									}
 								}
-							}
-							catch(e){
-								console.error(e+" data:"+data);
-							}						
-						break;
-						case "error":
-							console.error("Error: "+xhr.status+": "+xhr.statusText);
-						break;
-					}
-				});
+								catch (e) {
+									console.error(e + " data:" + data);
+								}
+								break;
+							case "error":
+								console.error("Error: " + xhr.status + ": " + xhr.statusText);
+								break;
+						}
+					});
 
 			}
 		}
-		else{
+		else {
 			$(term_body).html("undefined guid");
 		}
 	}
-	document.getElementById("term_win").style.display="flex";
-	
+	document.getElementById("term_win").style.display = "flex";
+
 }
 
-function term_tmp(type,tmp){
-	if(tmp=="new"){
-		switch(type){
+function term_tmp(type, tmp) {
+	if (tmp == "new") {
+		switch (type) {
 			case "a":
-				strTermTanslationTmp=$("#term_my_tmp").val();
+				strTermTanslationTmp = $("#term_my_tmp").val();
 				break;
 			case "a2":
-				strTermTanslationTmp2=$("#term_my_tmp").val();
-			break;
-		}		
-		
+				strTermTanslationTmp2 = $("#term_my_tmp").val();
+				break;
+		}
+
 	}
-	else{
-		switch(type){
+	else {
+		switch (type) {
 			case "a":
-				strTermTanslationTmp=tmp;
+				strTermTanslationTmp = tmp;
 				break;
 			case "a2":
-				strTermTanslationTmp2=tmp;
-			break;
+				strTermTanslationTmp2 = tmp;
+				break;
 		}
 	}
 	term_updata_translation();
 }
 
-function term_add_new(keyword){
-	document.getElementById("term_win").style.display="none";
-	
-	tab_click_b('sys_term','tab_rb_sys_term',right_panal_slide_toggle,'tab_rb_sys_term');
+function term_add_new(keyword) {
+	document.getElementById("term_win").style.display = "none";
+
+	tab_click_b('sys_term', 'tab_rb_sys_term', right_panal_slide_toggle, 'tab_rb_sys_term');
 	editor_show_right_tool_bar(true);
-	note_lookup(keyword,"term_dict");
+	note_lookup(keyword, "term_dict");
 }
 
-function term_show_new(){
+function term_show_new() {
 	$("#term_new_recorder").slideToggle();
 }

+ 68 - 0
app/viewer/readme.md

@@ -0,0 +1,68 @@
+# 功能
+
+# 参数
+## 浏览类型 
+view=?
+1. 文档 doc 
+2. 译文段落 trans-para
+3. 译文句子 trans-sent
+4. 逐词段落 wbw-para
+5. 逐词句子 wbw-sent
+6. 单词 wbw-word
+7. 章节 chapter
+8. 段落 para
+9. 句子 sent
+10. 单词 word
+
+## 显示模式
+display=?
+1. sent 逐句
+2. para 逐段
+
+## 资源 id  
+id=uuid
+
+view=1-6需要资源id
+
+## 书号
+book=##
+
+view=7,8,9,10 需要此参数
+## 段落号
+para=##
+
+view=8,9,10 需要此参数
+## 开始单词编号
+begin=##
+
+view=9,10 需要此参数
+
+## 结束单词
+end = ##
+
+view=8. (段落 para) 需要此参数
+
+## 范例
+1. 文档 doc  **viewer.php?view=doc&id={uuid}**
+2. 译文段落 trans-para **viewer.php?view=trans_para&id={uuid}**
+3. 译文句子 trans-sent **viewer.php?view=trans_sent&id={uuid}**
+4. 逐词段落 wbw-para **viewer.php?view=wbw_para&id={uuid}**
+5. 逐词句子 wbw-sent **viewer.php?view=wbw_sent&id={uuid}**
+6. 单词 wbw-word **viewer.php?view=wbw_word&id={uuid}**
+7. 章节 chapter **viewer.php?view=chapter&book={index}&para={index}**
+8. 段落 para **viewer.php?view=para&book={index}&para={index}**
+9. 句子 sent **viewer.php?view=sent&book={index}&para={index}&begin={index}&end={index}**
+10. 单词 word **viewer.php?view=sent&book={index}&para={index}&begin={index}**
+
+
+# 文档 document
+
+#  译文段落 trans-para
+# 译文句子 trans-sent
+# 逐词段落 wbw-para
+# 逐词句子 wbw-sent
+# 单词 wbw-word
+# 章节 chapter
+# 段落 para
+# 句子 sent
+# 单词 word

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů