Index: pkg/dartdoc/search.dart |
diff --git a/pkg/dartdoc/search.dart b/pkg/dartdoc/search.dart |
deleted file mode 100644 |
index 4061590ec588b97f476c7fdadc8144b9f0cb5500..0000000000000000000000000000000000000000 |
--- a/pkg/dartdoc/search.dart |
+++ /dev/null |
@@ -1,218 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/** |
- * [SearchText] represent the search field text. The text is viewed in three |
- * ways: [text] holds the original search text, used for performing |
- * case-sensitive matches, [lowerCase] holds the lower-case search text, used |
- * for performing case-insenstive matches, [camelCase] holds a camel-case |
- * interpretation of the search text, used to order matches in camel-case. |
- */ |
-class SearchText { |
- final String text; |
- final String lowerCase; |
- final String camelCase; |
- |
- SearchText(String searchText) |
- : text = searchText, |
- lowerCase = searchText.toLowerCase(), |
- camelCase = searchText.isEmpty() ? '' |
- : '${searchText.substring(0, 1).toUpperCase()}' |
- '${searchText.substring(1)}'; |
- |
- int get length => text.length; |
- |
- bool isEmpty() => length == 0; |
-} |
- |
-/** |
- * [StringMatch] represents the case-insensitive matching of [searchText] as a |
- * substring within a [text]. |
- */ |
-class StringMatch { |
- final SearchText searchText; |
- final String text; |
- final int matchOffset; |
- final int matchEnd; |
- |
- StringMatch(this.searchText, |
- this.text, this.matchOffset, this.matchEnd); |
- |
- /** |
- * Returns the HTML representation of the match. |
- */ |
- String toHtml() { |
- return '${text.substring(0, matchOffset)}' |
- '<span class="drop-down-link-highlight">$matchText</span>' |
- '${text.substring(matchEnd)}'; |
- } |
- |
- String get matchText => |
- text.substring(matchOffset, matchEnd); |
- |
- /** |
- * Is [:true:] iff [searchText] matches the full [text] case-sensitively. |
- */ |
- bool get isFullMatch => text == searchText.text; |
- |
- /** |
- * Is [:true:] iff [searchText] matches a substring of [text] |
- * case-sensitively. |
- */ |
- bool get isExactMatch => matchText == searchText.text; |
- |
- /** |
- * Is [:true:] iff [searchText] matches a substring of [text] when |
- * [searchText] is interpreted as camel case. |
- */ |
- bool get isCamelCaseMatch => matchText == searchText.camelCase; |
-} |
- |
-/** |
- * [Result] represents a match of the search text on a library, type or member. |
- */ |
-class Result { |
- final StringMatch prefix; |
- final StringMatch match; |
- |
- final String library; |
- final String type; |
- final String args; |
- final String kind; |
- final String url; |
- |
- TableRowElement row; |
- |
- Result(this.match, this.kind, this.url, |
- [this.library, this.type, String args, this.prefix]) |
- : this.args = args != null ? '<$args>' : ''; |
- |
- bool get isTopLevel => prefix == null && type == null; |
- |
- void addRow(TableElement table) { |
- if (row != null) return; |
- |
- clickHandler(Event event) { |
- window.location.href = url; |
- hideDropDown(); |
- } |
- |
- row = table.insertRow(table.rows.length); |
- row.classes.add('drop-down-link-tr'); |
- row.on.mouseDown.add((event) => hideDropDownSuspend = true); |
- row.on.click.add(clickHandler); |
- row.on.mouseUp.add((event) => hideDropDownSuspend = false); |
- var sb = new StringBuffer(); |
- sb.add('<td class="drop-down-link-td">'); |
- sb.add('<table class="drop-down-table"><tr><td colspan="2">'); |
- if (kind == GETTER) { |
- sb.add('get '); |
- } else if (kind == SETTER) { |
- sb.add('set '); |
- } |
- sb.add(match.toHtml()); |
- if (kind == CLASS || kind == INTERFACE || kind == TYPEDEF) { |
- sb.add(args); |
- } else if (kind == CONSTRUCTOR || kind == METHOD) { |
- sb.add('(...)'); |
- } |
- sb.add('</td></tr><tr><td class="drop-down-link-kind">'); |
- sb.add(kindToString(kind)); |
- if (prefix != null) { |
- sb.add(' in '); |
- sb.add(prefix.toHtml()); |
- sb.add(args); |
- } else if (type != null) { |
- sb.add(' in '); |
- sb.add(type); |
- sb.add(args); |
- } |
- |
- sb.add('</td><td class="drop-down-link-library">'); |
- if (library != null) { |
- sb.add('library $library'); |
- } |
- sb.add('</td></tr></table></td>'); |
- row.innerHTML = sb.toString(); |
- } |
-} |
- |
-/** |
- * Creates a [StringMatch] object for [text] if a substring matches |
- * [searchText], or returns [: null :] if no match is found. |
- */ |
-StringMatch obtainMatch(SearchText searchText, String text) { |
- if (searchText.isEmpty()) { |
- return new StringMatch(searchText, text, 0, 0); |
- } |
- int offset = text.toLowerCase().indexOf(searchText.lowerCase); |
- if (offset != -1) { |
- return new StringMatch(searchText, text, |
- offset, offset + searchText.length); |
- } |
- return null; |
-} |
- |
-/** |
- * Compares [a] and [b], regarding [:true:] smaller than [:false:]. |
- * |
- * [:null:]-values are not handled. |
- */ |
-int compareBools(bool a, bool b) { |
- if (a == b) return 0; |
- return a ? -1 : 1; |
-} |
- |
-/** |
- * Used to sort the search results heuristically to show the more relevant match |
- * in the top of the dropdown. |
- */ |
-int resultComparator(Result a, Result b) { |
- // Favor top level entities. |
- int result = compareBools(a.isTopLevel, b.isTopLevel); |
- if (result != 0) return result; |
- |
- if (a.prefix != null && b.prefix != null) { |
- // Favor full prefix matches. |
- result = compareBools(a.prefix.isFullMatch, b.prefix.isFullMatch); |
- if (result != 0) return result; |
- } |
- |
- // Favor matches in the start. |
- result = compareBools(a.match.matchOffset == 0, |
- b.match.matchOffset == 0); |
- if (result != 0) return result; |
- |
- // Favor matches to the end. For example, prefer 'cancel' over 'cancelable' |
- result = compareBools(a.match.matchEnd == a.match.text.length, |
- b.match.matchEnd == b.match.text.length); |
- if (result != 0) return result; |
- |
- // Favor exact case-sensitive matches. |
- result = compareBools(a.match.isExactMatch, b.match.isExactMatch); |
- if (result != 0) return result; |
- |
- // Favor matches that do not break camel-case. |
- result = compareBools(a.match.isCamelCaseMatch, b.match.isCamelCaseMatch); |
- if (result != 0) return result; |
- |
- // Favor matches close to the begining. |
- result = a.match.matchOffset.compareTo(b.match.matchOffset); |
- if (result != 0) return result; |
- |
- if (a.type != null && b.type != null) { |
- // Favor short type names over long. |
- result = a.type.length.compareTo(b.type.length); |
- if (result != 0) return result; |
- |
- // Sort type alphabetically. |
- // TODO(4805): Use [:type.compareToIgnoreCase] when supported. |
- result = a.type.toLowerCase().compareTo(b.type.toLowerCase()); |
- if (result != 0) return result; |
- } |
- |
- // Sort match alphabetically. |
- // TODO(4805): Use [:text.compareToIgnoreCase] when supported. |
- return a.match.text.toLowerCase().compareTo(b.match.text.toLowerCase()); |
-} |