UNPKG

mithril

Version:

A framework for building brilliant applications

44 lines (41 loc) 1.76 kB
"use strict" var parsePathname = require("./parse") // Compiles a template into a function that takes a resolved path (without query // strings) and returns an object containing the template parameters with their // parsed values. This expects the input of the compiled template to be the // output of `parsePathname`. Note that it does *not* remove query parameters // specified in the template. module.exports = function(template) { var templateData = parsePathname(template) var templateKeys = Object.keys(templateData.params) var keys = [] var regexp = new RegExp("^" + templateData.path.replace( // I escape literal text so people can use things like `:file.:ext` or // `:lang-:locale` in routes. This is all merged into one pass so I // don't also accidentally escape `-` and make it harder to detect it to // ban it from template parameters. /:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, function(m, key, extra) { if (key == null) return "\\" + m keys.push({k: key, r: extra === "..."}) if (extra === "...") return "(.*)" if (extra === ".") return "([^/]+)\\." return "([^/]+)" + (extra || "") } ) + "$") return function(data) { // First, check the params. Usually, there isn't any, and it's just // checking a static set. for (var i = 0; i < templateKeys.length; i++) { if (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]]) return false } // If no interpolations exist, let's skip all the ceremony if (!keys.length) return regexp.test(data.path) var values = regexp.exec(data.path) if (values == null) return false for (var i = 0; i < keys.length; i++) { data.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1]) } return true } }