purgetss
Version:
A package that simplifies mobile app creation for Titanium developers.
160 lines (136 loc) • 7.2 kB
JavaScript
/* eslint-disable camelcase */
/**
* PurgeTSS v7.1.0 - Core Purger: Icon Fonts
* Icon font purging engines for FontAwesome, Material Icons, Material Symbols, Framework7
*
* COPIED from src/index.js during refactorization - NO CHANGES to logic.
*
* @since 7.1.0
* @author César Estrada
*/
import fs from 'fs'
import _ from 'lodash'
import chalk from 'chalk'
import * as helpers from '../../shared/helpers.js'
import { logger } from '../../shared/logger.js'
import { localStart, localFinish } from '../../cli/utils/cli-helpers.js'
import {
projectsFA_TSS_File,
srcFontAwesomeTSSFile,
srcMaterialIconsTSSFile,
srcMaterialSymbolsTSSFile,
srcFramework7FontTSSFile,
cwd
} from '../../shared/constants.js'
/**
* Purge FontAwesome classes - COPIED exactly from original purgeFontAwesome() function
* NO CHANGES to logic, preserving 100% of original functionality
*
* @param {Array} uniqueClasses - Array of unique class names found in XML files
* @param {Array} cleanUniqueClasses - Array of cleaned unique class names
* @returns {string} Purged FontAwesome CSS classes as string
*/
export function purgeFontAwesome(uniqueClasses, cleanUniqueClasses, debug = false) {
let fontAwesome = false
// check if fonts.tss exists and if it includes Font Awesome
if (fs.existsSync(`${cwd}/purgetss/styles/fonts.tss`)) {
const fontsTSS = fs.readFileSync(`${cwd}/purgetss/styles/fonts.tss`, 'utf8')
fontAwesome = fontsTSS.includes('Font Awesome')
}
if (!fontAwesome) {
let sourceFolder = ''
let purgedClasses = ''
let purgingMessage = ''
if (fs.existsSync(projectsFA_TSS_File)) {
sourceFolder = projectsFA_TSS_File
purgedClasses = '\n// Pro/Beta Font Awesome\n'
purgingMessage = `Purging ${chalk.yellow('Pro/Beta Font Awesome')} styles...`
} else {
sourceFolder = srcFontAwesomeTSSFile
purgedClasses = '\n// Default Font Awesome\n'
purgingMessage = 'Purging Default Font Awesome styles...'
}
purgedClasses += purgeFontIcons(sourceFolder, uniqueClasses, purgingMessage, cleanUniqueClasses, ['fa', 'fat', 'fas', 'fal', 'far', 'fab', 'fa-thin', 'fa-solid', 'fa-light', 'fa-regular', 'fa-brands', 'fontawesome', 'fontawesome-thin', 'fontawesome-solid', 'fontawesome-light', 'fontawesome-regular', 'fontawesome-brands'], debug)
return (purgedClasses === '\n// Pro/Beta Font Awesome\n' || purgedClasses === '\n// Default Font Awesome\n') ? '' : purgedClasses
}
return ''
}
/**
* Purge Material Icons classes - COPIED exactly from original purgeMaterialIcons() function
* NO CHANGES to logic, preserving 100% of original functionality
*
* @param {Array} uniqueClasses - Array of unique class names found in XML files
* @param {Array} cleanUniqueClasses - Array of cleaned unique class names
* @returns {string} Purged Material Icons CSS classes as string
*/
export function purgeMaterialIcons(uniqueClasses, cleanUniqueClasses, debug = false) {
let purgedClasses = '\n// Material Icons\n'
purgedClasses += purgeFontIcons(srcMaterialIconsTSSFile, uniqueClasses, 'Purging Material Icons styles...', cleanUniqueClasses, ['mi', 'mio', 'mir', 'mis', 'mit', 'material-icons', 'material-icons-round', 'material-icons-sharp', 'material-icons-two-tone', 'material-icons-outlined'], debug)
return (purgedClasses === '\n// Material Icons\n') ? '' : purgedClasses
}
/**
* Purge Material Symbols classes - COPIED exactly from original purgeMaterialSymbols() function
* NO CHANGES to logic, preserving 100% of original functionality
*
* @param {Array} uniqueClasses - Array of unique class names found in XML files
* @param {Array} cleanUniqueClasses - Array of cleaned unique class names
* @returns {string} Purged Material Symbols CSS classes as string
*/
export function purgeMaterialSymbols(uniqueClasses, cleanUniqueClasses, debug = false) {
let purgedClasses = '\n// Material Symbols\n'
purgedClasses += purgeFontIcons(srcMaterialSymbolsTSSFile, uniqueClasses, 'Purging Material Symbols styles...', cleanUniqueClasses, ['ms', 'msr', 'mss', 'mso', 'materialsymbol', 'materialsymbol-rounded', 'materialsymbol-sharp', 'materialsymbol-outlined', 'material-symbol', 'material-symbol-rounded', 'material-symbol-sharp', 'material-symbol-outlined'], debug)
return (purgedClasses === '\n// Material Symbols\n') ? '' : purgedClasses
}
/**
* Purge Framework7 classes - COPIED exactly from original purgeFramework7() function
* NO CHANGES to logic, preserving 100% of original functionality
*
* @param {Array} uniqueClasses - Array of unique class names found in XML files
* @param {Array} cleanUniqueClasses - Array of cleaned unique class names
* @returns {string} Purged Framework7 CSS classes as string
*/
export function purgeFramework7(uniqueClasses, cleanUniqueClasses, debug = false) {
let purgedClasses = '\n// Framework7\n'
purgedClasses += purgeFontIcons(srcFramework7FontTSSFile, uniqueClasses, 'Purging Framework7 Icons styles...', cleanUniqueClasses, ['f7', 'f7i', 'framework7'])
return (purgedClasses === '\n// Framework7\n') ? '' : purgedClasses
}
/**
* Purge font icons from source file - COPIED exactly from original purgeFontIcons() function
* NO CHANGES to logic, preserving 100% of original functionality
*
* @param {string} sourceFolder - Path to source TSS file
* @param {Array} uniqueClasses - Array of unique class names found in XML files
* @param {string} message - Message to display during purging
* @param {Array} cleanUniqueClasses - Array of cleaned unique class names
* @param {Array} _prefixes - Array of icon prefixes (not used in original)
* @returns {string} Purged icon CSS classes as string
*/
export function purgeFontIcons(sourceFolder, uniqueClasses, message, cleanUniqueClasses, _prefixes, debug = false) {
if (debug) localStart()
let purgedClasses = ''
const sourceTSS = fs.readFileSync(sourceFolder, 'utf8')
const hasMatches = cleanUniqueClasses.some(element => sourceTSS.includes(`'.${element}'`))
if (hasMatches) {
// In debug mode the label is emitted by localFinish inline with the timing.
// In non-debug mode this is the progress indicator (only shown when there's
// actual work for this font, matching pre-existing behavior).
if (!debug) logger.info(message)
const sourceTSSFile = sourceTSS.split(/\r?\n/)
uniqueClasses.forEach(className => {
const cleanClassName = cleanClassNameFn(className)
if (sourceTSS.includes(`'.${cleanClassName}'`)) {
const newLine = _.filter(sourceTSSFile, s => s.indexOf(`'.${cleanClassName}'`) !== -1)[0]
purgedClasses += helpers.checkPlatformAndDevice(newLine, className)
}
})
}
if (debug) localFinish(message)
return purgedClasses
}
/**
* Clean class name by removing platform and modifier prefixes
* COPIED exactly from original cleanClassNameFn() function
*/
function cleanClassNameFn(className) {
return className.replace('ios:', '').replace('android:', '').replace('handheld:', '').replace('tablet:', '').replace('children:', '').replace('child:', '').replace('open:', '').replace('close:', '').replace('complete:', '').replace('drag:', '').replace('drop:', '').replace('bounds:', '')
}