WikiController.php 7.6 KB

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