邓宏
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