Skip to content

Commit 4296f2c

Browse files
committed
[fix]示例数据源相对路径与 sample-data 取值校验
- 缩略图改为按数据源目录取,sample-data 为英文数据源时用 examples/en/<产品>/img/ - sample-data 仅识别 en 与 en-xx,其余值(如 zh)一律当作未设置, 避免请求不存在的 examples/<值>/<产品>/config.js - 头部组件示例、Vue-Templates、Vue-Storybook 入口在英文数据源下不展示 AI-GEN: 80% Claude
1 parent 3d516d1 commit 4296f2c

3 files changed

Lines changed: 54 additions & 4 deletions

File tree

examples/js/dataSource.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ var dataSource = {
2222
appendConfigs: null,
2323
//计算示例 html 的地址
2424
resolveExampleUrl: null,
25+
//计算示例 html 所在目录
26+
resolveExampleDir: null,
27+
//计算缩略图所在目录
28+
resolveThumbLocation: null,
2529
//计算 web 目录下页面的地址
2630
resolveWebUrl: null
2731
};
@@ -43,7 +47,8 @@ var dataSource = {
4347
break;
4448
}
4549
}
46-
return /^[a-zA-Z0-9_]+$/.test(value) ? value : "";
50+
//只认 en 与 en-xx(如 en-US),其余值一律当作未设置,走默认数据源
51+
return /^en(-[a-zA-Z0-9]+)?$/.test(value) ? value : "";
4752
}
4853

4954
//从路径中取产品名。取页面所在目录名,/examples/leaflet/ 与 /en/examples/leaflet/ 均取到 leaflet
@@ -114,6 +119,22 @@ var dataSource = {
114119
return window.location.origin + normalizePath(dir + prefix + fileName + ".html");
115120
}
116121

122+
//计算示例 html 所在目录(结尾带 "/")。
123+
//预览时作为 iframe 的基准地址,使示例里的相对路径按其真实位置解析
124+
function resolveExampleDir(fileName) {
125+
var url = resolveExampleUrl(fileName);
126+
return url.substr(0, url.lastIndexOf("/") + 1);
127+
}
128+
129+
//计算缩略图所在目录,与示例配置取自同一数据源
130+
function resolveThumbLocation() {
131+
var pathname = window.location.pathname;
132+
var dir = pathname.substr(0, pathname.lastIndexOf("/") + 1);
133+
var prefix = useDataSource ? "../" + name + "/" + product + "/" : "./";
134+
//结尾不带 "/",与调用方拼接 "/img/" 的写法保持一致
135+
return window.location.origin + normalizePath(dir + prefix);
136+
}
137+
117138
//计算 web 目录下页面的地址,如 404.html。
118139
//examples 与 web 同级,需从当前页退到 examples 的上一层再进 web。
119140
//退几层只取决于页面自身在 examples 下的深度,与数据源无关
@@ -138,6 +159,8 @@ var dataSource = {
138159
dataSource.configUrl = configUrl;
139160
dataSource.appendConfigs = appendConfigs;
140161
dataSource.resolveExampleUrl = resolveExampleUrl;
162+
dataSource.resolveExampleDir = resolveExampleDir;
163+
dataSource.resolveThumbLocation = resolveThumbLocation;
141164
dataSource.resolveWebUrl = resolveWebUrl;
142165

143166
})(dataSource);

examples/js/editor.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ $(document).ready(function () {
88
});
99
var aceEditor;
1010
var containExamples = true;
11+
//当前预览示例所在目录,供 iframe 解析相对路径
12+
var previewBaseUrl = "";
1113

1214
function initPage() {
1315
initSideBar();
@@ -91,6 +93,8 @@ function loadExampleHtml() {
9193
}
9294
//示例 html 从当前数据源目录读取
9395
var mapUrl = dataSource.resolveExampleUrl(locationParam);
96+
//记录示例所在目录,预览时作为 iframe 内相对路径的基准
97+
previewBaseUrl = dataSource.resolveExampleDir(locationParam);
9498
if (!mapUrl) {
9599
return;
96100
}
@@ -139,7 +143,7 @@ function loadPreview(content) {
139143
iframeDocument = iFrame.contentWindow.document;
140144
iFrame.contentWindow.resources=window.resources?window.resources.resources:{};
141145
iframeDocument.open();
142-
iframeDocument.write(content);
146+
iframeDocument.write(withBaseUrl(content));
143147
iframeDocument.close();
144148
var doc = document;
145149
iFrame.addEventListener('load', function () {
@@ -153,6 +157,29 @@ function loadPreview(content) {
153157
mapHeight();
154158
}
155159

160+
//预览用的 iframe 没有自己的 url,相对路径会按 editor.html 的位置解析。
161+
//示例 html 里写的是相对它自身位置的真实路径,故注入 <base> 指向示例所在目录,
162+
//这样无论示例在哪一层目录、站点部署在哪个路径下,都能正确解析
163+
function withBaseUrl(content) {
164+
if (!previewBaseUrl) {
165+
return content;
166+
}
167+
var base = '<base href="' + previewBaseUrl + '">';
168+
//插到 <head> 之后,保证先于其它资源引用生效
169+
if (/<head[^>]*>/i.test(content)) {
170+
return content.replace(/<head[^>]*>/i, function (match) {
171+
return match + base;
172+
});
173+
}
174+
//没有 <head> 时退而插到 <html> 之后或开头
175+
if (/<html[^>]*>/i.test(content)) {
176+
return content.replace(/<html[^>]*>/i, function (match) {
177+
return match + base;
178+
});
179+
}
180+
return base + content;
181+
}
182+
156183
function createIFrame() {
157184
var preViewPane = $("#previewPane");
158185
preViewPane.empty();

examples/js/example.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ function createGalleryChart(example) {
136136
}
137137

138138
function getThumbLocation() {
139-
var param = window.location.toString();
140-
return param.substr(0, param.lastIndexOf('/'));
139+
//缩略图与示例配置取自同一数据源
140+
return dataSource.resolveThumbLocation();
141141
}
142142

143143
//chart宽高自适应

0 commit comments

Comments
 (0)