info('task export chapter start'); Log::debug('task export chapter start'); if(\App\Tools\Tools::isStop()){ return 0; } $book = $this->argument('book'); $para = $this->argument('para'); $upload = new ExportDownload([ 'queryId'=>$this->argument('query_id'), 'format'=>$this->option('format'), 'debug'=>$this->option('debug'), 'filename'=>$book.'-'.$para, ]); $m = new \Mustache_Engine(array('entity_flags'=>ENT_QUOTES, 'delimiters' => '[[ ]]', 'escape'=>function ($value){ return $value; })); $tplFile = resource_path("mustache/chapter/md/paragraph.md"); $tplParagraph = file_get_contents($tplFile); MdRender::init(); $renderFormat='markdown'; //获取原文channel $orgChannelId = ChannelApi::getSysChannel('_System_Pali_VRI_'); $tranChannelsId = explode('_',$this->argument('channel')); $channelsId = array_merge([$orgChannelId],$tranChannelsId); $channels = array(); $channelsIndex = array(); foreach ($channelsId as $key => $id) { $channels[] = ChannelApi::getById($id); $channelsIndex[$id] = ChannelApi::getById($id); } $bookMeta = array(); $bookMeta['book_author'] = ""; foreach ($channels as $key => $channel) { $bookMeta['book_author'] .= $channel['name'] . ' '; } $chapter = PaliText::where('book',$book) ->where('paragraph',$para)->first(); if(!$chapter){ return $this->error("no data"); } $currProgress = 0; $this->info($upload->setStatus($currProgress,'start')); if(empty($chapter->toc)){ $bookMeta['title'] = "unknown"; }else{ $bookMeta['book_title'] = ''; foreach ($channelsId as $key => $id) { $title = ProgressChapter::where('book',$book)->where('para',$para) ->where('channel_id',$id) ->value('title'); $bookMeta['book_title'] .= $title; } $bookMeta['sub_title'] = $chapter->toc; } $subChapter = PaliText::where('book',$book)->where('parent',$para) ->where('level','<',8) ->orderBy('paragraph') ->get(); if(count($subChapter) === 0){ //没有子章节 $subChapter = PaliText::where('book',$book)->where('paragraph',$para) ->where('level','<',8) ->orderBy('paragraph') ->get(); } $chapterParagraph = PaliText::where('book',$book)->where('paragraph',$para)->value('chapter_len'); if($chapterParagraph >0 ){ $step = 0.9 / $chapterParagraph; }else{ $step = 0.9; Log::error('段落长度不能为0',['book'=>$book,'para'=>$para]); } $outputChannelsId = []; if($this->option('origin') === 'true'){ $outputChannelsId[] = $orgChannelId; } if($this->option('translation') === 'true'){ $outputChannelsId = array_merge($outputChannelsId,$tranChannelsId); } $sections = array(); foreach ($subChapter as $key => $sub) { # 看这个章节是否存在译文 $hasChapter = false; if($this->option('origin') === 'true'){ $hasChapter = true; } if($this->option('translation') === 'true'){ foreach ($tranChannelsId as $id) { if(ProgressChapter::where('book',$book)->where('para',$sub->paragraph) ->where('channel_id',$id) ->exists()){ $hasChapter = true; } } } if(!$hasChapter){ //不存在需要导出的数据 continue; } $filename = "{$sub->paragraph}.".$this->option('format'); $bookMeta['sections'][] = ['filename'=>$filename]; $paliTitle = PaliText::where('book',$book) ->where('paragraph',$sub->paragraph) ->value('toc'); $sectionTitle = $paliTitle; if($this->option('translation') === 'true'){ $chapter = ProgressChapter::where('book',$book)->where('para',$sub->paragraph) ->where('channel_id',$tranChannelsId[0]) ->first(); if($chapter && !empty($chapter->title)){ $sectionTitle = $chapter->title; } } $content = array(); $chapterStart = $sub->paragraph+1; $chapterEnd = $sub->paragraph + $sub->chapter_len; $chapterBody = PaliText::where('book',$book) ->whereBetween('paragraph',[$chapterStart,$chapterEnd]) ->orderBy('paragraph')->get(); foreach ($chapterBody as $body) { $currProgress += $step; $this->info($upload->setStatus($currProgress,'export chapter '.$body->paragraph)); $paraData = array(); $paraData['translations'] = array(); foreach ($outputChannelsId as $key => $channelId) { $translationData = Sentence::where('book_id',$book) ->where('paragraph',$body->paragraph) ->where('channel_uid',$channelId) ->orderBy('word_start')->get(); $sentContent = array(); foreach ($translationData as $sent) { $texText = MdRender::render($sent->content, [$sent->channel_uid], null, 'read', $channelsIndex[$channelId]['type'], $sent->content_type, $renderFormat ); $sentContent[] = trim($texText); } $paraContent = implode(' ',$sentContent); if($channelsIndex[$channelId]['type'] === 'original'){ $paraData['origin'] = $paraContent; }else{ $paraData['translations'][] = ['content'=>$paraContent]; } } if($body->level > 7){ $content[] = $m->render($tplParagraph,$paraData); }else{ $currLevel = $body->level - $sub->level; if($currLevel<=0){ $currLevel = 1; } if(count($paraData['translations'])===0){ $subSessionTitle = PaliText::where('book',$book) ->where('paragraph',$body->paragraph) ->value('toc'); }else{ $subSessionTitle = $paraData['translations'][0]['content']; } //标题 $subStr = array_fill(0,$currLevel,'#'); $content[] = implode('',$subStr) . " ".$subSessionTitle; } $content[] = "\n\n"; } $sections[] = [ 'name'=>$filename, 'body'=>[ 'title'=>$sectionTitle, 'content'=>implode('',$content) ] ]; } //导出术语表 $keyPali = array(); $keyMeaning = array(); if(isset($GLOBALS['glossary'])){ $glossary = $GLOBALS['glossary']; foreach ($glossary as $word => $meaning) { $keyMeaning[$meaning] = $word; $keyPali[$word] = $meaning; } } ksort($keyPali); krsort($keyMeaning); $glossaryData = []; $glossaryData['pali'] = []; $glossaryData['meaning'] = []; foreach ($keyPali as $word => $meaning) { $glossaryData['pali'][] = ['pali'=>$word,'meaning'=>$meaning]; } foreach ($keyMeaning as $meaning => $word) { $glossaryData['meaning'][] = ['pali' => $word,'meaning'=>$meaning]; } Log::debug('glossary',['data' => $glossaryData]); $tplFile = resource_path("mustache/chapter/".$this->option('format')."/glossary.".$this->option('format')); $tplGlossary = file_get_contents($tplFile); $glossaryContent = $m->render($tplGlossary,$glossaryData); $sections[] = [ 'name'=>'glossary.'.$this->option('format'), 'body'=>[ 'title' => 'glossary', 'content' => $glossaryContent ] ]; $this->info($upload->setStatus($currProgress,'export glossary '. count($keyPali))); $this->info($upload->setStatus(0.9,'export content done sections='.count($sections))); Log::debug('导出结束',['sections'=>count($sections)]); $upload->upload('chapter',$sections,$bookMeta); $this->info($upload->setStatus(1,'export chapter done')); return 0; } }