bookmark.ts 5.1 KB
Newer Older
X
xjh22222228 已提交
1 2 3 4 5 6 7
// Copyright @ 2018-2021 xiejiahe. All rights reserved. MIT license.
// See https://github.com/xjh22222228/nav

import { INavProps } from '../types'
import { websiteList } from '../store'

export function parseBookmark(htmlStr: string) {
X
xjh22222228 已提交
8
  const copyWebList = JSON.parse(JSON.stringify(websiteList))
X
xjh22222228 已提交
9 10 11 12 13
  const data: INavProps[] = []
  const importEl = document.createElement('div')
  importEl.innerHTML = htmlStr
  const roolDL = importEl.querySelector('dl dl')

X
xjh22222228 已提交
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
  // 未分类
  let hasNoCate = false
  const cateCreateAt = new Date().toISOString()
  const noCate: INavProps = {
    title: '未分类',
    createdAt: cateCreateAt,
    nav: [
      {
        createdAt: cateCreateAt,
        title: '未分类',
        nav: [
          {
            title: '未分类',
            nav: []
          }
        ]
      }
    ]
  }

  function findA(node: Element) {
    let a = node.firstElementChild
X
xjh22222228 已提交
36
    if (!a && a.nodeName !== 'a') return
X
xjh22222228 已提交
37 38 39 40 41

    hasNoCate = true
    const name = a.textContent
    const createdAt = new Date(Number(a.getAttribute('add_date')) * 1000).toISOString()
    const icon = a.getAttribute('icon') || null
X
xjh22222228 已提交
42
    const url = a.getAttribute('href') || ''
X
xjh22222228 已提交
43 44 45 46 47 48 49 50 51 52 53
    noCate.nav[0].nav[0].nav.push({
      name,
      createdAt,
      icon,
      url,
      urls: {},
      desc: '',
      rate: 5
    })
  }

X
xjh22222228 已提交
54 55 56 57 58 59 60 61
  let ii = 0
  let jj = 0
  let kk = 0
  try {
    // One Level
    for (let i = 0; i < roolDL.childElementCount; i++) {
      const iItem = roolDL.childNodes[i] as any
      if (iItem && iItem.nodeName === 'DT') {
X
xjh22222228 已提交
62
        findA(iItem)
X
xjh22222228 已提交
63 64 65 66 67 68 69 70
        const titleEl = iItem.querySelector('h3') as Element
        // PERSONAL_TOOLBAR_FOLDER 收藏栏
        if (
          !titleEl ||
          titleEl.getAttribute('personal_toolbar_folder') ||
          titleEl.getAttribute('PERSONAL_TOOLBAR_FOLDER')
        ) continue

X
xjh22222228 已提交
71 72
        ii++
        const title = titleEl.textContent
X
xjh22222228 已提交
73
        const createdAt = new Date(Number(titleEl.getAttribute('add_date')) * 1000).toISOString()
X
xjh22222228 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86
        data.push({
          title,
          createdAt,
          icon: null,
          nav: []
        })

        // Two Level
        jj = 0
        const DL = iItem.querySelector('dl')
        for (let j = 0; j < DL.childElementCount; j++) {
          const jItem = DL.childNodes[j]
          if (jItem && jItem.nodeName === 'DT') {
X
xjh22222228 已提交
87
            findA(jItem)
X
xjh22222228 已提交
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
            const titleEl = jItem.querySelector('h3')
            if (!titleEl) continue
            jj++
            const title = titleEl.textContent
            const createdAt = new Date(titleEl.getAttribute('add_date') * 1000).toISOString()
            data[ii - 1].nav.push({
              title,
              createdAt,
              icon: null,
              nav: []
            })

            // Three Level
            kk = 0
            const DL3 = jItem.querySelector('dl')
            for (let k = 0; k < DL3.childElementCount; k++) {
              const kItem = DL3.childNodes[k]
              if (kItem && kItem.nodeName === 'DT') {
X
xjh22222228 已提交
106
                findA(kItem)
X
xjh22222228 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
                const titleEl = kItem.querySelector('h3')
                if (!titleEl) continue
                kk++
                const title = titleEl.textContent
                const createdAt = new Date(titleEl.getAttribute('add_date') * 1000).toISOString()
                data[ii - 1].nav[jj - 1].nav.push({
                  title,
                  createdAt,
                  nav: [],
                  icon: null
                })

                // Website Level
                const DL3 = kItem.querySelector('dl')
                for (let b = 0; b < DL3.childElementCount; b++) {
                  const kItem = DL3.childNodes[b]
                  if (kItem && kItem.nodeName === 'DT') {
                    const titleEl = kItem.querySelector('a')
                    if (!titleEl) continue
                    const title = titleEl.textContent
                    const createdAt = new Date(titleEl.getAttribute('add_date') * 1000).toISOString()
                    const icon = titleEl.getAttribute('icon') || null
                    const url = titleEl.getAttribute('href')
                    data[ii - 1].nav[jj - 1].nav[kk - 1].nav.push({
                      name: title,
                      createdAt,
                      url,
                      desc: '',
                      urls: {},
136 137
                      rate: 5,
                      top: false,
X
xjh22222228 已提交
138 139 140 141 142 143 144 145 146 147 148 149 150 151
                      icon
                    })
                  }
                }
              }
            }
          }
        }
      }
    }
  } catch (error) {
    return error
  }

X
xjh22222228 已提交
152 153 154 155 156 157 158 159 160 161
  if (hasNoCate) {
    data.push(noCate)
  }

  // 增量导入
  function r(data: any[], list: any[]) {
    for (let i = 0; i < data.length; i++) {
      const item = data[i] as any
      const title = item.title || item?.name
      const idx = list.findIndex(item => (item.title || item.name) === title)
X
xjh22222228 已提交
162

X
xjh22222228 已提交
163 164 165 166 167 168 169 170
      // Repeat
      if (idx !== -1) {
        if (Array.isArray(item.nav)) {
          r(item.nav, list[idx].nav)
        }
      } else {
        list.push(item)
      }
X
xjh22222228 已提交
171 172
    }
  }
X
xjh22222228 已提交
173 174 175
  r(data, copyWebList)

  console.log(copyWebList)
X
xjh22222228 已提交
176

X
xjh22222228 已提交
177
  return copyWebList
X
xjh22222228 已提交
178
}