← back to browse
goat command

font

Stylish Font Converter

0
views
0
likes
0
installs

Aliases: f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20, f21, f22, f23, f24, f25, f26, f27, f28, f29, f30

raw source
module.exports = {
  config: {
    name: "font",

    aliases: [
      "f1", "f2", "f3", "f4", "f5",
      "f6", "f7", "f8", "f9", "f10",
      "f11", "f12", "f13", "f14", "f15",
      "f16", "f17", "f18", "f19", "f20",
      "f21", "f22", "f23", "f24", "f25",
      "f26", "f27", "f28", "f29", "f30"
    ],

    version: "1.0.0",
    author: "Mohammad Maruf",
    countDown: 2,
    role: 0,

    shortDescription: "Stylish Font Converter",

    longDescription:
      "Convert text into 30 different stylish font styles.",

    category: "tool",

    guide: {
      en: "f1 <text> - f30 <text>\nExample: f7 Hello Maruf"
    }
  },

  onStart: async function ({ api, event, args, message }) {

    // ==============================
    // Reaction
    // ==============================
    const react = async (emoji) => {
      try {
        await api.setMessageReaction(
          emoji,
          event.messageID,
          () => {}
        );
      } catch (e) {
        console.error("Reaction Error:", e);
      }
    };

    // ==============================
    // Detect f1 - f30
    // ==============================

    const body = String(event.body || "").trim();

    const match = body.match(
      /^(?:f)([1-9]|[12][0-9]|30)\b/i
    );

    let fontNumber;
    let text;

    // f1 Hello / f7 Maruf
    if (match) {

      fontNumber = parseInt(match[1]);

      text = body
        .replace(
          /^(?:f)([1-9]|[12][0-9]|30)\b/i,
          ""
        )
        .trim();

    }

    // font 1 Hello
    else if (
      args[0] &&
      args[0].toLowerCase() === "font"
    ) {

      fontNumber = parseInt(args[1]);

      text = args
        .slice(2)
        .join(" ")
        .trim();

    }

    else {

      await react("❌");

      return message.reply(
        `╭━━━〔 ❌ 𝐈𝐧𝐯𝐚𝐥𝐢𝐝 〕━━━╮
┃
┃ Use: f1 - f30
┃
┃ Example:
┃ ➤ f7 Hello Maruf
┃
╰━━━━━━━━━━━━━━━━╯`
      );
    }

    // ==============================
    // Check Font Number
    // ==============================

    if (
      !Number.isInteger(fontNumber) ||
      fontNumber < 1 ||
      fontNumber > 30
    ) {

      await react("❌");

      return message.reply(
        `❌ Invalid font number!

Available fonts:
f1 - f30`
      );
    }

    // ==============================
    // Check Text
    // ==============================

    if (!text) {

      await react("❌");

      return message.reply(
        `❌ Text দিতে হবে!

Example:
f${fontNumber} Hello Maruf`
      );
    }

    // ==============================
    // Convert
    // ==============================

    try {

      const result = convertFont(
        text,
        fontNumber
      );

      if (!result) {
        throw new Error("Conversion failed");
      }

      // SUCCESS REACTION
      await react("🔰");

      return message.reply(result);

    } catch (error) {

      console.error(
        "Font Conversion Error:",
        error
      );

      await react("⚠️");

      return message.reply(
        "❌ Font conversion failed!"
      );
    }
  }
};


// ==========================================
// FONT CONVERTER
// ==========================================

