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

zume

v2.2.2-beta.1

Published

Static site generator with gulp

Downloads

26

Readme

ZUME

An opinionated static-site generator with gulp.

Directory structure:

root/
    |_ gulpfile.js
    |_ package.json
    |_ src/
        |_ css
        |_ js
        |_ img
        |_ data
        |_ templates
    |_ build/

Quick start:

Only for simple cases without configuration you can use the CLI to start and run a new project:

npm i zume -g
mkdir my-project
cd my-project
zume init
zume server

Using with gulp

Example of the gulpfile.js:

const zume = require('zume').create();
const gulp = zume.gulp();

gulp.task('clear', () => zume.clear());

gulp.task('html', () => 
    zume.html()
        .frontMatter()
        .markdown()
        .permalink()
        .navigation()
        .ejs()
        .urls()
            .fork(f => f.path.contains('example'))
            .pipe(action1)
            .pipe(action2)
            .merge()
        .dest()
);

gulp.task('js', () => zume.js().webpack().dest());
gulp.task('css', () => zume.css().postcss().dest());
gulp.task('img', () => zume.img().dest(done));

gulp.task('default', gulp.series('clear', 'html', 'js', 'css', 'img'));
gulp.task('server', gulp.series('default', () => zume.serve()));

API

First, you have to create a zume instance passing the config data. Use the static function create() for this purpose:

const zume = require('zume').create()

The full list of available settings:

Name | Default | Description -----|---------|------------ dev | true | If it's in dev environment or not url | "http://localhost" | The full url of the site cwd | process.cwd() | The working directory src | "src" | The directory with the source files dest | "build" | The directory in which generate the static site server | [object] | The browser-sync server options

The zume instance provides the following functions:

Name | Description -----|------------ zume.gulp() | Returns the gulp instance used by zume. zume.path() | Returns any path of the project. For example: zume.path('foo') returns "/path/to/project/foo". zume.src() | Returns any path of the src folder. For example: zume.src('foo') returns "/path/to/project/src/foo". zume.dest() | Returns any path of the build folder. For example: zume.src('img') returns "/path/to/project/build/img". zume.url() | Returns a public url path. For example: zume.url('foo') returns "/foo". zume.fullUrl() | Returns a public full url path. For example: zume.fullUrl('foo') returns "http://example.com/foo". zume.serve() | Init a new http server using browsersync. zume.clear() | Removes de build folder.

Task

Zume contains the tasks html, css, js, img and files. To create a task, just need to do the following:

const html = zume.html(options);

Available options:

Name | Description -----|------------- task | The gulp task name used to relaunch by the watcher. The default value in html is html, css is css, and so on. src | Absolute directory where are the src files (by default is zume.src()) base | Relative directory to src and dest used to search for files and output the result. pattern | The pattern used to search files. The default value in html is data/**/*.md, in css is *.css, etc. watchPattern | Additional patterns added to the watcher.

There are some functions available in all tasks:

  • .pipe(plugin) Allow to pipe more gulp plugins to the stream
  • .each(callback) To execute a callback for each file
  • .filter(callback) To filter some files
  • .fork(callback) To filter some files and create a different fork with them
  • .add(options) To create a new stream task ready to merge it in the main stream.
  • .dest() To save the files in the build folder and return a promise.

Example:

zume.html()         // Get the markdown files
    .frontMatter()  // Extract the frontmatter
    .markdown()     // Render the markdown
        .add({      // Add new yaml files
            pattern: 'data/*.yaml'
        })
        .yaml()     // Parse the yaml
        .merge()    // Merge yaml and markdown files
    .permalink()    // Change the file names
        .fork(      // Fork the stream again filtering the files containing "about"
            f => f.path.contains('about')
        )
        .each(fn)   // Execute a function with these files
        .merge()    // Merge these files again with the main stream
    .ejs()          // Apply the templates
    .dest()         // Save to build folder

HTML Generation

To generate html pages, you need to create a html task and use some of its functions:

zume.html()
    .frontMatter()
    .markdown()
    .permalink()
    .ejs()
    .inline()
    .dest()

frontMatter

Handle the front matter of .md files using front-matter. In addition to the front matter, you can pass an object with common data to all files. Example:

html.frontMatter({
    siteName: 'My awesome site'
})

yaml

Handle the content of .yaml files. Useful if you don't need md files, just yaml content. You can pass an object with common data to all files. Example:

html.yaml({
    siteName: 'My awesome site'
})

markdown

Parse the content of the files as markdown using markdown-it. You can pass a function to configure the MarkdownIt instance:

html.markdown(md => md.set({ breaks: false }))

In addition to that, it also creates two variables: markdown and markdownInline that can be used in the templates to render markdown.

permalink

Renames the *.md files to */index.html in order to generate pretty urls. For example: the file about.md is renamed to about/index.html.

html.urls({
    pretty: false, //to rename "/about.md" to "/about.html" instead "/about/index.html"
})

navigation

Creates a tree structure with all files to build a navigation menu. Example:

html.navigation()
<html>
<body>
    <ul>
        <? nav.forEach(section => { ?>
        <li>
            <a href="<?= section.id ?>"><?= section.title ?></a>
        </li>
        <? }) ?>
    </ul>
</body>
</html>

Use the variable position to change the order of the elements.

You can override the default values of the sections:

html.navigation({
    override: {
        section1: {
            title: 'First section',
            position: 1
        }
        'section1/subsection3': {
            title: 'Subsection 3',
            position: 3
        }
    }
});

ejs

Build the html files using ejs. In addition to the front matter values, the templates have two more variables: content to return the file content and zume containing the instance of zume, that you can use to generate, for example, new urls. You can configure the options in the first argument. Example with the default options:

html.ejs({
    delimiter: '?'
})
<!DOCTYPE html>
<html>
<head>
    <title><?= title ?></title>
</head>
<body>
    <?- content ?>
    <a href="<?= zume.url('about') ?>">About us</a>
</body>
</html>

urls

Search and fix all relative urls in the html (a, img, link, script, source, etc...), to use the site url as base. Optionally, can makes all urls relative each other, allowing to execute the web directly from the file system (file: protocol). The configuration value index insert automatically a index.html at the end of the urls.

html.urls({
    pretty: false, //add "/index.html" to all links
    relative: true //makes the urls relatives to the current page
})

inline

To inline the tags containing the inline="true" attribute. Supports <script>, <link> and <img>

html.inline({
    rootpath: '/path/to/resources' //To define a custom sources path
    dest: true, //To get the sources from dest folder, instead src
})

cheerio

Run cheerio in all html pages. Useful to make changes in the html using the jQuery sintax.

html.cheerio($ => $('h1').addClass('text-title'));

//object with options
html.cheerio({
    parser: {
        normalizeWhitespace: true,
    },
    fn: function ($) {
        $('h1').addClass('text-title');
    }
})

JS

Task used to generate js content.

zume.js()
    .webpack(options)
    .dest();

webpack

Runs webpack to generate the javascript files. Example with the default configuration:

js.webpack({
    output: {
        filename: '[name].js'
    }
})

CSS

Task used to generate css content.

zume.css()
    .postcss()
    .dest();

postcss

Runs postcss to generate the css files, with the following plugins:

Img

Simple task used to handle img files:

zume.img().dest();

Files

Simple task used just to copy files:

zume.files({src: 'dir/to/files'}).dest();