src_card.js

/**
 * @module Card
 * @requires constants
 * @requires functions
 */
import { CONSTANTS } from "./constants.js";
import { getLanguageColor, getTheme } from "./functions.js";

const { X_LEFT, X_RIGHT, Y_DOWN, MAX_GISTS, DEFAULT_THEME, DEFAULT_TITLE, CARD_WIDTH, CARD_HEIGHT } = CONSTANTS; // get constants

/**
 * Returns the card object
 * @function
 * @param {Object} query Query object
 * @param {string} query.theme Theme name
 * @param {number} query.n Number of gists to display
 * @param {string} query.title Title of the card
 * @param {Object[]} gists_response Gists response
 * @returns {Object} Card object
 */
export const getCard = (query, gists_response) => {
  const { theme = DEFAULT_THEME, n = MAX_GISTS, title = DEFAULT_TITLE } = query; // get query parameters
  let gists = []; // array of gists
  let x = X_LEFT; // x position of gist
  let y = 0; // y position of gist
  let i = 0; // counter
  let newLine = false; // new line flag

  gists_response.filter((gist) => gist.public).some((gist) => {
    let filename = Object.keys(gist.files)[0]; // gist filename
    let language = gist.files[filename].language; // gist language
    let lang_color = getLanguageColor(language); // gist language color

    gists.push({
      "filename": filename, // gist filename
      "language": language, // gist language
      "lang_color": lang_color, // gist language color
      "y" : y, // y position of gist
      "x" : x // x position of gist
    });

    if (x == X_LEFT && !newLine) {
      x = X_RIGHT; // x next position: right
      newLine = true;
    }
    else if (x == X_RIGHT && !newLine) {
      x = X_LEFT; // x next position: left
    }

    if (newLine) {
      newLine = false; // next position same line
    }
    else {
      y += Y_DOWN; // y next position: down
    }

    i++; // increment counter

    return i == n; // stop iterating after n gists
  });

  let height = CARD_HEIGHT + y;
  height = (i % 2 == 0) ? height - Y_DOWN : height; // height of the card

  return { // card
    "theme": getTheme(theme), // theme
    "gists": gists,
    "value": {
      "title": title || DEFAULT_TITLE,
      "height": height,
      "width": CARD_WIDTH
    }
  };
};