function convertFont(text, number) {

  switch (number) {

    // F1 — Bold
    case 1:
      return unicodeFont(
        text,
        0x1D400,
        0x1D41A,
        0x1D7CE
      );

    // F2 — Italic
    case 2:
      return unicodeFont(
        text,
        0x1D434,
        0x1D44E
      );

    // F3 — Bold Italic
    case 3:
      return unicodeFont(
        text,
        0x1D468,
        0x1D482
      );

    // F4 — Sans
    case 4:
      return unicodeFont(
        text,
        0x1D5A0,
        0x1D5BA,
        0x1D7E2
      );

    // F5 — Sans Bold
    case 5:
      return unicodeFont(
        text,
        0x1D5D4,
        0x1D5EE,
        0x1D7EC
      );

    // F6 — Sans Italic
    case 6:
      return unicodeFont(
        text,
        0x1D608,
        0x1D622
      );

    // F7 — Sans Bold Italic
    case 7:
      return unicodeFont(
        text,
        0x1D63C,
        0x1D656
      );

    // F8 — Monospace
    case 8:
      return unicodeFont(
        text,
        0x1D670,
        0x1D68A,
        0x1D7F6
      );

    // F9 — Double Struck
    case 9:
      return doubleStruck(text);

    // F10 — Fraktur
    case 10:
      return fraktur(text);

    // F11
    case 11:
      return `𝕭𝖔𝖑𝖉 ${fraktur(text)}`;

    // F12 — Script
    case 12:
      return script(text);

    // F13
    case 13:
      return script(text);

    // F14 — Circled
    case 14:
      return circled(text);

    // F15 — Parenthesized
    case 15:
      return parenthesized(text);

    // F16 — Fullwidth
    case 16:
      return fullwidth(text);

    // F17 — Small Caps
    case 17:
      return smallCaps(text);

    // F18 — Superscript
    case 18:
      return superscript(text);

    // F19 — Subscript
    case 19:
      return subscript(text);

    // F20 — Bubble
    case 20:
      return circled(text);

    // F21 — Square
    case 21:
      return square(text);

    // F22 — Negative Square
    case 22:
      return negativeSquare(text);

    // F23
    case 23:
      return `『${text}』`;

    // F24
    case 24:
      return `✦ ${text} ✦`;

    // F25
    case 25:
      return `꧁༺ ${text} ༻꧂`;

    // F26
    case 26:
      return `◆ ${text} ◆`;

    // F27
    case 27:
      return `➤ ${text} ➤`;

    // F28
    case 28:
      return `༺ ${text} ༻`;

    // F29
    case 29:
      return `☠︎ ${fraktur(text)} ☠︎`;

    // F30
    case 30:
      return `『𓆩 ${unicodeFont(
        text,
        0x1D400,
        0x1D41A,
        0x1D7CE
      )} 𓆪』`;

    default:
      return null;
  }
}


// ==========================================
// Unicode Font
// ==========================================

function unicodeFont(text, upper, lower, digit) {

  return [...text].map(char => {

    const code = char.codePointAt(0);

    if (
      upper &&
      code >= 65 &&
      code <= 90
    ) {
      return String.fromCodePoint(
        upper + code - 65
      );
    }

    if (
      lower &&
      code >= 97 &&
      code <= 122
    ) {
      return String.fromCodePoint(
        lower + code - 97
      );
    }

    if (
      digit &&
      code >= 48 &&
      code <= 57
    ) {
      return String.fromCodePoint(
        digit + code - 48
      );
    }

    return char;

  }).join("");
}


// ==========================================
// F9 — Double Struck
// ==========================================

function doubleStruck(text) {

  const map = {
    A:"𝔸",B:"𝔹",C:"ℂ",D:"𝔻",E:"𝔼",
    F:"𝔽",G:"𝔾",H:"ℍ",I:"𝕀",J:"𝕁",
    K:"𝕂",L:"𝕃",M:"𝕄",N:"ℕ",O:"𝕆",
    P:"ℙ",Q:"ℚ",R:"ℝ",S:"𝕊",T:"𝕋",
    U:"𝕌",V:"𝕍",W:"𝕎",X:"𝕏",
    Y:"𝕐",Z:"ℤ",

    a:"𝕒",b:"𝕓",c:"𝕔",d:"𝕕",e:"𝕖",
    f:"𝕗",g:"𝕘",h:"𝕙",i:"𝕚",j:"𝕛",
    k:"𝕜",l:"𝕝",m:"𝕞",n:"𝕟",o:"𝕠",
    p:"𝕡",q:"𝕢",r:"𝕣",s:"𝕤",t:"𝕥",
    u:"𝕦",v:"𝕧",w:"𝕨",x:"𝕩",
    y:"𝕪",z:"𝕫"
  };

  return [...text]
    .map(c => map[c] || c)
    .join("");
}


