Skip to content

proxima812/Astro-ts-mastery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 

Repository files navigation

Astro getTaxonomy Slug auto(EN/RU)

import { getCollection } from "astro:content";
import { slug } from "github-slugger";
import slugify from "slugify";

export const customSlugify = (content) => {
  if (!content) return null;

  // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, содСрТит Π»ΠΈ строка русскиС символы
  const isRussian = /[Π°-яА-ЯЁё]/.test(content);

  if (isRussian) {
    // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ slugify для русских символов
    return slugify(content, { lower: true, strict: true, locale: "ru" });
  } else {
    // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ стандартный slug для английских символов
    return slug(content);
  }
};

// Ѐункция для прСобразования строки Π² slug
// export const slugify = (content) => {
//   if (!content) return null;
//   return slug(content);
// };

// Ѐункция для получСния страниц, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΈ ΠΈ страницы с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ID
export const getSinglePage = async (collection) => {
  const allPage = await getCollection(collection);
  const removeIndex = allPage.filter((data) => data.id.match(/^(?!-)/));
  const removeDrafts = removeIndex.filter((data) => !data.data.draft);
  return removeDrafts;
};

// Ѐункция для получСния всСх таксономий
export const getTaxonomy = async (collection, name) => {
  const singlePages = await getSinglePage(collection);
  const taxonomyPages = singlePages.map((page) => page.data[name]);
  let taxonomies = [];
  for (let i = 0; i < taxonomyPages.length; i++) {
    const categoryArray = taxonomyPages[i];
    for (let j = 0; j < categoryArray.length; j++) {
      // customSlugify <-> slugify
      taxonomies.push(customSlugify(categoryArray[j])); // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ customSlugify здСсь
    }
  }
  const taxonomy = [...new Set(taxonomies)];
  return taxonomy;
};

markdownify

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Markdown-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ тСкст Π² HTML. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ тСкст, написанный Π² Markdown, Π² Π²ΠΈΠ΄Π΅ HTML Π½Π° Π²Π΅Π±-страницС.

export const markdownify = (content: string) => {
  if (!content) return null;

  return marked.parseInline(content);
};

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

const markdownText = "# Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ\nΠ­Ρ‚ΠΎ *курсив* ΠΈ это **ΠΆΠΈΡ€Π½Ρ‹ΠΉ** тСкст.";
const htmlContent = markdownify(markdownText);
// Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "<h1>Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ</h1><p>Π­Ρ‚ΠΎ <em>курсив</em> ΠΈ это <strong>ΠΆΠΈΡ€Π½Ρ‹ΠΉ</strong> тСкст.</p>"

humanize

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ подчСркивания ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, Π² Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄, дСлая ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для отобраТСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Π² Π±ΠΎΠ»Π΅Π΅ понятной Ρ„ΠΎΡ€ΠΌΠ΅.

// humanize
export const humanize = (content: string) => {
  if (!content) return null;

  return content
    .replace(/^[\s_]+|[\s_]+$/g, "")
    .replace(/[_\s]+/g, " ")
    .replace(/^[a-z]/, function (m) {
      return m.toUpperCase();
    });
};

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

const codeName = "hello_world_example";
const humanizedName = humanize(codeName);
// Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "Hello world example"

plainify & htmlEntityDecoder

plainify & htmlEntityDecoder: Π£Π΄Π°Π»ΡΡŽΡ‚ HTML-Ρ‚Π΅Π³ΠΈ ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ HTML-сущности, прСвращая HTML-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ чистый тСкст ΠΈΠ· HTML, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для отобраТСния Π² тСкстовом Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΈΠ»ΠΈ для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

// plainify
export const plainify = (content: string) => {
  if (!content) return null;

  const filterBrackets = content.replace(/<\/?[^>]+(>|$)/gm, "");
  const filterSpaces = filterBrackets.replace(/[\r\n]\s*[\r\n]/gm, "");
  const stripHTML = htmlEntityDecoder(filterSpaces);
  return stripHTML;
};

// strip entities for plainify
const htmlEntityDecoder = (htmlWithEntities: string): string => {
  let entityList: { [key: string]: string } = {
    "&nbsp;": " ",
    "&lt;": "<",
    "&gt;": ">",
    "&amp;": "&",
    "&quot;": '"',
    "&#39;": "'",
  };
  let htmlWithoutEntities: string = htmlWithEntities.replace(
    /(&amp;|&lt;|&gt;|&quot;|&#39;)/g,
    (entity: string): string => {
      return entityList[entity];
    }
  );
  return htmlWithoutEntities;
};

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

const htmlContent = "<p>Hello <b>World</b> &amp; everyone!</p>";
const plainText = plainify(htmlContent);
// Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "Hello World & everyone!"

ВрСмя чтнСния ReadingTime.ts

// content reading
const readingTime = (content: string) => {
  const WPS = 275 / 60;

  let images = 0;
  const regex = /\w/;

  let words = content.split(" ").filter((word) => {
    if (word.includes("<img")) {
      images += 1;
    }
    return regex.test(word);
  }).length;

  let imageAdjust = images * 4;
  let imageSecs = 0;
  let imageFactor = 12;

  while (images) {
    imageSecs += imageFactor;
    if (imageFactor > 3) {
      imageFactor -= 1;
    }
    images -= 1;
  }

  const minutes = Math.ceil(((words - imageAdjust) / WPS + imageSecs) / 60);

  if (minutes < 10) {
    if (minutes < 2) {
      return "0" + minutes + ` Min read`;
    } else {
      return "0" + minutes + ` Mins read`;
    }
  } else {
    return minutes + ` Mins read`;
  }
};

export default readingTime;

Releases

No releases published

Packages

No packages published