Git Product home page Git Product logo

pithy's Introduction

Pithy.js

An internal DSL for generating HTML in JavaScript.

Examples

Basic elements

html.div('#main', [
    html.h1(null, 'Hello, world!'),
    html.img({src: 'foo.jpg'})
]);
<div id="main">
    <h1>Hello, world!</h1>
    <img src="foo.jpg"/>
</div>

Loops etc.

Using Underscore.js or similar:

function todoItem(item) {
    return html.li({rel: item.id}, [
        html.div('.title', item.title),
        html.button('.destroy', 'delete')
    ]);
}

function todoList(list) {
    return html.ul('.todo-list', _.map(list, todoItem));
}

todoList([
    {id: 1, title: 'item one'},
    {id: 2, title: 'item two'},
    {id: 3, title: 'item three'}
]);
<ul class="todo-list">
    <li rel="1">
        <div class="title">item one</div>
        <button class="destroy">delete</button>
    </li>
    <li rel="2">
        <div class="title">item two</div>
        <button class="destroy">delete</button>
    </li>
    <li rel="3">
        <div class="title">item three</div>
        <button class="destroy">delete</button>
    </li>
</div>

Why use an internal DSL?

  • It's a more convenient and safer alternative to string contatenation
  • Very flexible, you can use all the power of JavaScript functions and control structures
  • For small bits of HTML you might not want to switch contexts from code to a template
  • Easier to debug than a templating engine
  • You get full tool-chain support:
    • editor support: syntax highlighting, code tools etc etc
    • code analyzers: jslint, jshint
    • testing/coverage tools

When to use?

  • Consider using where you might currently use string concatenation
  • Avoid using for large HTML documents or in places where speed is critical
  • Good for small snippets used for client-side page updates
  • Bad for generating huge amounts of HTML on the server

Usage

I like to alias the 'pithy' library as 'html':

var html = require('pithy');

You can then just use html.tagname as a function to create the appropriate element. Please note, you actually get a html.SafeString object back, not a native JavaScript String. This might mess up your isString() tests. If you have a workaround please send a pull-request.

There is also a html.escape() function for escaping HTML (returns a html.SafeString). It will not escape a value that is already a html.SafeString object.

pithy's People

Contributors

marksteve avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pithy's Issues

async and defer attributes

Hi,

Is there a way to generate non-value attributes, for example for

<script src="..." async></script>

Aside, from this, great module

Cannot find pithy after local install

Trying a simple example, have an error at require call. Is the package.json correct?
Using node 0.8

L:\examples\js\nodePithy>npm i pithy
npm http GET https://registry.npmjs.org/pithy
npm http 304 https://registry.npmjs.org/pithy
[email protected] node_modules\pithy

L:\examples\js\nodePithy>node

require('pithy')
Error: Cannot find module 'pithy'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at repl:1:2
at REPLServer.self.eval (repl.js:111:21)
at Interface. (repl.js:250:12)
at Interface.EventEmitter.emit (events.js:93:17)
at Interface._onLine (readline.js:199:10)
at Interface._line (readline.js:517:8)

Passing SafeString as content

Doesn't work:

> pithy.button('.button', new pithy.SafeString('string'))
g.SafeString {_value: "<button class="button"></button>", toString: function, valueOf: function}

Works:

> pithy.button('.button', [new pithy.SafeString('string')])
g.SafeString {_value: "<button class="button">string</button>", toString: function, valueOf: function}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.