// ==========================================
// F10/F29 — Fraktur
// ==========================================

function fraktur(text) {

  const map = {
    A:"𝔄",B:"𝔅",C:"ℭ",D:"𝔇",E:"𝔈",
    F:"𝔉",G:"𝔊",H:"ℌ",I:"ℑ",J:"𝔍",
    K:"𝔎",L:"𝔏",M:"𝔐",N:"𝔑",O:"𝔒",
    P:"𝔓",Q:"𝔔",R:"ℜ",S:"𝔖",T:"𝔗",
    U:"𝔘",V:"𝔙",W:"𝔚",X:"𝔛",
    Y:"𝔜",Z:"ℨ",

    a:"𝔞",b:"𝔟",c:"𝔠",d:"𝔡",e:"𝔢",
    f:"𝔣",g:"𝔤",h:"𝔥",i:"𝔦",j:"𝔧",
    k:"𝔨",l:"𝔩",m:"𝔪",n:"𝔫",o:"𝔬",
    p:"𝔭",q:"𝔮",r:"𝔯",s:"𝔰",t:"𝔱",
    u:"𝔲",v:"𝔳",w:"𝔴",x:"𝔵",
    y:"𝔶",z:"𝔷"
  };

  return [...text]
    .map(c => map[c] || c)
    .join("");
}


// ==========================================
// F12 — Script
// ==========================================

function script(text) {

  const map = {
    A:"𝒜",B:"ℬ",C:"𝒞",D:"𝒟",E:"ℰ",
    F:"ℱ",G:"𝒢",H:"ℋ",I:"ℐ",J:"𝒥",
    K:"𝒦",L:"ℒ",M:"ℳ",N:"𝒩",O:"𝒪",
    P:"𝒫",Q:"𝒬",R:"ℛ",S:"𝒮",T:"𝒯",
    U:"𝒰",V:"𝒱",W:"𝒲",X:"𝒳",
    Y:"𝒴",Z:"𝒵",

    a:"𝒶",b:"𝒷",c:"𝒸",d:"𝒹",e:"ℯ",
    f:"𝒻",g:"ℊ",h:"𝒽",i:"𝒾",j:"𝒿",
    k:"𝓀",l:"𝓁",m:"𝓂",n:"𝓃",o:"ℴ",
    p:"𝓅",q:"𝓆",r:"𝓇",s:"𝓈",t:"𝓉",
    u:"𝓊",v:"𝓋",w:"𝓌",x:"𝓍",
    y:"𝓎",z:"𝓏"
  };

  return [...text]
    .map(c => map[c] || c)
    .join("");
}


// ==========================================
// F14 — Circled
// ==========================================

function circled(text) {

  return [...text].map(c => {

    const code = c.charCodeAt(0);

    if (code >= 65 && code <= 90) {
      return String.fromCodePoint(
        0x24B6 + code - 65
      );
    }

    if (code >= 97 && code <= 122) {
      return String.fromCodePoint(
        0x24D0 + code - 97
      );
    }

    return c;

  }).join("");
}


// ==========================================
// F15 — Parenthesized
// ==========================================

function parenthesized(text) {

  return [...text].map(c => {

    const code =
      c.toLowerCase().charCodeAt(0);

    if (code >= 97 && code <= 122) {
      return String.fromCodePoint(
        0x249C + code - 97
      );
    }

    return c;

  }).join("");
}


// ==========================================
// F16 — Fullwidth
// ==========================================

function fullwidth(text) {

  return [...text].map(c => {

    const code = c.charCodeAt(0);

    if (code >= 33 && code <= 126) {
      return String.fromCharCode(
        code + 0xFEE0
      );
    }

    if (c === " ") {
      return " ";
    }

    return c;

  }).join("");
}


