邓宏
3 years ago
8 changed files with 126 additions and 2 deletions
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,13 @@ |
|||||
|
import svgIcon from './svg-icon.vue' |
||||
|
|
||||
|
const components = { |
||||
|
svgIcon, |
||||
|
} |
||||
|
|
||||
|
export default{ |
||||
|
install(Vue, opt){ |
||||
|
for(var i in components){ |
||||
|
Vue.component(i, components[i]) |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
<style scoped> |
||||
|
.svg-icon{ |
||||
|
width: 1em; |
||||
|
height: 1em; |
||||
|
vertical-align: -0.15em; |
||||
|
fill: currentColor; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
</style> |
||||
|
<template> |
||||
|
<svg :class="svgClass" aria-hidden="true" v-on="$attrs" :style="{color: props.color}"> |
||||
|
<use :xlink:href="iconName"/> |
||||
|
</svg> |
||||
|
</template> |
||||
|
<script setup> |
||||
|
import { computed } from "vue" |
||||
|
const props=defineProps({ |
||||
|
name:String, |
||||
|
color:String, |
||||
|
className:String, |
||||
|
}) |
||||
|
const iconName = computed(()=>`#icon-${props.name}`) |
||||
|
const svgClass = computed(()=>{ |
||||
|
if(props.className)return `svg-icon icon-${props.anme}` |
||||
|
else return 'svg-icon' |
||||
|
}) |
||||
|
</script> |
@ -0,0 +1,65 @@ |
|||||
|
import { readFileSync, readdirSync } from 'fs' |
||||
|
|
||||
|
let idPerfix = '' |
||||
|
const svgTitle = /<svg([^>+].*?)>/ |
||||
|
const clearHeightWidth = /(width|height)="([^>+].*?)"/g |
||||
|
|
||||
|
const hasViewBox = /(viewBox="[^>+].*?")/g |
||||
|
|
||||
|
const clearReturn = /(\r)|(\n)/g |
||||
|
|
||||
|
function findSvgFile(dir) { |
||||
|
const svgRes = [] |
||||
|
const dirents = readdirSync(dir, { |
||||
|
withFileTypes: true |
||||
|
}) |
||||
|
for (const dirent of dirents) { |
||||
|
if (dirent.isDirectory()) { |
||||
|
svgRes.push(...findSvgFile(dir + dirent.name + '/')) |
||||
|
} else { |
||||
|
const svg = readFileSync(dir + dirent.name) |
||||
|
.toString() |
||||
|
.replace(clearReturn, '') |
||||
|
.replace(svgTitle, ($1, $2) => { |
||||
|
let width = 0 |
||||
|
let height = 0 |
||||
|
let content = $2.replace(clearHeightWidth, (s1, s2, s3) => { |
||||
|
if (s2 === 'width') { |
||||
|
width = s3 |
||||
|
} else if (s2 === 'height') { |
||||
|
height = s3 |
||||
|
} |
||||
|
return '' |
||||
|
}) |
||||
|
if (!hasViewBox.test($2)) { |
||||
|
content += `viewBox="0 0 ${width} ${height}"` |
||||
|
} |
||||
|
return `<symbol id="${idPerfix}-${dirent.name.replace('.svg', '')}" ${content}>` |
||||
|
}) |
||||
|
.replace('</svg>', '</symbol>') |
||||
|
svgRes.push(svg) |
||||
|
} |
||||
|
} |
||||
|
return svgRes |
||||
|
} |
||||
|
|
||||
|
export const svgBuilder = (path, perfix = 'icon') => { |
||||
|
if (path === '') return |
||||
|
idPerfix = perfix |
||||
|
const res = findSvgFile(path) |
||||
|
|
||||
|
return { |
||||
|
name: 'svg-transform', |
||||
|
transformIndexHtml(html) { |
||||
|
return html.replace( |
||||
|
'<body>', |
||||
|
` |
||||
|
<body> |
||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0"> |
||||
|
${res.join('')} |
||||
|
</svg> |
||||
|
` |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue