summaryrefslogtreecommitdiff
path: root/deps/npm/lib/search.js
diff options
context:
space:
mode:
authorisaacs <i@izs.me>2011-12-13 18:53:02 -0800
committerisaacs <i@izs.me>2011-12-14 14:17:16 -0800
commitbb9316da28feaad035eb2f61aeafc5f1a7a57ae2 (patch)
tree2ee858b80a3819c3c1d10c96932637261f5f0ca2 /deps/npm/lib/search.js
parentf490934c33bdf134cfb24c6f26975a7e26d64953 (diff)
downloadandroid-node-v8-bb9316da28feaad035eb2f61aeafc5f1a7a57ae2.tar.gz
android-node-v8-bb9316da28feaad035eb2f61aeafc5f1a7a57ae2.tar.bz2
android-node-v8-bb9316da28feaad035eb2f61aeafc5f1a7a57ae2.zip
npm 1.1.0-beta-2
Diffstat (limited to 'deps/npm/lib/search.js')
-rw-r--r--deps/npm/lib/search.js73
1 files changed, 56 insertions, 17 deletions
diff --git a/deps/npm/lib/search.js b/deps/npm/lib/search.js
index 45e436a0c1..92f4319f58 100644
--- a/deps/npm/lib/search.js
+++ b/deps/npm/lib/search.js
@@ -82,13 +82,19 @@ function filter (data, args, notArgs) {
}
function stripData (data) {
- return { name:data.name
- , description:npm.config.get("description") ? data.description : ""
- , maintainers:(data.maintainers || []).map(function (m) {
+ return { name: data.name
+ , description: npm.config.get("description") ? data.description : ""
+ , maintainers: (data.maintainers || []).map(function (m) {
return "=" + m.name
})
- , url:!Object.keys(data.versions || {}).length ? data.url : null
- , keywords:data.keywords || []
+ , url: !Object.keys(data.versions || {}).length ? data.url : null
+ , keywords: data.keywords || []
+ , time: data.time
+ && data.time.modified
+ && (new Date(data.time.modified).toISOString()
+ .split("T").join(" ")
+ .replace(/:[0-9]{2}\.[0-9]{3}Z$/, ""))
+ || "(prehistoric)"
}
}
@@ -108,16 +114,23 @@ function getWords (data) {
function filterWords (data, args, notArgs) {
var words = data.words
for (var i = 0, l = args.length; i < l; i ++) {
- if (words.indexOf(args[i]) === -1) {
- return false
- }
+ if (!match(words, args[i])) return false
}
for (var i = 0, l = notArgs.length; i < l; i ++) {
- if (words.indexOf(notArgs[i]) !== -1) return false
+ if (match(words, notArgs[i])) return false
}
return true
}
+function match (words, arg) {
+ if (arg.charAt(0) === "/") {
+ arg = arg.replace(/\/$/, "")
+ arg = new RegExp(arg.substr(1, arg.length - 1))
+ return words.match(arg)
+ }
+ return words.indexOf(arg) !== -1
+}
+
function prettify (data, args) {
try {
var tty = require("tty")
@@ -130,14 +143,24 @@ function prettify (data, args) {
// name, desc, author, keywords
var longest = []
, spaces
- , maxLen = [20, 60, 20, Infinity]
- , headings = ["NAME", "DESCRIPTION", "AUTHOR", "KEYWORDS"]
+ , maxLen = npm.config.get("description")
+ ? [20, 60, 20, 20, Infinity]
+ : [20, 20, 20, Infinity]
+ , headings = npm.config.get("description")
+ ? ["NAME", "DESCRIPTION", "AUTHOR", "DATE", "KEYWORDS"]
+ : ["NAME", "AUTHOR", "DATE", "KEYWORDS"]
, lines
+ , searchsort = (npm.config.get("searchsort") || "NAME").toLowerCase()
+ , sortFields = { name: 0
+ , description: 1
+ , author: 2
+ , date: 3
+ , keywords: 4 }
+ , searchRev = searchsort.charAt(0) === "-"
+ , sortField = sortFields[searchsort.replace(/^\-+/, "")]
lines = Object.keys(data).map(function (d) {
return data[d]
- }).filter(function (data) {
- return data.name
}).map(function (data) {
// turn a pkg data into a string
// [name,who,desc,targets,keywords] tuple
@@ -149,6 +172,7 @@ function prettify (data, args) {
var l = [ data.name
, data.description || ""
, data.maintainers.join(" ")
+ , data.time
, (data.keywords || []).join(" ")
]
l.forEach(function (s, i) {
@@ -162,6 +186,13 @@ function prettify (data, args) {
l[i] = l[i].replace(/\s+/g, " ")
})
return l
+ }).sort(function (a, b) {
+ // a and b are "line" objects of [name, desc, maint, time, kw]
+ var aa = a[sortField].toLowerCase()
+ , bb = b[sortField].toLowerCase()
+ return aa === bb ? 0
+ : aa < bb ? (searchRev ? 1 : -1)
+ : (searchRev ? -1 : 1)
}).map(function (line) {
return line.map(function (s, i) {
spaces = spaces || longest.map(function (n) {
@@ -173,8 +204,6 @@ function prettify (data, args) {
}
return s + spaces[i].substr(len)
}).join(" ").substr(0, cols).trim()
- }).sort(function (a, b) {
- return a === b ? 0 : a > b ? 1 : -1
}).map(function (line) {
// colorize!
args.forEach(function (arg, i) {
@@ -201,8 +230,18 @@ function addColorMarker (str, arg, i) {
var m = i % cl + 1
, markStart = String.fromCharCode(m)
, markEnd = String.fromCharCode(0)
- , pieces = str.toLowerCase().split(arg.toLowerCase())
+
+ if (arg.charAt(0) === "/") {
+ //arg = arg.replace(/\/$/, "")
+ return str.replace( new RegExp(arg.substr(1, arg.length - 1), "gi")
+ , function (bit) { return markStart + bit + markEnd } )
+
+ }
+
+ // just a normal string, do the split/map thing
+ var pieces = str.toLowerCase().split(arg.toLowerCase())
, p = 0
+
return pieces.map(function (piece, i) {
piece = str.substr(p, piece.length)
var mark = markStart
@@ -211,8 +250,8 @@ function addColorMarker (str, arg, i) {
p += piece.length + arg.length
return piece + mark
}).join("")
- return str.split(arg).join(mark)
}
+
function colorize (line) {
for (var i = 0; i < cl; i ++) {
var m = i + 1