• R/O
  • HTTP
  • SSH
  • HTTPS

pukiwiki: 提交


Commit MetaInfo

修訂d1aa1006226fb78e431c27a2749be183096edcc4 (tree)
時間2017-09-18 07:03:03
作者umorigu <umorigu@gmai...>
Commiterumorigu

Log Message

BugTrack/2433 Cancelable Search with search2 plugin

Change Summary

差異

--- a/plugin/search2.inc.php
+++ b/plugin/search2.inc.php
@@ -9,6 +9,9 @@
99 define('PLUGIN_SEARCH2_MAX_LENGTH', 80);
1010 define('PLUGIN_SEARCH2_MAX_BASE', 16); // #search(1,2,3,...,15,16)
1111
12+define('PLUGIN_SEARCH2_RESULT_RECORD_LIMIT', 500);
13+define('PLUGIN_SEARCH2_RESULT_RECORD_LIMIT_START', 100);
14+
1215 // Show a search box on a page
1316 function plugin_search2_convert()
1417 {
@@ -22,6 +25,8 @@ function plugin_search2_action()
2225
2326 $action = isset($vars['action']) ? $vars['action'] : '';
2427 $base = isset($vars['base']) ? $vars['base'] : '';
28+ $start_s = isset($vars['start']) ? $vars['start'] : '';
29+ $start_index = pkwk_ctype_digit($start_s) ? intval($start_s) : 0;
2530 $bases = array();
2631 if ($base !== '') {
2732 $bases[] = $base;
@@ -38,17 +43,19 @@ function plugin_search2_action()
3843 }
3944 } else if ($action === 'query') {
4045 $text = isset($vars['q']) ? $vars['q'] : '';
41- plugin_search2_do_search($text, $base);
46+ plugin_search2_do_search($text, $base, $start_index);
4247 exit;
4348 }
4449 }
4550
46-function plugin_search2_do_search($query_text, $base)
51+function plugin_search2_do_search($query_text, $base, $start_index)
4752 {
4853 global $whatsnew, $non_list, $search_non_list;
4954 global $_msg_andresult, $_msg_orresult, $_msg_notfoundresult;
5055 global $search_auth;
5156
57+ $result_record_limit = $start_index === 0 ?
58+ PLUGIN_SEARCH2_RESULT_RECORD_LIMIT_START : PLUGIN_SEARCH2_RESULT_RECORD_LIMIT;
5259 $type = 'AND';
5360 $word = $query_text;
5461 $retval = array();
@@ -73,9 +80,14 @@ function plugin_search2_do_search($query_text, $base)
7380 $page_names = array_keys($pages);
7481
7582 $found_pages = array();
83+ $readable_page_index = -1;
84+ $scan_page_index = -1;
85+ $saved_scan_start_index = -1;
86+ $last_read_page_name = null;
7687 foreach ($page_names as $page) {
7788 $b_match = FALSE;
7889 $pagename_only = false;
90+ $scan_page_index++;
7991 if (! is_page_readable($page)) {
8092 if ($search_auth) {
8193 // $search_auth - 1: User can know page names that contain search text if the page is readable
@@ -84,6 +96,14 @@ function plugin_search2_do_search($query_text, $base)
8496 // $search_auth - 0: All users can know page names that conntain search text
8597 $pagename_only = true;
8698 }
99+ $readable_page_index++;
100+ if ($readable_page_index < $start_index) {
101+ // Skip: It's not time to read
102+ continue;
103+ }
104+ if ($saved_scan_start_index === -1) {
105+ $saved_scan_start_index = $scan_page_index;
106+ }
87107 // Search for page name and contents
88108 $raw_lines = get_source($page, TRUE, FALSE);
89109 $lines = remove_author_lines($raw_lines);
@@ -104,20 +124,37 @@ function plugin_search2_do_search($query_text, $base)
104124 $found_pages[] = array('name' => (string)$page,
105125 'url' => get_page_uri($page), 'body' => (string)$body);
106126 }
107- continue;
127+ }
128+ $last_read_page_name = $page;
129+ if ($start_index + $result_record_limit <= $readable_page_index + 1) {
130+ // Read page limit
131+ break;
108132 }
109133 }
110134 $s_word = htmlsc($word);
135+ /*
111136 if (empty($found_pages)) {
112137 $message = str_replace('$1', $s_word, $_msg_notfoundresult);
113138 $result_obj = array('message' => $message, 'results' => array());
114139 print(json_encode($result_obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
115140 return;
116141 }
142+ */
117143 $message = str_replace('$1', $s_word, str_replace('$2', count($found_pages),
118144 str_replace('$3', count($page_names), $b_type_and ? $_msg_andresult : $_msg_orresult)));
119-
120- $result_obj = array('message' => $message, 'results' => $found_pages);
145+ $search_done = (boolean)($scan_page_index + 1 === count($page_names));
146+ $result_obj = array(
147+ 'message' => $message,
148+ 'q' => $word,
149+ 'start_index' => $start_index,
150+ 'limit' => $result_record_limit,
151+ 'read_page_count' => $readable_page_index - $start_index + 1,
152+ 'scan_page_count' => $scan_page_index - $saved_scan_start_index + 1,
153+ 'page_count' => count($page_names),
154+ 'last_read_page_name' => $last_read_page_name,
155+ 'next_start_index' => $readable_page_index + 1,
156+ 'search_done' => $search_done,
157+ 'results' => $found_pages);
121158 print(json_encode($result_obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
122159 }
123160
@@ -157,6 +194,8 @@ EOD;
157194 EOD;
158195 $base_option = '<div class="small">' . $base_msg . '</div>';
159196 }
197+ $_search2_result_notfound = htmlsc($_msg_notfoundresult);
198+ $_search2_result_found = htmlsc($_msg_andresult);
160199 $result_page_panel =<<<EOD
161200 <div id="_plugin_search2_search_status"></div>
162201 <div id="_plugin_search2_message"></div>
--- a/skin/search2.js
+++ b/skin/search2.js
@@ -10,6 +10,7 @@ window.addEventListener && window.addEventListener('DOMContentLoaded', function(
1010 var aroundLines = 2;
1111 var maxResultLines = 20;
1212 var minBlockLines = 5;
13+ var searchWaitMilliseconds = 100;
1314 function escapeHTML (s) {
1415 if(typeof s !== 'string') {
1516 s = '' + s;
@@ -23,11 +24,12 @@ window.addEventListener && window.addEventListener('DOMContentLoaded', function(
2324 }[m];
2425 });
2526 }
26- function doSearch(text) {
27+ function doSearch(searchText, session, startIndex) {
2728 var url = './?cmd=search2&action=query';
28- if (text) {
29- url += '&q=' + encodeURIComponent(text);
29+ if (searchText) {
30+ url += '&q=' + encodeURIComponent(searchText);
3031 }
32+ url += '&start=' + startIndex;
3133 fetch (url
3234 ).then(function(response){
3335 if (response.ok) {
@@ -37,16 +39,32 @@ window.addEventListener && window.addEventListener('DOMContentLoaded', function(
3739 + response.statusText + ' on ' + url);
3840 }
3941 }).then(function(obj) {
40- showResult(obj, text);
42+ showResult(obj, session, searchText);
4143 })['catch'](function(err){
4244 console.log(err);
4345 console.log('Error! Please check JavaScript console' + '\n' + JSON.stringify(err) + '|' + err);
4446 });
4547 }
46- function showResult(obj, searchText) {
48+ function getMessageTemplate(idText, defaultText) {
49+ var messageHolder = document.querySelector('#' + idText);
50+ var messageTemplate = (messageHolder && messageHolder.value) || defaultText;
51+ return messageTemplate;
52+ }
53+ function showResult(obj, session, searchText) {
54+ var searchRegex = textToRegex(searchText);
4755 var ul = document.querySelector('#result-list');
4856 if (!ul) return;
49- ul.innerHTML = '';
57+ if (obj.start_index === 0) {
58+ ul.innerHTML = '';
59+ }
60+ if (! session.scan_page_count) session.scan_page_count = 0;
61+ if (! session.read_page_count) session.read_page_count = 0;
62+ if (! session.hit_page_count) session.hit_page_count = 0;
63+ session.scan_page_count += obj.scan_page_count;
64+ session.read_page_count += obj.read_page_count;
65+ session.hit_page_count += obj.results.length;
66+ session.page_count = obj.page_count;
67+
5068 var msg = obj.message;
5169 var notFoundMessageTemplate = getMessageTemplate('_plugin_search2_msg_result_notfound',
5270 'No page which contains $1 has been found.');
@@ -77,9 +95,6 @@ window.addEventListener && window.addEventListener('DOMContentLoaded', function(
7795 setSearchStatus(msg + progress);
7896 }
7997 var results = obj.results;
80- document.querySelector('#_plugin_search2_message').innerHTML = msg;
81- setSearchStatus('');
82- var searchRegex = textToRegex(searchText);
8398 results.forEach(function(val, index) {
8499 var fragment = document.createDocumentFragment();
85100 var li = document.createElement('li');
@@ -98,6 +113,11 @@ window.addEventListener && window.addEventListener('DOMContentLoaded', function(
98113 }
99114 ul.appendChild(fragment);
100115 });
116+ if (!obj.search_done && obj.next_start_index) {
117+ setTimeout(function(){
118+ doSearch(searchText, session, obj.next_start_index);
119+ }, searchWaitMilliseconds);
120+ }
101121 }
102122 function textToRegex(searchText) {
103123 var regEscape = /[\\^$.*+?()[\]{}|]/g;
Show on old repository browser