mirror of
https://git.hmsn.ink/kospo/helptalk/api.git
synced 2026-03-20 06:13:35 +09:00
44 lines
1.7 KiB
JavaScript
44 lines
1.7 KiB
JavaScript
"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
|
|
}
|
|
}
|