@@ -242,9 +242,12 @@ export function downloadMD(doc) {
242
242
243
243
/**
244
244
* 导出 HTML 生成内容
245
- * @param {HTML生成内容 } htmlStr
246
245
*/
247
- export function exportHTML ( htmlStr ) {
246
+ export function exportHTML ( ) {
247
+ const element = document . querySelector ( "#output" ) ;
248
+ setStyles ( element ) ;
249
+ const htmlStr = element . innerHTML ;
250
+
248
251
const downLink = document . createElement ( "a" ) ;
249
252
250
253
downLink . download = "content.html" ;
@@ -257,6 +260,50 @@ export function exportHTML(htmlStr) {
257
260
document . body . appendChild ( downLink ) ;
258
261
downLink . click ( ) ;
259
262
document . body . removeChild ( downLink ) ;
263
+
264
+ function setStyles ( element ) {
265
+ switch ( true ) {
266
+ case isSection ( element ) :
267
+ case isPre ( element ) :
268
+ case isCode ( element ) :
269
+ case isSpan ( element ) :
270
+ element . setAttribute ( "style" , getElementStyles ( element ) ) ;
271
+ default :
272
+ }
273
+ if ( element . children . length ) {
274
+ Array . from ( element . children ) . forEach ( ( child ) => setStyles ( child ) ) ;
275
+ }
276
+
277
+ // 判断是否是包裹代码块的 section 元素
278
+ function isSection ( element ) {
279
+ return (
280
+ element . tagName === "SECTION" &&
281
+ Array . from ( element . classList ) . includes ( "code-snippet__github" )
282
+ ) ;
283
+ }
284
+ // 判断是否是包裹代码块的 pre 元素
285
+ function isPre ( element ) {
286
+ return (
287
+ element . tagName === "PRE" &&
288
+ Array . from ( element . classList ) . includes ( "code__pre" )
289
+ ) ;
290
+ }
291
+ // 判断是否是包裹代码块的 code 元素
292
+ function isCode ( element ) {
293
+ return (
294
+ element . tagName === "CODE" &&
295
+ Array . from ( element . classList ) . includes ( "prettyprint" )
296
+ ) ;
297
+ }
298
+ // 判断是否是包裹代码字符的 span 元素
299
+ function isSpan ( element ) {
300
+ return (
301
+ element . tagName === "SPAN" &&
302
+ ( isCode ( element . parentElement ) ||
303
+ isCode ( element . parentElement . parentElement ) )
304
+ ) ;
305
+ }
306
+ }
260
307
}
261
308
262
309
/**
@@ -313,3 +360,17 @@ export function checkImage(file) {
313
360
}
314
361
return { ok : true } ;
315
362
}
363
+
364
+ /**
365
+ * 获取一个 DOM 元素的所有样式,
366
+ * @param {DOM 元素 } element DOM 元素
367
+ * @param {排除的属性 } excludes 如果某些属性对结果有不良影响,可以使用这个参数来排除
368
+ * @returns 行内样式拼接结果
369
+ */
370
+ function getElementStyles ( element , excludes = [ "width" , "height" ] ) {
371
+ const styles = getComputedStyle ( element , null ) ;
372
+ return Object . entries ( styles )
373
+ . filter ( ( [ key ] ) => styles . getPropertyValue ( key ) && ! excludes . includes ( key ) )
374
+ . map ( ( [ key , value ] ) => `${ key } :${ value } ;` )
375
+ . join ( "" ) ;
376
+ }
0 commit comments