WikiController.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. namespace App\Http\Controllers\Library;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\Helpers\WikiContentParser;
  6. use App\Services\TermService;
  7. class WikiController extends Controller
  8. {
  9. public function __construct(
  10. private TermService $termService
  11. ) {}
  12. // ── Mock 数据 ────────────────────────────────────────────────
  13. private function mockEntries(): array
  14. {
  15. return [
  16. [
  17. 'word' => 'Anicca',
  18. 'lang' => 'zh-Hans',
  19. 'slug' => 'anicca',
  20. 'meaning' => '无常',
  21. 'quality' => 'featured', // featured | stub | review | null
  22. 'category' => '法义术语',
  23. 'tags' => ['三相', '法义术语', '相应部', '内观', '五蕴'],
  24. 'langs' => [
  25. ['lang' => 'zh-Hant', 'label' => '繁体中文', 'word' => '无常'],
  26. ['lang' => 'en', 'label' => 'English', 'word' => 'Impermanence'],
  27. ],
  28. 'related' => [
  29. ['word' => 'Dukkha', 'zh' => '苦', 'lang' => 'pi'],
  30. ['word' => 'Anattā', 'zh' => '无我', 'lang' => 'pi'],
  31. ['word' => 'Vipassanā', 'zh' => '内观', 'lang' => 'pi'],
  32. ['word' => 'Ti-lakkhaṇa', 'zh' => '三相', 'lang' => 'pi'],
  33. ],
  34. 'content' => <<<HTML
  35. <h2>词源与释义</h2>
  36. <blockquote>
  37. 「诸比丘,色是无常的。无常的即是苦的。苦的即是无我的。无我的即应如实以正慧观察……」
  38. <cite>SN 22.15 · Khandha-saṃyutta · 相应部·蕴相应</cite>
  39. </blockquote>
  40. HTML,
  41. ],
  42. ];
  43. }
  44. private function featured(array $all): array
  45. {
  46. return array_map(function ($item) {
  47. return ['word' => $item['word'], 'zh' => $item['meaning'], 'lang' => $item['language'], 'category' => '法义术语'];
  48. }, $all);
  49. }
  50. private function mockStats(): array
  51. {
  52. return [
  53. 'total' => 2847,
  54. 'this_month' => 43,
  55. 'contributors' => 128,
  56. ];
  57. }
  58. private function mockRecentUpdates(): array
  59. {
  60. return [
  61. ['word' => 'Nibbāna', 'lang' => 'pi'],
  62. ['word' => '四圣谛', 'lang' => 'zh'],
  63. ['word' => '阿含经', 'lang' => 'zh'],
  64. ['word' => 'Rājagaha', 'lang' => 'pi'],
  65. ];
  66. }
  67. // ── Actions ──────────────────────────────────────────────────
  68. public function index(string $lang)
  69. {
  70. $result = $this->termService->communityTerms($lang);
  71. $fakeRequest = Request::create('', 'GET', []);
  72. $termResource = $result['data'];
  73. $terms = $termResource->toArray($fakeRequest);
  74. $first = $terms[0];
  75. $today = [
  76. 'word' => $first['word'],
  77. 'lang' => $first['language'],
  78. 'slug' => $first['word'],
  79. 'meaning' => $first['meaning'],
  80. 'quality' => 'featured', // featured | stub | review | null
  81. 'category' => '法义术语',
  82. 'content' => $first['summary']
  83. ];
  84. return view('library.wiki.index', [
  85. 'today' => $today,
  86. 'featured' => $this->featured($terms),
  87. 'stats' => $this->mockStats(),
  88. 'recentUpdates' => $this->mockRecentUpdates(),
  89. 'categories' => $this->categories(),
  90. 'lang' => $lang
  91. ]);
  92. }
  93. public function show(string $lang, string $word)
  94. {
  95. $term = $this->termService->communityTerm($word, $lang);
  96. $urlParam = ['format' => 'html'];
  97. $fakeRequest = Request::create('', 'GET', $urlParam);
  98. $termArray = $term->toArray($fakeRequest);
  99. $entry = [
  100. 'word' => $termArray['word'],
  101. 'lang' => $termArray['language'],
  102. 'slug' => $termArray['word'],
  103. 'meaning' => $termArray['meaning'],
  104. 'quality' => 'featured', // featured | stub | review | null
  105. 'category' => '法义术语',
  106. 'tags' => [],
  107. 'langs' => [
  108. ['lang' => 'zh-Hant', 'label' => '繁体中文', 'word' => '无常'],
  109. ['lang' => 'en', 'label' => 'English', 'word' => 'Impermanence'],
  110. ],
  111. 'related' => [
  112. ['word' => 'Dukkha', 'zh' => '苦', 'lang' => 'pi'],
  113. ['word' => 'Anattā', 'zh' => '无我', 'lang' => 'pi'],
  114. ['word' => 'Vipassanā', 'zh' => '内观', 'lang' => 'pi'],
  115. ['word' => 'Ti-lakkhaṇa', 'zh' => '三相', 'lang' => 'pi'],
  116. ],
  117. 'content' => $termArray['html']
  118. ];
  119. $parsed = WikiContentParser::parse($entry['content']);
  120. return view('library.wiki.show', [
  121. 'entry' => array_merge($entry, [
  122. 'content' => $parsed['content'],
  123. 'toc' => $parsed['toc'],
  124. ]),
  125. 'categories' => $this->categories(),
  126. 'lang' => $lang
  127. ]);
  128. }
  129. // ── Helpers ──────────────────────────────────────────────────
  130. private function categories(): array
  131. {
  132. return [
  133. ['slug' => 'all', 'label' => '全部'],
  134. ['slug' => 'term', 'label' => '法义术语'],
  135. ['slug' => 'person', 'label' => '人物传记'],
  136. ['slug' => 'text', 'label' => '经典文献'],
  137. ['slug' => 'school', 'label' => '宗派历史'],
  138. ['slug' => 'practice', 'label' => '修行方法'],
  139. ['slug' => 'place', 'label' => '佛教地理'],
  140. ];
  141. }
  142. // 在 WikiController.php 中添加此方法
  143. // 在 WikiController.php 中添加
  144. public function home(string $lang = 'zh-Hans')
  145. {
  146. // Mock 语言列表
  147. $languages = [
  148. ['code' => 'zh-Hans', 'name' => '简体中文'],
  149. ['code' => 'zh-Hant', 'name' => '繁體中文'],
  150. ['code' => 'en', 'name' => 'English'],
  151. ['code' => 'ja', 'name' => '日本語'],
  152. ['code' => 'ko', 'name' => '한국어'],
  153. ['code' => 'vi', 'name' => 'Tiếng Việt'],
  154. ['code' => 'my', 'name' => 'မြန်မာစာ'],
  155. ];
  156. // Mock 统计数据
  157. $stats = [
  158. 'total_articles' => 2847,
  159. 'total_terms' => 1256,
  160. 'languages_count' => 10,
  161. 'contributors' => 328,
  162. 'today_updates' => 12,
  163. ];
  164. // Mock 热门搜索标签
  165. $hotTags = ['无常', 'Anicca', '四圣谛', '涅槃', '内观', '业力', '慈悲', '般若'];
  166. // Mock 每日一词(可选展示)
  167. $dailyTerm = [
  168. 'word' => 'Dhammapada',
  169. 'zh' => '法句经',
  170. 'lang' => 'pi',
  171. 'meaning' => '佛陀的偈颂集,佛教最重要的经典之一',
  172. ];
  173. return view('library.wiki.home', [
  174. 'languages' => $languages,
  175. 'currentLang' => $lang,
  176. 'stats' => $stats,
  177. 'hotTags' => $hotTags,
  178. 'dailyTerm' => $dailyTerm,
  179. ]);
  180. }
  181. }