Skip to content

Configuration

Module Options

Configure the plugin in your nuxt.config.ts:

typescript
export default defineNuxtConfig({
  modules: ['@mitre/nuxt-smartscript'],
  
  smartscript: {
    // Enable/disable the plugin
    enabled: true,
    
    // SSR/SSG configuration (v0.4.0+)
    ssr: true,        // Enable server-side rendering
    client: true,     // Enable client-side processing
    
    // Customize positioning (in em units)
    positioning: {
      trademark: {
        body: '-0.5em',      // ™ in body text
        headers: '-0.7em',   // ™ in headers
        fontSize: '0.8em'
      },
      registered: {
        body: '-0.25em',     // ® in body text  
        headers: '-0.45em',  // ® in headers
        fontSize: '0.8em'
      }
    },
    
    // Performance settings
    performance: {
      debounce: 100,      // Debounce delay in ms
      batchSize: 50,      // Process in batches
      delay: 1500         // Initial delay for hydration
    },
    
    // Customize CSS class names (optional)
    cssClasses: {
      superscript: 'custom-sup',    // Default: 'ss-sup'
      subscript: 'custom-sub',      // Default: 'ss-sub'
      trademark: 'custom-tm',       // Default: 'ss-tm'
      registered: 'custom-reg',     // Default: 'ss-reg'
      ordinal: 'custom-ord',        // Default: 'ss-ordinal'
      math: 'custom-math'           // Default: 'ss-math'
    },
    
    // Enable/disable specific transformations (optional)
    transformations: {
      trademark: true,    // Transform (TM) and ™
      registered: true,   // Transform (R) and ®
      copyright: true,    // Transform (C) and ©
      ordinals: true,     // Transform 1st, 2nd, etc.
      chemicals: true,    // Transform H2O, CO2, etc.
      mathSuper: true,    // Transform x^2, E=mc^2
      mathSub: true       // Transform x_1, x_n
    }
  }
})

Custom Patterns (Advanced)

For advanced users, you can override the default regex patterns with custom ones. This allows you to:

  • Handle special cases specific to your content
  • Add support for new pattern types
  • Restrict patterns to more specific formats

⚠️ Warning

Custom patterns require regex knowledge. Invalid patterns will fall back to defaults with a warning.

Custom Pattern Examples

Restrict Trademark to Specific Format

typescript
export default defineNuxtConfig({
  smartscript: {
    customPatterns: {
      // Only match (TM) in parentheses, not standalone TM
      trademark: '\\(TM\\)'
    }
  }
})

Extended Ordinal Support

typescript
export default defineNuxtConfig({
  smartscript: {
    customPatterns: {
      // Include Roman numerals: 1st, XXIst, IVth
      ordinals: '\\b(\\d+|[IVX]+)(st|nd|rd|th)\\b'
    }
  }
})

Specific Chemical Formulas

typescript
export default defineNuxtConfig({
  smartscript: {
    customPatterns: {
      // Only match water, carbon dioxide, and oxygen
      chemicals: '(H2O|CO2|O2)'
    }
  }
})

Custom Math Notation

typescript
export default defineNuxtConfig({
  smartscript: {
    customPatterns: {
      // Require whitespace before math notation
      mathSuper: '\\s([a-z])\\^(\\d+)',
      mathSub: '\\s([a-z])_(\\d+)'
    }
  }
})

Pattern Format

All custom patterns should be provided as strings (without regex delimiters):

  • ✅ Correct: '\\(TM\\)'
  • ❌ Wrong: /\(TM\)/g

The patterns will be compiled with the global flag (g) automatically.

Combining with Transformations

You can combine custom patterns with transformation toggles:

typescript
export default defineNuxtConfig({
  smartscript: {
    // Disable ordinals
    transformations: {
      ordinals: false
    },
    // Custom trademark pattern
    customPatterns: {
      trademark: '\\bTM\\b'  // Only standalone TM
    }
  }
})

Transformation Control

You can selectively enable or disable specific transformation types. This is useful when you only need certain transformations or want to avoid conflicts with specific content.

Disable Specific Transformations

