npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

content-macros

v1.0.4

Published

Dynamic, customizable macros for your content.

Downloads

5

Readme

content-macros

Powerful content text macros.

Installing

NPM

npm install "content-macros"

GitHub

git clone "https://github.com/grumpygary/content-macros"

Use Case

While javascript template strings are wonderful in most cases, they're not well suited for content string macros. content-macros provides a way to implement and control content string macros with: string-replacement, nested macros (use macros to build macros), function sets, etc.

Syntax

import ContentMacros from "content-macros";
const macros = new ContentMacros()

macros.expand(stringToExpend,options);
// or
macros.expand(options); // { text, values, functions, ... }

Macro Syntax

Macros begin with {{ and end with }} (customizable). They may be nested to create interesting results. Macros objects may have a state, which can be overridden when expanded.

There are 2 types of macros, depending on parameters passed to .expand():

  • stateless: (default) if not state is active (during instantiation or overridden), options.functions are called without a state. If the first character is "=" or "." it is ignored.

  • stateful: If state is active, the first argument to each function is the state: -- if the first character is "=", a value result is returned (defaults to options.empty) -- if the first character is ".", "" is returned

Macro syntax examples

{{key,...args}}     // assumes no active state
{{=key,...args}}    // returns a value (whether stateless or stateful)
{{.key,...args}}    // no value if stateful, returns result otherwise

See tests/jest-tests.js in repo for examples.

Options

name          | type     | default         | description
--------------|----------|-----------------|-------------------------------------------------
bom           | string   | "{{"            | string marking beginning of macro
eom           | string   | "}}"            | string marking end of macro
separator     | string   | ","             | string used to split macro into arguments
functions     | object   |                 | dictionary of functions.  state or stateful
state         | boolean  |                 | if exists, is passed as first parameter to functions
nesting       | number   | 5               | max recursion depth
empty         | string   | ""              | what to return if expansion is empty
error         | bool     | false           | log error if value not found
warn          | bool     | false           | log warning if value not found
log           | bool     | false           | console.log items
debug         | bool     | false           | console.debug items

Notes

  • Functions in calls to expand() are ADDED to the functions used to intantiate the macro object. This allows for contextual functions.

  • "state" changes how macro function work. If using state, the state is passed as the first argument, followed by the arguments in the macro.

  • Be careful when using 'state'. Make sure you use either "{{.funcName}}" (return nothing) or "{{=funcName}}" (return value). They are optional otherwise.

Example

import ContentMacros from "ContentMacros";
// const ContentMacros = require("content-macros");

let options = {
    values: {
        greeting: "Hello",
    },
    functions: {
        say(...args) { 
            return `${args.join(" ")}!`
        }
    }
};
let contentMacros = new ContentMacros(options);

console.log(contentMacros.expand("{{say,{{greeting}},world}}"));
// "Hello world!"