const { kFormatter, encodeHTML, getCardColors, FlexLayout, wrapTextMultiline, } = require("../src/utils"); const icons = require("./icons"); const toEmoji = require("emoji-name-map"); const Card = require("./Card"); const renderRepoCard = (repo, options = {}) => { const { name, nameWithOwner, description, primaryLanguage, stargazers, isArchived, isTemplate, forkCount, } = repo; const { title_color, icon_color, text_color, bg_color, show_owner, theme = "default_repocard", } = options; const header = show_owner ? nameWithOwner : name; const langName = (primaryLanguage && primaryLanguage.name) || "Unspecified"; const langColor = (primaryLanguage && primaryLanguage.color) || "#333"; const shiftText = langName.length > 15 ? 0 : 30; let desc = description || "No description provided"; // parse emojis to unicode desc = desc.replace(/:\w+:/gm, (emoji) => { return toEmoji.get(emoji) || ""; }); const multiLineDescription = wrapTextMultiline(desc); const descriptionLines = multiLineDescription.length; const lineHeight = 10; const height = (descriptionLines > 1 ? 120 : 110) + descriptionLines * lineHeight; // returns theme based colors with proper overrides and defaults const { titleColor, textColor, iconColor, bgColor } = getCardColors({ title_color, icon_color, text_color, bg_color, theme, }); const totalStars = kFormatter(stargazers.totalCount); const totalForks = kFormatter(forkCount); const getBadgeSVG = (label) => ` ${label} `; const svgLanguage = primaryLanguage ? ` ${langName} ` : ""; const iconWithLabel = (icon, label, testid) => { return ` ${icon} ${label} `; }; const svgStars = stargazers.totalCount > 0 && iconWithLabel(icons.star, totalStars, "stargazers"); const svgForks = forkCount > 0 && iconWithLabel(icons.fork, totalForks, "forkcount"); const starAndForkCount = FlexLayout({ items: [svgStars, svgForks], gap: 65, }).join(""); const card = new Card({ title: header, titlePrefixIcon: icons.contribs, width: 400, height, colors: { titleColor, textColor, iconColor, bgColor, }, }); card.disableAnimations(); card.setHideBorder(false); card.setHideTitle(false); card.setCSS(` .description { font: 400 13px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor} } .gray { font: 400 12px 'Segoe UI', Ubuntu, Sans-Serif; fill: ${textColor} } .icon { fill: ${iconColor} } .badge { font: 600 11px 'Segoe UI', Ubuntu, Sans-Serif; } .badge rect { opacity: 0.2 } `); return card.render(` ${ isTemplate ? getBadgeSVG("Template") : isArchived ? getBadgeSVG("Archived") : "" } ${multiLineDescription .map((line) => `${encodeHTML(line)}`) .join("")} ${svgLanguage} ${starAndForkCount} `); }; module.exports = renderRepoCard;