Skip to content

velog-readm-stats 1.3.0 #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v18.12.1
7 changes: 7 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"editor.tabSize": 2,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
}
}
5 changes: 3 additions & 2 deletions api/badge.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
const createBadge = require("../src/cards/velog-badge");
import createBadge from "../src/cards/velog-badge.js";

module.exports = async (req, res) => {
export default async (req, res) => {
const { name } = req.query;
res.setHeader("Content-Type", "image/svg+xml");

try {
return res.send(createBadge(name));
} catch (e) {
Expand Down
10 changes: 5 additions & 5 deletions api/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const createCard = require("../src/cards/new-log");
const createCardDark = require("../src/cards/new-log-black");
const fetchPost = require("../src/fetchers/post-fetcher");
const fetchReadPost = require("../src/fetchers/readpost-fetcher");
import createCard from "../src/cards/new-log.js";
import createCardDark from "../src/cards/new-log-black.js";
import fetchPost from "../src/fetchers/post-fetcher.js";
import fetchReadPost from "../src/fetchers/readpost-fetcher.js";

module.exports = async (req, res) => {
export default async (req, res) => {
const { name, tag, color, slug } = req.query;
res.setHeader("Content-Type", "image/svg+xml");
try {
Expand Down
6 changes: 3 additions & 3 deletions api/list.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const createLatestPostsCard = require("../src/cards/latest-posts");
const fetchPosts = require("../src/fetchers/posts-fetcher");
import createLatestPostsCard from "../src/cards/latest-posts.js";
import fetchPosts from "../src/fetchers/posts-fetcher.js";

module.exports = async (req, res) => {
export default async (req, res) => {
const { name } = req.query;
res.setHeader("Content-Type", "image/svg+xml");
try {
Expand Down
4 changes: 2 additions & 2 deletions api/redirect.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const fetchPost = require("../src/fetchers/post-fetcher");
import fetchPost from "../src/fetchers/post-fetcher.js";

module.exports = async (req, res) => {
export default async (req, res) => {
const { name, tag } = req.query;
try {
const post = await fetchPost(name, tag);
Expand Down
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@
"main": "./api/index.js",
"scripts": {
"start": "node ./api/index.js",
"dev": "vercel dev",
"dev:vercel": "vercel dev --debug",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "MIT",
"dependencies": {
"axios": "^0.21.4",
"express": "^4.17.1",
"graphql-request": "^3.4.0"
"@napi-rs/canvas": "^0.1.44",
"axios": "^1.5.1",
"graphql-request": "^6.1.0"
},
"type": "commonjs"
"type": "module",
"devDependencies": {}
}
45 changes: 19 additions & 26 deletions src/cards/latest-posts.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { escapeHtml } from "../utils/index.js";

const createLatestCardTitle = (username) => {
return `
<g data-testid="card-title" transform="translate(25, 35)">
Expand All @@ -9,37 +11,28 @@ const createLatestCardTitle = (username) => {
};

const createLatestCardBody = ({ posts }) => {
const post_urls = posts.map(
const postUrls = posts.map(
(post) => `https://velog.io/@${post.user.username}/` + post.url_slug
);

return `
<g data-testid="main-card-body" transform="translate(0, 45)">
<svg data-testid="lang-items" x="25" width="400" height="400" viewBox="0 0 400 400">
<g transform="translate(0, 0)">
<text data-testid="lang-list" class="list-style" x="5" y="20">•</text>
<a href="${post_urls[0]}">
<text data-testid="lang-name" x="20" y="20" class="log-title">${
posts[0]?.title || "-"
}</text>
</a>
<text data-testid="lang-list" class="list-style" x="5" y="43">•</text>
<a href="${post_urls[1]}">
<text data-testid="lang-name" x="20" y="43" class="log-title">${
posts[1]?.title || "-"
}</text>
</a>
<text data-testid="lang-list" class="list-style" x="5" y="66">•</text>
<a href="${post_urls[2]}">
<text data-testid="lang-name" x="20" y="66" class="log-title">${
posts[2]?.title || "-"
}</text>
</a>
<text data-testid="lang-list" class="list-style" x="5" y="89">•</text>
<a href="${post_urls[3]}">
<text data-testid="lang-name" x="20" y="89" class="log-title">${
posts[3]?.title || "-"
}</text>
</a>
${postUrls.map((url, index) => {
return `
<text data-testid="lang-list" class="list-style" x="5" y="${
20 + index * 23
}">•</text>
<a href="${url}">
<text data-testid="lang-name" x="20" y="${
20 + index * 23
}" class="log-title">${
escapeHtml(posts[index]?.title) || "-"
}</text>
</a>
`;
})}
</g>
</svg>
</g>
Expand Down Expand Up @@ -73,4 +66,4 @@ const createLatestCard = (data) => {
`;
};

module.exports = createLatestCard;
export default createLatestCard;
14 changes: 7 additions & 7 deletions src/cards/new-log-black.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { koCheck, replaceAll } = require("../utils");
import { koCheck, replaceAll } from "../utils/index.js";

const createCardTitle = (username, likes) => {
const likeX = likes > 99 ? 365 : likes > 9 ? 370 : 380;
Expand All @@ -20,11 +20,11 @@ const createCardBody = ({ title, short_description }) => {
<g data-testid="main-card-body" transform="translate(0, 45)">
<svg data-testid="lang-items" x="25" width="400" height="40" viewBox="0 0 400 40">
<g transform="translate(0, 0)">
<text data-testid="lang-name" x="2" y="15" class="log-title">${title}</text>
<text ata-testid="lang-description" x="2" y="35" class="log-description">${replaceAll(
short_description,
"<",
"&lt;"
<text data-testid="lang-name" x="2" y="15" class="log-title">${escapeHtml(
title
)}</text>
<text ata-testid="lang-description" x="2" y="35" class="log-description">${escapeHtml(
short_description
)}</text>
</g>
</svg>
Expand Down Expand Up @@ -85,4 +85,4 @@ const createCardDark = (data) => {
`;
};

module.exports = createCardDark;
export default createCardDark;
14 changes: 7 additions & 7 deletions src/cards/new-log.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { koCheck, replaceAll } = require("../utils");
import { koCheck, escapeHtml, replaceAll } from "../utils/index.js";

const createCardTitle = (username, likes) => {
const likeX = likes > 99 ? 365 : likes > 9 ? 370 : 380;
Expand All @@ -20,11 +20,11 @@ const createCardBody = ({ title, short_description }) => {
<g data-testid="main-card-body" transform="translate(0, 45)">
<svg data-testid="lang-items" x="25" width="400" height="40" viewBox="0 0 400 40">
<g transform="translate(0, 0)">
<text data-testid="lang-name" x="2" y="15" class="log-title">${title}</text>
<text ata-testid="lang-description" x="2" y="35" class="log-description">${replaceAll(
short_description,
"<",
"&lt;"
<text data-testid="lang-name" x="2" y="15" class="log-title">${escapeHtml(
title
)}</text>
<text ata-testid="lang-description" x="2" y="35" class="log-description">${escapeHtml(
short_description
)}</text>
</g>
</svg>
Expand Down Expand Up @@ -85,4 +85,4 @@ const createCard = (data) => {
`;
};

module.exports = createCard;
export default createCard;
25 changes: 17 additions & 8 deletions src/cards/velog-badge.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
import { getTextWidth } from "../utils/index.js";

const createBadge = (name) => {
const size = name.length * 9;
const size = getTextWidth(name, "13px --apple-system") * 1.1;

const rectWidth = size + 16;
const rectX = 22;
const containerWidth = rectWidth + rectX;

return `
<svg width="117" height="34" viewBox="0 0 117 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<svg width="${containerWidth}" height="25" fill="none" xmlns="http://www.w3.org/2000/svg">
<style>
.name{ fill: #ffffff; font-weight: 500; font-size: 13px;}
</style>
<svg width="98" height="25" viewBox="0 0 98 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<g>
<rect x="22" width="${size}" height="25" fill="#20C997"/>
<text x="30" y="17" class="name">${name}</text>
<g>
<g fill="#20C997">
<rect x="${rectX}" width="${rectWidth}" height="25" />
<text x="${
rectX + 8
}" y="17" textLength="${size}" class="name">${name}</text>
</g>
<path d="M3.125 0H21.875C23.6009 0 25 1.39911 25 3.125V21.875C25 23.6009 23.6009 25 21.875 25H3.125C1.39911 25 0 23.6009 0 21.875V3.125C0 1.39911 1.39911 0 3.125 0Z" fill="#20C997"/>
<path d="M18.6199 8.526V7.54163C17.9949 7.3385 17.2605 7.11975 16.4167 6.88538C15.573 6.63538 15.0027 6.51038 14.7058 6.51038C14.0496 6.51038 13.6589 6.82288 13.5339 7.44788L12.0105 16.0963C11.5261 15.4557 11.1277 14.9166 10.8152 14.4791C10.3308 13.7916 9.8855 13.0026 9.47925 12.1119C9.05737 11.2213 8.84644 10.4244 8.84644 9.72131C8.84644 9.29944 8.96362 8.9635 9.198 8.7135C9.41675 8.44788 9.83081 8.11194 10.4402 7.70569C9.81519 6.90881 9.03393 6.51038 8.09643 6.51038C7.59644 6.51038 7.18237 6.65881 6.85425 6.95569C6.5105 7.25256 6.33862 7.69006 6.33862 8.26819C6.33862 9.23694 6.74487 10.4479 7.55737 11.901C8.35425 13.3385 9.89331 15.5026 12.1746 18.3932L14.4949 18.5573L16.2761 8.526H18.6199Z" fill="white"/>
</svg>
</g>
</svg>
`;
};

module.exports = createBadge;
export default createBadge;
4 changes: 2 additions & 2 deletions src/fetchers/post-fetcher.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { request } = require("../utils");
import { request } from "../utils/index.js";

const fetcher = (variables) => {
return request({
Expand Down Expand Up @@ -37,4 +37,4 @@ async function fetchPost(name, tag) {
}
}

module.exports = fetchPost;
export default fetchPost;
4 changes: 2 additions & 2 deletions src/fetchers/posts-fetcher.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { request } = require("../utils");
import { request } from "../utils/index.js";

const fetcher = (variables) => {
return request({
Expand Down Expand Up @@ -37,4 +37,4 @@ async function fetchPosts(name) {
}
}

module.exports = fetchPosts;
export default fetchPosts;
4 changes: 2 additions & 2 deletions src/fetchers/readpost-fetcher.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { request } = require("../utils");
import { request } from "../utils/index.js";

const fetcher = (variables) => {
return request({
Expand Down Expand Up @@ -37,4 +37,4 @@ async function fetchReadPost(name, slug) {
}
}

module.exports = fetchReadPost;
export default fetchReadPost;
37 changes: 28 additions & 9 deletions src/utils/index.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,40 @@
const axios = require("axios");
function request(data) {
import axios from "axios";
import canvas from "@napi-rs/canvas";

export function request(data) {
return axios({
url: "https://v2.velog.io/graphql",
method: "post",
data,
});
}
function koCheck(lang) {

export function koCheck(lang) {
var check = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/;
return check.test(lang);
}
function replaceAll(str, searchStr, replaceStr) {

export function replaceAll(str, searchStr, replaceStr) {
return str.split(searchStr).join(replaceStr);
}

module.exports = {
request,
koCheck,
replaceAll,
};
export function escapeHtml(text) {
const map = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#039;",
};
return text.replace(/[&<>"']/g, function (m) {
return map[m];
});
}

export function getTextWidth(text, font) {
const ctx = canvas.createCanvas(1, 1).getContext("2d");
ctx.font = font;
const textMetrics = ctx.measureText(text);

return textMetrics.width;
}
12 changes: 6 additions & 6 deletions vercel.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"redirects": [
{
"source": "/",
"destination": "https://github.com/eungyeole/velog-readme-stats"
}
]
"redirects": [
{
"source": "/",
"destination": "https://github.com/eungyeole/velog-readme-stats"
}
]
}
Loading