File size: 3,759 Bytes
e1ae2c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
const initUi = require('./ui');
const initSearch = require('./search');
const initRouting = require('./routing');

function detectHomePageId() {
  // 首页不再固定为 "home":以导航顺序第一项为准
  // 1) 优先从生成端注入的配置数据读取(保持与实际导航顺序一致)
  try {
    const config =
      window.MeNav && typeof window.MeNav.getConfig === 'function'
        ? window.MeNav.getConfig()
        : null;
    const injectedHomePageId =
      config && config.data && config.data.homePageId ? String(config.data.homePageId).trim() : '';
    if (injectedHomePageId) return injectedHomePageId;
    const nav =
      config && config.data && Array.isArray(config.data.navigation)
        ? config.data.navigation
        : null;
    const firstId = nav && nav[0] && nav[0].id ? String(nav[0].id).trim() : '';
    if (firstId) return firstId;
  } catch (error) {
    // 忽略解析错误,继续使用 DOM 推断
  }

  // 2) 回退到 DOM:取首个导航项的 data-page
  const firstNavItem = document.querySelector('.nav-item[data-page]');
  if (firstNavItem) {
    const id = String(firstNavItem.getAttribute('data-page') || '').trim();
    if (id) return id;
  }

  // 3) 最后兜底:取首个页面容器 id
  const firstPage = document.querySelector('.page[id]');
  if (firstPage && firstPage.id) return firstPage.id;

  return 'home';
}

document.addEventListener('DOMContentLoaded', () => {
  const homePageId = detectHomePageId();

  const state = {
    homePageId,
    currentPageId: homePageId,
    isInitialLoad: true,
    isSidebarOpen: false,
    isLightTheme: false,
    isSidebarCollapsed: false,
    pages: null,
    currentSearchEngine: 'local',
    isSearchActive: false,
    searchIndex: {
      initialized: false,
      items: [],
    },
  };

  // 获取 DOM 元素 - 基本元素
  const searchInput = document.getElementById('search');
  const searchBox = document.querySelector('.search-box');
  const searchResultsPage = document.getElementById('search-results');
  const searchSections = searchResultsPage.querySelectorAll('.search-section');

  // 搜索引擎相关元素
  const searchEngineToggle = document.querySelector('.search-engine-toggle');
  const searchEngineToggleIcon = searchEngineToggle
    ? searchEngineToggle.querySelector('.search-engine-icon')
    : null;
  const searchEngineToggleLabel = searchEngineToggle
    ? searchEngineToggle.querySelector('.search-engine-label')
    : null;
  const searchEngineDropdown = document.querySelector('.search-engine-dropdown');
  const searchEngineOptions = document.querySelectorAll('.search-engine-option');

  // 移动端元素
  const menuToggle = document.querySelector('.menu-toggle');
  const searchToggle = document.querySelector('.search-toggle');
  const sidebar = document.querySelector('.sidebar');
  const searchContainer = document.querySelector('.search-container');
  const overlay = document.querySelector('.overlay');

  // 侧边栏折叠功能
  const sidebarToggle = document.querySelector('.sidebar-toggle');
  const content = document.querySelector('.content');

  // 主题切换元素
  const themeToggle = document.querySelector('.theme-toggle');
  const themeIcon = themeToggle.querySelector('i');

  const dom = {
    searchInput,
    searchBox,
    searchResultsPage,
    searchSections,
    searchEngineToggle,
    searchEngineToggleIcon,
    searchEngineToggleLabel,
    searchEngineDropdown,
    searchEngineOptions,
    menuToggle,
    searchToggle,
    sidebar,
    searchContainer,
    overlay,
    sidebarToggle,
    content,
    themeToggle,
    themeIcon,
  };

  const ui = initUi(state, dom);
  const search = initSearch(state, dom);

  initRouting(state, dom, { ui, search });
});