创建一个 Github 徽章
Create a Github badge
我想为 Github 自述文件创建徽章(例如 this)。我创建了一个函数来使用 JavaScript 从 URL 获取 GET 值并将其放入 SVG 中,当我在本地尝试它时它可以工作但是如果我将它放在 Markdown 文件中它不会改变号码。

index.svg:
<svg width="200" height="75" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
style="-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;">
<g>
<rect x="0" y="0" width="125" height="75" style="fill:#F84949F5"></rect>
<text x="0" y="37.5" font-family="Segoe UI" font-size="16" font-weight="bold" fill="white">
<tspan x="62.5" text-anchor="middle" dy="-3.5%">I started</tspan>
<tspan x="62.5" text-anchor="middle" dy="25%">programming</tspan>
</text>
<rect x="124" y="0" width="75" height="75" style="fill:#F84949"></rect>
<text x="124" y="75" font-family="Segoe UI" font-size="13" fill="white" font-weight="bold">
<tspan x="162.5" text-anchor="middle" y="45.891675" font-size="40" id="years-number">5</tspan>
<tspan x="162.5" text-anchor="middle" y="67.5" font-weight="bold">years ago</tspan>
</text>
</g>
<script xlink:href="script.js" />
</svg>
script.js:
function changeNumber() {
document.getElementById("years-number").textContent = getValue;
}
let getValue;
window.addEventListener("load", function () {
let name="years";
if(name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))
getValue = decodeURIComponent(name[1]);
changeNumber();
});
在浏览器中输出:
correct output
降价输出(正确的一个):
wrong output
我该如何解决?
您可以使用模板 svg 和 pupa 创建无服务器函数。
Svg 文件:
...svg
<tspan x="162.5" text-anchor="middle" y="45.891675" font-size="40" id="years-number">{years}</tspan>
...svg
服务器端代码:
//
import pupa from 'pupa'
import { readFileSync } from 'fs'
import { join } from 'path'
import { dirname } from 'dirname-filename-esm'
const __dirname = dirname(import.meta)
const template = readFileSync(join(__dirname, '../badge.svg'), 'utf8')
export default (req, res) => {
let { years } = req.query
if (typeof years !== 'string') return res.status(400).end()
res.setHeader('Content-Type', 'text/xml')
res.end(pupa(template, { years }))
}
我使用 Vercel 来部署无服务器功能。除了 Vercel 之外,还有其他方法。
Link 回复:https://replit.com/@Programmerraj/serverless-api#api/index.js
Link 实例:https://serverless-api-ebon.vercel.app/api?years=6(将 years
更改为任何内容)。
Link 到 GitHub 回购:https://github.com/ChocolateLoverRaj/serverless-api.
在此答案中以 markdown 编写的预览:
我想为 Github 自述文件创建徽章(例如 this)。我创建了一个函数来使用 JavaScript 从 URL 获取 GET 值并将其放入 SVG 中,当我在本地尝试它时它可以工作但是如果我将它放在 Markdown 文件中它不会改变号码。

index.svg:
<svg width="200" height="75" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
style="-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;">
<g>
<rect x="0" y="0" width="125" height="75" style="fill:#F84949F5"></rect>
<text x="0" y="37.5" font-family="Segoe UI" font-size="16" font-weight="bold" fill="white">
<tspan x="62.5" text-anchor="middle" dy="-3.5%">I started</tspan>
<tspan x="62.5" text-anchor="middle" dy="25%">programming</tspan>
</text>
<rect x="124" y="0" width="75" height="75" style="fill:#F84949"></rect>
<text x="124" y="75" font-family="Segoe UI" font-size="13" fill="white" font-weight="bold">
<tspan x="162.5" text-anchor="middle" y="45.891675" font-size="40" id="years-number">5</tspan>
<tspan x="162.5" text-anchor="middle" y="67.5" font-weight="bold">years ago</tspan>
</text>
</g>
<script xlink:href="script.js" />
</svg>
script.js:
function changeNumber() {
document.getElementById("years-number").textContent = getValue;
}
let getValue;
window.addEventListener("load", function () {
let name="years";
if(name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))
getValue = decodeURIComponent(name[1]);
changeNumber();
});
在浏览器中输出: correct output
降价输出(正确的一个): wrong output
我该如何解决?
您可以使用模板 svg 和 pupa 创建无服务器函数。
Svg 文件:
...svg
<tspan x="162.5" text-anchor="middle" y="45.891675" font-size="40" id="years-number">{years}</tspan>
...svg
服务器端代码:
//
import pupa from 'pupa'
import { readFileSync } from 'fs'
import { join } from 'path'
import { dirname } from 'dirname-filename-esm'
const __dirname = dirname(import.meta)
const template = readFileSync(join(__dirname, '../badge.svg'), 'utf8')
export default (req, res) => {
let { years } = req.query
if (typeof years !== 'string') return res.status(400).end()
res.setHeader('Content-Type', 'text/xml')
res.end(pupa(template, { years }))
}
我使用 Vercel 来部署无服务器功能。除了 Vercel 之外,还有其他方法。
Link 回复:https://replit.com/@Programmerraj/serverless-api#api/index.js
Link 实例:https://serverless-api-ebon.vercel.app/api?years=6(将 years
更改为任何内容)。
Link 到 GitHub 回购:https://github.com/ChocolateLoverRaj/serverless-api.
在此答案中以 markdown 编写的预览: