Unverified Commit 1a3edcaa authored by Julian Holfeld's avatar Julian Holfeld Committed by GitHub
Browse files

feat: hide wakatime languages (#1212)



* feat: added option to hide languages

* feat: recalculate percentages for hidden languages

* refactor: reverted langs_count and did some formatting

* doc: added hide to readme

* feat: make languages var mutable and improve filter logic

Co-authored-by: default avatarAdrian Kunz <clashsoft@hotmail.com>

* refactor: improve code and added tests

Co-authored-by: default avatarAdrian Kunz <clashsoft@hotmail.com>
Co-authored-by: default avatarAnurag <hazru.anurag@gmail.com>
parent 8f316346
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ const {
  renderError,
  parseBoolean,
  clampValue,
  parseArray,
  CONSTANTS,
  isLocaleAvailable,
} = require("../src/common/utils");
@@ -26,6 +27,7 @@ module.exports = async (req, res) => {
    locale,
    layout,
    langs_count,
    hide,
    api_domain,
    range,
    border_radius,
@@ -58,6 +60,7 @@ module.exports = async (req, res) => {
        custom_title,
        hide_title: parseBoolean(hide_title),
        hide_border: parseBoolean(hide_border),
        hide: parseArray(hide),
        line_height,
        title_color,
        icon_color,
+1 −0
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@ You can provide multiple comma-separated values in bg_color option to render a g

#### Wakatime Card Exclusive Options:

- `hide` - Hide the languages specified from the card _(Comma-separated values)_
- `hide_title` - _(boolean)_
- `line_height` - Sets the line-height between text _(number)_
- `hide_progress` - Hides the progress bar and percentage _(boolean)_
+6 −3
Original line number Diff line number Diff line
@@ -2,15 +2,18 @@ const Card = require("../common/Card");
const I18n = require("../common/I18n");
const { langCardLocales } = require("../translations");
const { createProgressNode } = require("../common/createProgressNode");
const { clampValue, getCardColors, flexLayout } = require("../common/utils");
const {
  clampValue,
  getCardColors,
  flexLayout,
  lowercaseTrim,
} = require("../common/utils");

const DEFAULT_CARD_WIDTH = 300;
const DEFAULT_LANGS_COUNT = 5;
const DEFAULT_LANG_COLOR = "#858585";
const CARD_PADDING = 25;

const lowercaseTrim = (name) => name.toLowerCase().trim();

const createProgressTextNode = ({ width, color, name, progress }) => {
  const paddingRight = 95;
  const progressTextX = width - paddingRight + 10;
+52 −26
Original line number Diff line number Diff line
@@ -4,7 +4,12 @@ const { getStyles } = require("../getStyles");
const { wakatimeCardLocales } = require("../translations");
const languageColors = require("../common/languageColors.json");
const { createProgressNode } = require("../common/createProgressNode");
const { clampValue, getCardColors, flexLayout } = require("../common/utils");
const {
  clampValue,
  getCardColors,
  flexLayout,
  lowercaseTrim,
} = require("../common/utils");

const noCodingActivityNode = ({ color, text }) => {
  return `
@@ -72,23 +77,36 @@ const createTextNode = ({

  return `
    <g class="stagger" style="animation-delay: ${staggerDelay}ms" transform="translate(25, 0)">
      <text class="stat bold" y="12.5">${label}:</text>
      <text class="stat bold" y="12.5" data-testid="${id}">${label}:</text>
      <text
        class="stat"
        x="${hideProgress ? 170 : 350}"
        y="12.5"
        data-testid="${id}"
      >${value}</text>
      ${cardProgress}
    </g>
  `;
};

const recalculatePercentages = (languages) => {
  // recalculating percentages so that,
  // compact layout's progress bar does not break when hiding languages
  const totalSum = languages.reduce(
    (totalSum, language) => totalSum + language.percent,
    0,
  );
  const weight = (100 / totalSum).toFixed(2);
  languages.forEach((language) => {
    language.percent = (language.percent * weight).toFixed(2);
  });
};

const renderWakatimeCard = (stats = {}, options = { hide: [] }) => {
  const { languages } = stats;
  let { languages } = stats;
  const {
    hide_title = false,
    hide_border = false,
    hide,
    line_height = 25,
    title_color,
    icon_color,
@@ -104,6 +122,15 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => {
    border_color,
  } = options;

  const shouldHideLangs = Array.isArray(hide) && hide.length > 0;
  if (shouldHideLangs) {
    const languagesToHide = new Set(hide.map((lang) => lowercaseTrim(lang)));
    languages = languages.filter(
      (lang) => !languagesToHide.has(lowercaseTrim(lang.name)),
    );
    recalculatePercentages(languages);
  }

  const i18n = new I18n({
    locale,
    translations: wakatimeCardLocales,
@@ -195,8 +222,7 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => {
  } else {
    finalLayout = flexLayout({
      items: filteredLanguages.length
        ? filteredLanguages
          .map((language) => {
        ? filteredLanguages.map((language) => {
            return createTextNode({
              id: language.name,
              label: language.name,
+2 −0
Original line number Diff line number Diff line
@@ -230,6 +230,7 @@ function measureText(str, fontSize = 10) {
      .reduce((cur, acc) => acc + cur) * fontSize
  );
}
const lowercaseTrim = (name) => name.toLowerCase().trim();

module.exports = {
  renderError,
@@ -248,4 +249,5 @@ module.exports = {
  logger,
  CONSTANTS,
  CustomError,
  lowercaseTrim,
};
Loading