mirror of
https://git.hmsn.ink/kospo/helptalk/api.git
synced 2026-03-20 18:23:32 +09:00
first
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
"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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user