// ==========================================
// F17 — Small Caps
// ==========================================

function smallCaps(text) {

  const map = {
    a:"ᴀ",b:"ʙ",c:"ᴄ",d:"ᴅ",e:"ᴇ",
    f:"ꜰ",g:"ɢ",h:"ʜ",i:"ɪ",j:"ᴊ",
    k:"ᴋ",l:"ʟ",m:"ᴍ",n:"ɴ",o:"ᴏ",
    p:"ᴘ",q:"ǫ",r:"ʀ",s:"ꜱ",t:"ᴛ",
    u:"ᴜ",v:"ᴠ",w:"ᴡ",x:"x",y:"ʏ",
    z:"ᴢ"
  };

  return [...text]
    .map(c => map[c.toLowerCase()] || c)
    .join("");
}


// ==========================================
// F18 — Superscript
// ==========================================

function superscript(text) {

  const map = {
    a:"ᵃ",b:"ᵇ",c:"ᶜ",d:"ᵈ",e:"ᵉ",
    f:"ᶠ",g:"ᵍ",h:"ʰ",i:"ⁱ",j:"ʲ",
    k:"ᵏ",l:"ˡ",m:"ᵐ",n:"ⁿ",o:"ᵒ",
    p:"ᵖ",r:"ʳ",s:"ˢ",t:"ᵗ",u:"ᵘ",
    v:"ᵛ",w:"ʷ",x:"ˣ",y:"ʸ",z:"ᶻ",
    0:"⁰",1:"¹",2:"²",3:"³",4:"⁴",
    5:"⁵",6:"⁶",7:"⁷",8:"⁸",9:"⁹"
  };

  return [...text]
    .map(c => map[c.toLowerCase()] || c)
    .join("");
}


// ==========================================
// F19 — Subscript
// ==========================================

function subscript(text) {

  const map = {
    a:"ₐ",e:"ₑ",h:"ₕ",i:"ᵢ",j:"ⱼ",
    k:"ₖ",l:"ₗ",m:"ₘ",n:"ₙ",o:"ₒ",
    p:"ₚ",r:"ᵣ",s:"ₛ",t:"ₜ",u:"ᵤ",
    v:"ᵥ",x:"ₓ",
    0:"₀",1:"₁",2:"₂",3:"₃",4:"₄",
    5:"₅",6:"₆",7:"₇",8:"₈",9:"₉"
  };

  return [...text]
    .map(c => map[c.toLowerCase()] || c)
    .join("");
}


// ==========================================
// F21 — Square
// ==========================================

function square(text) {

  const map = {
    A:"🅰",B:"🅱",C:"🅲",D:"🅳",E:"🅴",
    F:"🅵",G:"🅶",H:"🅷",I:"🅸",J:"🅹",
    K:"🅺",L:"🅻",M:"🅼",N:"🅽",O:"🅾",
    P:"🅿",Q:"🆀",R:"🆁",S:"🆂",T:"🆃",
    U:"🆄",V:"🆅",W:"🆆",X:"🆇",
    Y:"🆈",Z:"🆉"
  };

  return [...text]
    .map(c => map[c.toUpperCase()] || c)
    .join("");
}


// ==========================================
// F22 — Negative Square
// ==========================================

function negativeSquare(text) {

  const map = {
    A:"🅐",B:"🅑",C:"🅒",D:"🅓",E:"🅔",
    F:"🅕",G:"🅖",H:"🅗",I:"🅘",J:"🅙",
    K:"🅚",L:"🅛",M:"🅜",N:"🅝",O:"🅞",
    P:"🅟",Q:"🅠",R:"🅡",S:"🅢",T:"🅣",
    U:"🅤",V:"🅥",W:"🅦",X:"🅧",
    Y:"🅨",Z:"🅩"
  };

  return [...text]
    .map(c => map[c.toUpperCase()] || c)
    .join("");
}

View raw file