|
2 | 2 |
|
3 | 3 | import BLOG from '@/blog.config'
|
4 | 4 | import { useGlobal } from './global'
|
5 |
| -import { deepClone } from './utils' |
| 5 | +import { deepClone, isUrl } from './utils' |
6 | 6 |
|
7 | 7 | /**
|
8 | 8 | * 读取配置顺序
|
@@ -32,6 +32,8 @@ export const siteConfig = (key, defaultVal = null, extendConfig = {}) => {
|
32 | 32 | case 'POST_LIST_STYLE':
|
33 | 33 | case 'POST_LIST_PREVIEW':
|
34 | 34 | case 'POST_URL_PREFIX_MAPPING_CATEGORY':
|
| 35 | + case 'IS_TAG_COLOR_DISTINGUISHED': |
| 36 | + case 'TAG_SORT_BY_COUNT': |
35 | 37 | return convertVal(extendConfig[key] || defaultVal || BLOG[key])
|
36 | 38 | default:
|
37 | 39 | }
|
@@ -89,46 +91,62 @@ export const siteConfig = (key, defaultVal = null, extendConfig = {}) => {
|
89 | 91 | return defaultVal
|
90 | 92 | }
|
91 | 93 |
|
92 |
| - // 从Notion_CONFIG读取的配置通常都是字符串,适当转义 |
93 | 94 | return convertVal(val)
|
94 | 95 | }
|
95 | 96 |
|
96 | 97 | /**
|
97 |
| - * 配置默认都是string类型; |
98 |
| - * 识别配置的值是否数字、布尔、[]数组,若是则转成对应类型 |
| 98 | + * 从环境变量和NotionConfig读取的配置都是string类型; |
| 99 | + * 这里识别出配置的字符值若为否 数字、布尔、[]数组,{}对象,若是则转成对应类型 |
| 100 | + * 使用JSON和eval两个函数 |
99 | 101 | * @param {*} val
|
100 | 102 | * @returns
|
101 | 103 | */
|
102 | 104 | export const convertVal = val => {
|
103 |
| - if (typeof val === 'string') { |
104 |
| - // 解析布尔 |
105 |
| - if (val === 'true' || val === 'false') { |
106 |
| - return JSON.parse(val) |
107 |
| - } |
| 105 | + // 如果传入参数本身就是obj、数组、boolean 就无需处理 |
| 106 | + if (typeof val !== 'string' || !val) { |
| 107 | + return val |
| 108 | + } |
108 | 109 |
|
109 |
| - // 解析数字,parseInt将字符串转换为数字 |
110 |
| - if (/^\d+$/.test(val)) { |
111 |
| - return parseInt(val) |
112 |
| - } |
113 |
| - // 转移 [] , {} 这种json串为json对象 |
114 |
| - try { |
115 |
| - const parsedJson = JSON.parse(val) |
116 |
| - // 检查解析后的结果是否是对象或数组 |
117 |
| - if (typeof parsedJson === 'object' && parsedJson !== null) { |
118 |
| - return parsedJson |
119 |
| - } |
120 |
| - } catch (error) { |
121 |
| - // JSON 解析失败,返回原始字符串值 |
122 |
| - return val |
123 |
| - } |
| 110 | + // 解析数字,parseInt将字符串转换为数字 |
| 111 | + if (/^\d+$/.test(val)) { |
| 112 | + return parseInt(val) |
124 | 113 | }
|
125 | 114 |
|
126 |
| - try { |
| 115 | + // 检测是否url |
| 116 | + if (isUrl(val)) { |
| 117 | + return val |
| 118 | + } |
| 119 | + // 检测是否url |
| 120 | + if (val === 'true' || val === 'false') { |
127 | 121 | return JSON.parse(val)
|
| 122 | + } |
| 123 | + |
| 124 | + // 配置值前可能有污染的空格 |
| 125 | + if (!val.indexOf('[') > 0 || val.indexOf('{')) { |
| 126 | + return val |
| 127 | + } |
| 128 | + |
| 129 | + // 转换 [] , {} , true/false 这类字符串为对象 |
| 130 | + try { |
| 131 | + // 尝试解析json |
| 132 | + const parsedJson = JSON.parse(val) |
| 133 | + if (parsedJson !== null) { |
| 134 | + return parsedJson |
| 135 | + } |
128 | 136 | } catch (error) {
|
129 |
| - // 如果值是一个字符串但不是有效的 JSON 格式,直接返回字符串 |
| 137 | + // try { |
| 138 | + // // 尝试解析对象,对象解析能力不如上一步的json |
| 139 | + // const evalObj = eval('(' + val + ')') |
| 140 | + // if (evalObj !== null) { |
| 141 | + // return evalObj |
| 142 | + // } |
| 143 | + // } catch (error) { |
| 144 | + // // Ojbject 解析失败,返回原始字符串值 |
| 145 | + // return val |
| 146 | + // } |
130 | 147 | return val
|
131 | 148 | }
|
| 149 | + return val |
132 | 150 | }
|
133 | 151 |
|
134 | 152 | /**
|
|
0 commit comments