typescript
export default defineNuxtConfig({
  smartscript: {
    transformations: {
      // Only process trademark and registered symbols
      trademark: true,
      registered: true,
      copyright: true,
      // Disable all others
      ordinals: false,    // Won't transform 1st, 2nd, etc.
      chemicals: false,   // Won't transform H2O, CO2
      mathSuper: false,   // Won't transform x^2
      mathSub: false      // Won't transform x_1
    }
  }
})

Common Use Cases

Only process trademark and copyright symbols:

typescript
transformations: {
  trademark: true,
  registered: true,
  copyright: true,
  ordinals: false,
  chemicals: false,
  mathSuper: false,
  mathSub: false
}

Scientific Documents

Only process chemicals and math:

typescript
transformations: {
  trademark: false,
  registered: false,
  copyright: false,
  ordinals: false,
  chemicals: true,
  mathSuper: true,
  mathSub: true
}

Blog/General Content

Process everything except math (which might conflict with markdown):

typescript
transformations: {
  trademark: true,
  registered: true,
  copyright: true,
  ordinals: true,
  chemicals: true,
  mathSuper: false,  // Avoid conflicts with markdown
  mathSub: false     // Avoid conflicts with file_names
}

CSS Class Names

Default Classes

The plugin uses the following default CSS classes:

Element TypeDefault ClassSecondary ClassDescription
Superscriptss-sup-Base class for all superscript elements
Subscriptss-sub-Base class for all subscript elements
Trademarkss-supss-tmTrademark symbols (™, TM)
Registeredss-supss-regRegistered symbols (®, R)
Ordinalss-supss-ordinalOrdinal numbers (1st, 2nd, etc.)
Mathss-sup or ss-subss-mathMath notation (x^2, x_1)

Working with CSS Classes

The default CSS classes can be targeted in your stylesheets:

css
/* Target specific element types */
.ss-sup.ss-tm { /* Trademark symbols */ }
.ss-sup.ss-reg { /* Registered symbols */ }
.ss-sup.ss-ordinal { /* Ordinal numbers */ }
.ss-sup.ss-math { /* Math superscripts */ }
.ss-sub.ss-math { /* Math subscripts */ }
.ss-sub { /* Chemical formulas and subscripts */ }

Finding Elements in JavaScript

javascript
// Find all transformed elements
const trademarks = document.querySelectorAll('.ss-tm')
const registered = document.querySelectorAll('.ss-reg')
const ordinals = document.querySelectorAll('.ss-ordinal')
const mathElements = document.querySelectorAll('.ss-math')
const subscripts = document.querySelectorAll('.ss-sub')

CSS Customization

Override the default styles in your CSS:

css
/* Adjust all superscript elements */
sup.ss-sup {
  vertical-align: super;
  font-size: 0.75em;
  line-height: 0;
}

/* Customize trademark symbols specifically */
sup.ss-sup.ss-tm {
  font-size: 0.8em;
  position: relative;
  top: -0.1em;
}

/* Customize registered symbols */
sup.ss-sup.ss-reg {
  font-size: 0.8em;
}

/* Style ordinal numbers */
sup.ss-sup.ss-ordinal {
  font-size: 0.7em;
}

/* Different styles for headers */
h1 sup.ss-sup {
  font-size: 0.6em;
}

/* Customize subscript elements */
sub.ss-sub {
  vertical-align: sub;
  font-size: 0.75em;
  line-height: 0;
}

Excluding Elements

Using Data Attributes

Exclude specific elements from processing:

html
<!-- This content won't be processed -->
<div data-no-superscript>
  Keep (TM) and H2O as-is
</div>

Using CSS Classes

html
<!-- Add the no-superscript class -->
<p class="no-superscript">
  This text won't be transformed
</p>

Selectors

By default, the plugin processes:

  • main, article, section
  • .content, .prose
  • All heading tags (h1-h6)
  • Elements with role="main"

And excludes:

  • pre, code blocks
  • script, style tags
  • Elements with data-no-superscript
  • Elements with .no-superscript class
  • Automatically excluded: Elements already processed by the plugin (sup.ss-sup, sub.ss-sub)

Why Processed Elements are Excluded

The plugin automatically excludes its own generated <sup> and <sub> elements to prevent double-processing. This ensures that:

  • Text is only transformed once
  • Performance is optimized by skipping already-processed content
  • The plugin can safely run multiple times without creating nested elements

Apache 2.0 License