'', "title"=> '', "path"=>[], "sub_title"=> '', "summary"=> '', "content"=> '', "content_type"=> "html", "status"=>30, "lang"=> "", "created_at"=> "", "updated_at"=> "", ]; protected $wbwChannels = []; protected $selectCol = ['book_id','paragraph','word_start',"word_end",'channel_uid','content','updated_at']; public function __construct() { } /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param \App\Models\Sentence $sentence * @return \Illuminate\Http\Response */ public function show(Sentence $sentence) { // } public function getSentTpl($id,$channels,$mode='edit',$onlyProps=false){ $sent = []; $sentId = \explode('-',$id); if($mode==='read'){ $channelId = ChannelApi::getSysChannel('_System_Pali_VRI_'); }else{ $channelId = ChannelApi::getSysChannel('_System_Wbw_VRI_'); } if($channelId !== false){ array_push($channels,$channelId); } $record = Sentence::select($this->selectCol) ->where('book_id',$sentId[0]) ->where('paragraph',$sentId[1]) ->where('word_start',(int)$sentId[2]) ->where('word_end',(int)$sentId[3]) ->whereIn('channel_uid',$channels) ->get(); Log::info("sent count:".count($record)); $channelIndex = $this->getChannelIndex($channels); //获取wbw channel //目前默认的 wbw channel 是第一个translation channel foreach ($channels as $channel) { # code... if($channelIndex[$channel]->type==='translation'){ $this->wbwChannels[] = $channel; break; } } return $this->makeContent($record,$mode,$channelIndex,[],$onlyProps); } /** * Display the specified resource. * * @param string $id * @return \Illuminate\Http\Response */ public function showSent($id) { // $param = \explode('_',$id); if(count($param)>1){ $channels = array_slice($param,1); }else{ $channels = []; } $this->result['content'] = getSentTpl($param[0],$channels); return $this->ok($this->result); } public function showSentences($type,$id,$mode='read'){ $param = \explode('_',$id); $sentId = \explode('-',$param[0]); $channels = []; #获取channel类型 $sentChannel = Sentence::select('channel_uid') ->where('book_id',$sentId[0]) ->where('paragraph',$sentId[1]) ->where('word_start',$sentId[2]) ->where('word_end',$sentId[3]) ->get(); foreach ($sentChannel as $key => $value) { # code... $channels[] = $value->channel_uid; } $channelInfo = Channel::whereIn("uid",$channels)->select(['uid','type','name'])->get(); $indexChannel = []; $channels = []; foreach ($channelInfo as $key => $value) { # code... if($value->type === $type){ $indexChannel[$value->uid] = $value; $channels[] = $value->uid; } } //获取句子数据 $record = Sentence::select($this->selectCol) ->where('book_id',$sentId[0]) ->where('paragraph',$sentId[1]) ->where('word_start',$sentId[2]) ->where('word_end',$sentId[3]) ->whereIn('channel_uid',$channels) ->orderBy('paragraph') ->orderBy('word_start') ->get(); if(count($record) ===0){ return $this->error("no data"); } $this->result['content'] = $this->makeContent($record,$mode,$indexChannel); return $this->ok($this->result); } public function showChapter($id,$mode='read') { // $param = \explode('_',$id); $sentId = \explode('-',$param[0]); $channels = []; if(count($param)>1){ $channels = array_slice($param,1); } if($mode === 'read'){ //阅读模式加载md格式原文 $channelId = ChannelApi::getSysChannel('_System_Pali_VRI_'); }else{ //翻译模式加载json格式原文 $channelId = ChannelApi::getSysChannel('_System_Wbw_VRI_'); } if($channelId !== false){ $channels[] = $channelId; } $chapter = PaliText::where('book',$sentId[0])->where('paragraph',$sentId[1])->first(); if(!$chapter){ return $this->error("no data"); } if(empty($chapter->toc)){ $this->result['title'] = "unknown"; }else{ $this->result['title'] = $chapter->toc; $this->result['sub_title'] = $chapter->toc; $this->result['path'] = json_decode($chapter->path); } $paraFrom = $sentId[1]; $paraTo = $sentId[1]+$chapter->chapter_len-1; //获取标题 $heading = PaliText::select(["book","paragraph","level"]) ->where('book',$sentId[0]) ->whereBetween('paragraph',[$paraFrom,$paraTo]) ->where('level','<',8) ->get(); //将标题段落转成索引数组 以便输出标题层级 $indexedHeading = []; foreach ($heading as $key => $value) { # code... $indexedHeading["{$value->book}-{$value->paragraph}"] = $value->level; } #获取channel索引表 $tranChannels = []; $channelInfo = Channel::whereIn("uid",$channels)->select(['uid','type','name'])->get(); $indexChannel = []; foreach ($channelInfo as $key => $value) { # code... $indexChannel[$value->uid] = $value; if($value->type==="translation" ){ $tranChannels[] = $value->uid; } } //获取wbw channel //目前默认的 wbw channel 是第一个translation channel foreach ($channels as $key => $value) { # code... if($indexChannel[$value]->type==='translation'){ $this->wbwChannels[] = $value; break; } } $title = Sentence::select($this->selectCol) ->where('book_id',$sentId[0]) ->where('paragraph',$sentId[1]) ->whereIn('channel_uid',$tranChannels) ->first(); if($title){ $this->result['title'] = MdRender::render($title->content,$title->channel_uid); } //获取句子数据 $record = Sentence::select($this->selectCol) ->where('book_id',$sentId[0]) ->whereBetween('paragraph',[$paraFrom,$paraTo]) ->whereIn('channel_uid',$channels) ->orderBy('paragraph') ->orderBy('word_start') ->get(); if(count($record) ===0){ return $this->error("no data"); } $this->result['content'] = $this->makeContent($record,$mode,$indexChannel,$indexedHeading); return $this->ok($this->result); } private function getChannelIndex($channels){ #获取channel索引表 $channelInfo = Channel::whereIn("uid",$channels)->select(['uid','type','name'])->get(); $indexChannel = []; foreach ($channelInfo as $key => $value) { # code... $indexChannel[$value->uid] = $value; } return $indexChannel; } /** * 根据句子库数据生成文章内容 * $record 句子数据 * $mode read | edit | wbw * $indexChannel channel索引 * $indexedHeading 标题索引 用于给段落加标题标签