1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
---|
2 | <html lang="en"> |
---|
3 | <head> |
---|
4 | <title>JabRef References output</title> |
---|
5 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
---|
6 | <script type="text/javascript"> |
---|
7 | <!-- |
---|
8 | // QuickSearch script for JabRef HTML export |
---|
9 | // Version: 2.0 |
---|
10 | // |
---|
11 | // Copyright (c) 2006-2008, Mark Schenk |
---|
12 | // |
---|
13 | // This software is distributed under a Creative Commons Attribution 3.0 License |
---|
14 | // http://creativecommons.org/licenses/by/3.0/ |
---|
15 | |
---|
16 | // Some features: |
---|
17 | // + optionally searches Abstracts and Reviews |
---|
18 | // + allows RegExp searches |
---|
19 | // e.g. to search for entries between 1980 and 1989, type: 198[0-9] |
---|
20 | // e.g. for any entry ending with 'symmetry', type: symmetry$ |
---|
21 | // e.g. for all reftypes that are books: ^book$, or ^article$ |
---|
22 | // e.g. for entries by either John or Doe, type john|doe |
---|
23 | // + easy toggling of Abstract/Review/BibTeX |
---|
24 | |
---|
25 | // Search settings |
---|
26 | var searchAbstract = true; |
---|
27 | var searchReview = true; |
---|
28 | |
---|
29 | // Speed optimisation introduced some esoteric problems with certain RegExp searches |
---|
30 | // e.g. if the previous search is 200[-7] and the next search is 200[4-7] then the search doesn't work properly until the next 'keyup' |
---|
31 | // hence the searchOpt can be turned off for RegExp adepts |
---|
32 | var searchOpt = true; |
---|
33 | |
---|
34 | if (window.addEventListener) { |
---|
35 | window.addEventListener("load",initSearch,false); } |
---|
36 | else if (window.attachEvent) { |
---|
37 | window.attachEvent("onload", initSearch); } |
---|
38 | |
---|
39 | function initSearch() { |
---|
40 | // basic object detection |
---|
41 | if(!document.getElementById || !document.getElementsByTagName) { return; } |
---|
42 | if (!document.getElementById('qstable')||!document.getElementById('qs')) { return; } |
---|
43 | |
---|
44 | // find QS table and appropriate rows |
---|
45 | searchTable = document.getElementById('qstable'); |
---|
46 | var allRows = searchTable.getElementsByTagName('tbody')[0].getElementsByTagName('tr'); |
---|
47 | |
---|
48 | // split all rows into entryRows and infoRows (e.g. abstract, review, bibtex) |
---|
49 | entryRows = new Array(); |
---|
50 | infoRows = new Array(); absRows = new Array(); revRows = new Array(); |
---|
51 | |
---|
52 | for (var i=0, k=0, j=0; i<allRows.length;i++) { |
---|
53 | if (allRows[i].className.match(/entry/)) { |
---|
54 | entryRows[j++] = allRows[i]; |
---|
55 | } else { |
---|
56 | infoRows[k++] = allRows[i]; |
---|
57 | // check for abstract/review |
---|
58 | if (allRows[i].className.match(/abstract/)) { |
---|
59 | absRows.push(allRows[i]); |
---|
60 | } else if (allRows[i].className.match(/review/)) { |
---|
61 | revRows.push(allRows[i]); |
---|
62 | } |
---|
63 | } |
---|
64 | } |
---|
65 | |
---|
66 | //number of entries and rows |
---|
67 | numRows = allRows.length; |
---|
68 | numEntries = entryRows.length; |
---|
69 | numInfo = infoRows.length; |
---|
70 | numAbs = absRows.length; |
---|
71 | numRev = revRows.length; |
---|
72 | |
---|
73 | //find the query field |
---|
74 | qsfield = document.getElementById('qsfield'); |
---|
75 | |
---|
76 | // previous search term; used for speed optimisation |
---|
77 | prevSearch = ''; |
---|
78 | |
---|
79 | //find statistics location |
---|
80 | stats = document.getElementById('stat'); |
---|
81 | setStatistics(-1); |
---|
82 | |
---|
83 | // creates the appropriate search settings |
---|
84 | createQSettingsDialog(); |
---|
85 | |
---|
86 | // shows the searchfield |
---|
87 | document.getElementById('qs').style.display = 'block'; |
---|
88 | document.getElementById('qsfield').onkeyup = testEvent; |
---|
89 | } |
---|
90 | |
---|
91 | function quickSearch(tInput){ |
---|
92 | |
---|
93 | if (tInput.value.length == 0) { |
---|
94 | showAll(); |
---|
95 | setStatistics(-1); |
---|
96 | qsfield.className = ''; |
---|
97 | return; |
---|
98 | } else { |
---|
99 | // only search for valid RegExp |
---|
100 | try { |
---|
101 | var searchText = new RegExp(tInput.value,"i") |
---|
102 | closeAllInfo(); |
---|
103 | qsfield.className = ''; |
---|
104 | } |
---|
105 | catch(err) { |
---|
106 | prevSearch = tInput.value; |
---|
107 | qsfield.className = 'invalidsearch'; |
---|
108 | return; |
---|
109 | } |
---|
110 | } |
---|
111 | |
---|
112 | // count number of hits |
---|
113 | var hits = 0; |
---|
114 | |
---|
115 | // start looping through all entry rows |
---|
116 | for (var i = 0; cRow = entryRows[i]; i++){ |
---|
117 | |
---|
118 | // only show search the cells if it isn't already hidden OR if the search term is getting shorter, then search all |
---|
119 | // some further optimisation is possible: if the search string is getting shorter, and the row is already visible, skip it. Then be careful with hits! |
---|
120 | if(!searchOpt || cRow.className.indexOf('noshow')==-1 || tInput.value.length <= prevSearch.length){ |
---|
121 | var found = false; |
---|
122 | |
---|
123 | var inCells = cRow.getElementsByTagName('td'); |
---|
124 | var numCols = inCells.length; |
---|
125 | |
---|
126 | for (var j=0; j<numCols; j++) { |
---|
127 | cCell = inCells[j]; |
---|
128 | var t = cCell.innerText?cCell.innerText:getTextContent(cCell); |
---|
129 | if (t.search(searchText) != -1){ |
---|
130 | found=true; |
---|
131 | break; |
---|
132 | } |
---|
133 | } |
---|
134 | |
---|
135 | // look for further hits in Abstract and Review |
---|
136 | if(!found) { |
---|
137 | var articleid = cRow.id; |
---|
138 | if(searchAbstract && (abs = document.getElementById('abs_'+articleid))) { |
---|
139 | if (getTextContent(abs).search(searchText) != -1){ found=true; } |
---|
140 | } |
---|
141 | if(searchReview && (rev = document.getElementById('rev_'+articleid))) { |
---|
142 | if (getTextContent(rev).search(searchText) != -1){ found=true; } |
---|
143 | } |
---|
144 | } |
---|
145 | |
---|
146 | if(found) { |
---|
147 | cRow.className = 'entry show'; |
---|
148 | hits++; |
---|
149 | } else { |
---|
150 | cRow.className = 'entry noshow'; |
---|
151 | } |
---|
152 | } |
---|
153 | } |
---|
154 | |
---|
155 | // update statistics |
---|
156 | setStatistics(hits) |
---|
157 | |
---|
158 | // set previous search value |
---|
159 | prevSearch = tInput.value; |
---|
160 | } |
---|
161 | |
---|
162 | function toggleInfo(articleid,info) { |
---|
163 | |
---|
164 | var entry = document.getElementById(articleid); |
---|
165 | var abs = document.getElementById('abs_'+articleid); |
---|
166 | var rev = document.getElementById('rev_'+articleid); |
---|
167 | var bib = document.getElementById('bib_'+articleid); |
---|
168 | // Get the abstracts/reviews/bibtext in the right location |
---|
169 | // in unsorted tables this is always the case, but in sorted tables it is necessary. |
---|
170 | // Start moving in reverse order, so we get: entry, abstract,review,bibtex |
---|
171 | if (searchTable.className.indexOf('sortable') != -1) { |
---|
172 | if(bib) { entry.parentNode.insertBefore(bib,entry.nextSibling); } |
---|
173 | if(rev) { entry.parentNode.insertBefore(rev,entry.nextSibling); } |
---|
174 | if(abs) { entry.parentNode.insertBefore(abs,entry.nextSibling); } |
---|
175 | } |
---|
176 | |
---|
177 | if (abs && info == 'abstract') { |
---|
178 | if(abs.className.indexOf('abstract') != -1) { |
---|
179 | abs.className.indexOf('noshow') == -1?abs.className = 'abstract noshow':abs.className = 'abstract'; |
---|
180 | } |
---|
181 | } else if (rev && info == 'review') { |
---|
182 | if(rev.className.indexOf('review') != -1) { |
---|
183 | rev.className.indexOf('noshow') == -1?rev.className = 'review noshow':rev.className = 'review'; |
---|
184 | } |
---|
185 | } else if (bib && info == 'bibtex') { |
---|
186 | if(bib.className.indexOf('bibtex') != -1) { |
---|
187 | bib.className.indexOf('noshow') == -1?bib.className = 'bibtex noshow':bib.className = 'bibtex'; |
---|
188 | } |
---|
189 | } else { |
---|
190 | return; |
---|
191 | } |
---|
192 | |
---|
193 | // check if one or the other is available |
---|
194 | var revshow = false; |
---|
195 | var absshow = false; |
---|
196 | var bibshow = false; |
---|
197 | (abs && abs.className.indexOf('noshow') == -1)? absshow = true: absshow = false; |
---|
198 | (rev && rev.className.indexOf('noshow') == -1)? revshow = true: revshow = false; |
---|
199 | (bib && bib.className == 'bibtex')? bibshow = true: bibshow = false; |
---|
200 | |
---|
201 | // highlight original entry |
---|
202 | if(entry) { |
---|
203 | if (revshow || absshow || bibshow) { |
---|
204 | entry.className = 'entry highlight show'; |
---|
205 | } else { |
---|
206 | entry.className = 'entry show'; |
---|
207 | } |
---|
208 | } |
---|
209 | |
---|
210 | // When there's a combination of abstract/review/bibtex showing, need to add class for correct styling |
---|
211 | if(absshow) { |
---|
212 | (revshow||bibshow)?abs.className = 'abstract nextshow':abs.className = 'abstract'; |
---|
213 | } |
---|
214 | if (revshow) { |
---|
215 | bibshow?rev.className = 'review nextshow': rev.className = 'review'; |
---|
216 | } |
---|
217 | |
---|
218 | } |
---|
219 | |
---|
220 | function setStatistics (hits) { |
---|
221 | if(hits < 0) { hits=numEntries; } |
---|
222 | if(stats) { stats.firstChild.data = hits + '/' + numEntries} |
---|
223 | } |
---|
224 | |
---|
225 | function getTextContent(node) { |
---|
226 | // Function written by Arve Bersvendsen |
---|
227 | // http://www.virtuelvis.com |
---|
228 | |
---|
229 | if (node.nodeType == 3) { |
---|
230 | return node.nodeValue; |
---|
231 | } // text node |
---|
232 | if (node.nodeType == 1) { // element node |
---|
233 | var text = []; |
---|
234 | for (var chld = node.firstChild;chld;chld=chld.nextSibling) { |
---|
235 | text.push(getTextContent(chld)); |
---|
236 | } |
---|
237 | return text.join(""); |
---|
238 | } return ""; // some other node, won't contain text nodes. |
---|
239 | } |
---|
240 | |
---|
241 | function showAll(){ |
---|
242 | // first close all abstracts, reviews, etc. |
---|
243 | closeAllInfo(); |
---|
244 | |
---|
245 | for (var i = 0; i < numEntries; i++){ |
---|
246 | entryRows[i].className = 'entry show'; |
---|
247 | } |
---|
248 | } |
---|
249 | |
---|
250 | function closeAllInfo(){ |
---|
251 | for (var i=0; i < numInfo; i++){ |
---|
252 | if (infoRows[i].className.indexOf('noshow') ==-1) { |
---|
253 | infoRows[i].className = infoRows[i].className + ' noshow'; |
---|
254 | } |
---|
255 | } |
---|
256 | } |
---|
257 | |
---|
258 | function testEvent(e){ |
---|
259 | if (!e) var e = window.event; |
---|
260 | quickSearch(this); |
---|
261 | } |
---|
262 | |
---|
263 | function clearQS() { |
---|
264 | qsfield.value = ''; |
---|
265 | quickSearch(qsfield); |
---|
266 | } |
---|
267 | |
---|
268 | function redoQS(){ |
---|
269 | showAll(); |
---|
270 | quickSearch(qsfield); |
---|
271 | } |
---|
272 | |
---|
273 | // Create Search Settings |
---|
274 | |
---|
275 | function toggleQSettingsDialog() { |
---|
276 | |
---|
277 | var qssettings = document.getElementById('qssettings'); |
---|
278 | |
---|
279 | if(qssettings.className.indexOf('active')==-1) { |
---|
280 | qssettings.className = 'active'; |
---|
281 | |
---|
282 | if(absCheckBox && searchAbstract == true) { absCheckBox.checked = 'checked'; } |
---|
283 | if(revCheckBox && searchReview == true) { revCheckBox.checked = 'checked'; } |
---|
284 | |
---|
285 | } else { |
---|
286 | qssettings.className= ''; |
---|
287 | } |
---|
288 | } |
---|
289 | |
---|
290 | function createQSettingsDialog(){ |
---|
291 | var qssettingslist = document.getElementById('qssettings').getElementsByTagName('ul')[0]; |
---|
292 | |
---|
293 | if(numAbs!=0) { |
---|
294 | var x = document.createElement('input'); |
---|
295 | x.id = "searchAbs"; |
---|
296 | x.type = "checkbox"; |
---|
297 | x.onclick = toggleQSetting; |
---|
298 | var y = qssettingslist.appendChild(document.createElement('li')).appendChild(document.createElement('label')); |
---|
299 | y.appendChild(x); |
---|
300 | y.appendChild(document.createTextNode('search abstracts')); |
---|
301 | } |
---|
302 | if(numRev!=0) { |
---|
303 | var x = document.createElement('input'); |
---|
304 | x.id = "searchRev"; |
---|
305 | x.type = "checkbox"; |
---|
306 | x.onclick = toggleQSetting; |
---|
307 | var y = qssettingslist.appendChild(document.createElement('li')).appendChild(document.createElement('label')); |
---|
308 | y.appendChild(x); |
---|
309 | y.appendChild(document.createTextNode('search reviews')); |
---|
310 | } |
---|
311 | |
---|
312 | // global variables |
---|
313 | absCheckBox = document.getElementById('searchAbs'); |
---|
314 | revCheckBox = document.getElementById('searchRev'); |
---|
315 | |
---|
316 | // show search settings |
---|
317 | if(absCheckBox||revCheckBox) { |
---|
318 | document.getElementById('qssettings').style.display = 'block'; |
---|
319 | } |
---|
320 | } |
---|
321 | |
---|
322 | function toggleQSetting() { |
---|
323 | if(this.id=='searchAbs') { searchAbstract = !searchAbstract; } |
---|
324 | if(this.id=='searchRev') { searchReview = !searchReview; } |
---|
325 | redoQS() |
---|
326 | } |
---|
327 | --> |
---|
328 | </script> |
---|
329 | <script type="text/javascript"> |
---|
330 | <!-- |
---|
331 | // Sort Table Script |
---|
332 | // Version: 1.1 |
---|
333 | // |
---|
334 | // Copyright (c) 2006-2008, Mark Schenk |
---|
335 | // |
---|
336 | // This software is distributed under a Creative Commons Attribution 3.0 License |
---|
337 | // http://creativecommons.org/licenses/by/3.0/ |
---|
338 | |
---|
339 | // NB: slow as molasses in FireFox, especially when sorting columns with a lot of text. |
---|
340 | // An optimization is implemented which makes speed bearable, toggled by the following variable |
---|
341 | var SORT_SPEED_OPT = true; |
---|
342 | // a bit of browser preference: Opera does not need optimization |
---|
343 | if(window.opera) { SORT_SPEED_OPT=false; } |
---|
344 | // the optimization has one limitation on the functionality: when sorting search |
---|
345 | // results, the expanded info, e.g. bibtex/review, is collapsed. In the non-optimized |
---|
346 | // version they remain visible. |
---|
347 | |
---|
348 | |
---|
349 | if (window.addEventListener) { |
---|
350 | window.addEventListener("load",initSortTable,false) } |
---|
351 | else if (window.attachEvent) { |
---|
352 | window.attachEvent("onload", initSortTable); } |
---|
353 | |
---|
354 | function initSortTable() { |
---|
355 | var alltables = document.getElementsByTagName('table'); |
---|
356 | for(i=0;i<alltables.length;i++) { |
---|
357 | var currentTable = alltables[i]; |
---|
358 | if(currentTable.className.indexOf('sortable') !=-1) { |
---|
359 | var thead = currentTable.getElementsByTagName('thead')[0]; |
---|
360 | thead.title = 'Click on any column header to sort'; |
---|
361 | for (var i=0;cell = thead.getElementsByTagName('th')[i];i++) { |
---|
362 | cell.onclick = function () { resortTable(this); }; |
---|
363 | // make it possible to have a default sort column |
---|
364 | if(cell.className.indexOf('sort')!=-1) { |
---|
365 | resortTable(cell) |
---|
366 | } |
---|
367 | } |
---|
368 | } |
---|
369 | } |
---|
370 | } |
---|
371 | |
---|
372 | var SORT_COLUMN_INDEX |
---|
373 | |
---|
374 | function resortTable(td) { |
---|
375 | var column = td.cellIndex; |
---|
376 | var table = getParent(td,'TABLE'); |
---|
377 | |
---|
378 | var allRows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr'); |
---|
379 | var newRows = new Array(); |
---|
380 | |
---|
381 | for (var i=0, k=0; i<allRows.length;i++) { |
---|
382 | |
---|
383 | var rowclass = allRows[i].className; |
---|
384 | |
---|
385 | if (rowclass.indexOf('entry') != -1) { |
---|
386 | newRows[k++] = allRows[i]; |
---|
387 | } |
---|
388 | |
---|
389 | if (SORT_SPEED_OPT) { |
---|
390 | // remove highlight class |
---|
391 | allRows[i].className = rowclass.replace(/highlight/,''); |
---|
392 | // close information |
---|
393 | if(rowclass.indexOf('entry') == -1 && rowclass.indexOf('noshow') == -1) { allRows[i].className = rowclass + ' noshow';} |
---|
394 | } |
---|
395 | } |
---|
396 | |
---|
397 | |
---|
398 | // If other sort functions are deemed necessary (e.g. for |
---|
399 | // dates and currencies) they can be added. |
---|
400 | var sortfn = ts_sort_firstchild_caseinsensitive; |
---|
401 | SORT_COLUMN_INDEX = column; |
---|
402 | newRows.sort(sortfn); |
---|
403 | |
---|
404 | // create a container for showing sort arrow |
---|
405 | var arrow = td.getElementsByTagName('span')[0]; |
---|
406 | if (!arrow) { var arrow = td.appendChild(document.createElement('span'));} |
---|
407 | |
---|
408 | if (td.className) { |
---|
409 | if (td.className.indexOf('sort_asc') !=-1) { |
---|
410 | td.className = td.className.replace(/_asc/,"_des"); |
---|
411 | newRows.reverse(); |
---|
412 | arrow.innerHTML = '⇑'; |
---|
413 | } else if (td.className.indexOf('sort_des') !=-1) { |
---|
414 | td.className = td.className.replace(/_des/,"_asc"); |
---|
415 | arrow.innerHTML = '⇓'; |
---|
416 | } else { |
---|
417 | td.className += ' sort_asc'; |
---|
418 | arrow.innerHTML = '⇓'; |
---|
419 | } |
---|
420 | } else { |
---|
421 | td.className += 'sort_asc'; |
---|
422 | arrow.innerHTML = '⇓'; |
---|
423 | } |
---|
424 | |
---|
425 | // Remove the classnames and up/down arrows for the other headers |
---|
426 | var ths = table.getElementsByTagName('thead')[0].getElementsByTagName('th'); |
---|
427 | for (var i=0; i<ths.length; i++) { |
---|
428 | if(ths[i]!=td && ths[i].className.indexOf('sort_')!=-1) { |
---|
429 | // argh, moronic JabRef thinks (backslash)w is an output field!! |
---|
430 | //ths[i].className = ths[i].className.replace(/sort_(backslash)w{3}/,""); |
---|
431 | ths[i].className = ths[i].className.replace(/sort_asc/,""); |
---|
432 | ths[i].className = ths[i].className.replace(/sort_des/,""); |
---|
433 | |
---|
434 | // remove span |
---|
435 | var arrow = ths[i].getElementsByTagName('span')[0]; |
---|
436 | if (arrow) { ths[i].removeChild(arrow); } |
---|
437 | } |
---|
438 | } |
---|
439 | |
---|
440 | // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones |
---|
441 | for (i=0;i<newRows.length;i++) { |
---|
442 | table.getElementsByTagName('tbody')[0].appendChild(newRows[i]); |
---|
443 | |
---|
444 | if(!SORT_SPEED_OPT){ |
---|
445 | // moving additional information, e.g. bibtex/abstract to right locations |
---|
446 | // this allows to sort, even with abstract/review/etc. still open |
---|
447 | var articleid = newRows[i].id; |
---|
448 | |
---|
449 | var entry = document.getElementById(articleid); |
---|
450 | var abs = document.getElementById('abs_'+articleid); |
---|
451 | var rev = document.getElementById('rev_'+articleid); |
---|
452 | var bib = document.getElementById('bib_'+articleid); |
---|
453 | |
---|
454 | var tbody = table.getElementsByTagName('tbody')[0]; |
---|
455 | // mind the order of adding the entries |
---|
456 | if(abs) { tbody.appendChild(abs); } |
---|
457 | if(rev) { tbody.appendChild(rev); } |
---|
458 | if(bib) { tbody.appendChild(bib); } |
---|
459 | } |
---|
460 | } |
---|
461 | } |
---|
462 | |
---|
463 | function ts_sort_firstchild_caseinsensitive(a,b) { |
---|
464 | // only search in .firstChild of the cells. Speeds things up tremendously in FF |
---|
465 | // problem is that it won't find all the text in a cell if the firstChild is an element |
---|
466 | // or if there are other elements in the cell. Risky fix, but the speed boost is worth it. |
---|
467 | var acell = a.cells[SORT_COLUMN_INDEX]; |
---|
468 | var bcell = b.cells[SORT_COLUMN_INDEX]; |
---|
469 | |
---|
470 | acell.firstChild? aa = getTextContent(acell.firstChild).toLowerCase():aa = ""; |
---|
471 | bcell.firstChild? bb = getTextContent(bcell.firstChild).toLowerCase():bb = ""; |
---|
472 | |
---|
473 | if (aa==bb) return 0; |
---|
474 | if (aa<bb) return -1; |
---|
475 | return 1; |
---|
476 | } |
---|
477 | |
---|
478 | function ts_sort_caseinsensitive(a,b) { |
---|
479 | aa = getTextContent(a.cells[SORT_COLUMN_INDEX]).toLowerCase(); |
---|
480 | bb = getTextContent(b.cells[SORT_COLUMN_INDEX]).toLowerCase(); |
---|
481 | if (aa==bb) return 0; |
---|
482 | if (aa<bb) return -1; |
---|
483 | return 1; |
---|
484 | } |
---|
485 | |
---|
486 | function ts_sort_default(a,b) { |
---|
487 | aa = getTextContent(a.cells[SORT_COLUMN_INDEX]); |
---|
488 | bb = getTextContent(b.cells[SORT_COLUMN_INDEX]); |
---|
489 | if (aa==bb) return 0; |
---|
490 | if (aa<bb) return -1; |
---|
491 | return 1; |
---|
492 | } |
---|
493 | |
---|
494 | function getParent(el, pTagName) { |
---|
495 | if (el == null) { |
---|
496 | return null; |
---|
497 | } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) { |
---|
498 | return el; |
---|
499 | } else { |
---|
500 | return getParent(el.parentNode, pTagName); |
---|
501 | } |
---|
502 | } |
---|
503 | --> |
---|
504 | </script> |
---|
505 | |
---|
506 | <style type="text/css"> |
---|
507 | body { background-color: white; font-family: "Trebuchet MS", Arial, sans-serif; font-size: 12px; line-height: 1.2; padding: 1em; color: #2E2E2E; } |
---|
508 | |
---|
509 | #qs { width: auto; border-style: solid; border-color: gray; border-width: 1px 1px 0px 1px; padding: 0.5em 0.5em; display:none; position:relative; } |
---|
510 | #qs form { padding: 0px; margin: 0px; } |
---|
511 | #qs form p { padding: 0px; margin: 0px; } |
---|
512 | |
---|
513 | .invalidsearch { background-color: red; } |
---|
514 | |
---|
515 | table { border: 1px gray solid; width: 100%; empty-cells: show; } |
---|
516 | th, td { border: 1px gray solid; padding: 0.5em; vertical-align: top; } |
---|
517 | td { text-align: left; vertical-align: top; } |
---|
518 | th { background-color: #EFEFEF; } |
---|
519 | |
---|
520 | td a { color: navy; text-decoration: none; } |
---|
521 | td a:hover { text-decoration: underline; } |
---|
522 | |
---|
523 | tr.noshow { display: none;} |
---|
524 | |
---|
525 | tr.highlight td { background-color: #F1F1F1; border-top: 2px black solid; font-weight: bold; } |
---|
526 | tr.abstract td, tr.review td, tr.bibtex td { background-color: #F1F1F1; border-bottom: 2px black solid; } |
---|
527 | tr.nextshow td { border-bottom: 1px gray solid; } |
---|
528 | |
---|
529 | tr.bibtex pre { width: 100%; overflow: auto;} |
---|
530 | |
---|
531 | p.infolinks { margin: 0.5em 0em 0em 0em; padding: 0px; } |
---|
532 | |
---|
533 | #qssettings { padding: 0.5em; position: absolute; top: 0.2em; right: 0.2em; border: 1px gray solid; background-color: white; display: none; } |
---|
534 | #qssettings p { font-weight: bold; cursor: pointer; } |
---|
535 | #qssettings ul { display: none; list-style-type: none; padding-left: 0; margin: 0; } |
---|
536 | #qssettings.active ul { display: block; } |
---|
537 | |
---|
538 | @media print { |
---|
539 | p.infolinks, #qssettings, #qs { display: none !important; } |
---|
540 | table { border-width: 0px; } |
---|
541 | tr { page-break-inside: avoid; } |
---|
542 | tr > * + * + * + * + * {display: none; } |
---|
543 | thead tr::before { content: "Reference"; border: 1px gray solid; padding: 0.5em; vertical-align: top; font-weight: bold; text-align: center; display: table-cell; background-color: #EFEFEF; } |
---|
544 | tr[id]::before { content: attr(id); display: table-cell; border: 1px gray solid; padding: 0.5em; vertical-align: top; font-style: italic; } |
---|
545 | } |
---|
546 | th.sort_asc, th.sort_des { border: 2px black solid; } |
---|
547 | |
---|
548 | </style> |
---|
549 | </head> |
---|
550 | <body> |
---|
551 | |
---|
552 | <div id="qs"> |
---|
553 | <form action=""> |
---|
554 | <p>QuickSearch: <input type="text" name="qsfield" id="qsfield" autocomplete="off" title="Allows plain text as well as RegExp searches" /><input type="button" onclick="clearQS()" value="clear" /> Number of matching entries: <span id="stat">0</span>.</p> |
---|
555 | <div id="qssettings"> |
---|
556 | <p onclick="toggleQSettingsDialog()">Search Settings</p> |
---|
557 | <ul></ul> |
---|
558 | </div> |
---|
559 | </form> |
---|
560 | </div> |
---|
561 | <table id="qstable" class="sortable" border="1"> |
---|
562 | <thead><tr><th width="20%">Author</th><th width="30%">Title</th><th width="4%">Year</th><th width="30%">Journal/Proceedings</th><th width="7%">Reftype</th><th width="4%">DOI/URL</th></tr></thead> |
---|
563 | <tbody> |
---|
564 | <tr id="Cabodi09Speeding" class="entry"> |
---|
565 | <td>Cabodi, G., Camurati, P., Garcia, L., Murciano, M., Nocco, S. & Quer, S. </td> |
---|
566 | <td>Speeding up Model Checking by Exploiting Explicit and Hidden Verification Constraints <p class="infolinks">[<a href="javascript:toggleInfo('Cabodi09Speeding','abstract')">Abstract</a>] [<a href="javascript:toggleInfo('Cabodi09Speeding','bibtex')">BibTeX</a>]</p></td> |
---|
567 | <td>2009</td> |
---|
568 | <td>DATE '09: Proceedings of the conference on Design, Automation and Test in Europe, pp. 1686-1691 </td> |
---|
569 | <td>inproceedings</td> |
---|
570 | <td> </td> |
---|
571 | </tr> |
---|
572 | <tr id="abs_Cabodi09Speeding" class="abstract noshow"> |
---|
573 | <td colspan="7"><b>Abstract</b>: Constraints represent a key component of state-<p>of-the-art verification tools based on compositional approaches<p>and assumeâguarantee reasoning. In recent years, most of the<p>research efforts on verification constraints have focused on<p>defining formats and techniques to encode, or to synthesize,<p>constraints starting from the specification of the design.<p>In this paper, we analyze the impact of constraints on the<p>performance of model checking tools, and we discuss how to<p>effectively exploit them. We also introduce an approach to<p>explicitly derive verification constraints hidden in the design<p>and/or in the property under verification. Such constraints may<p>simply come from true design constraints, embedded within the<p>properties, or may be generated in the general effort to reduce or<p>partition the state space. Experimental results show that, in both<p>cases, we can reap benefits for the overall verification process<p>in several hard-to-solve designs, where we obtain speed-ups of<p>more than one order of magnitude.</td> |
---|
574 | </tr> |
---|
575 | <tr id="bib_Cabodi09Speeding" class="bibtex noshow"> |
---|
576 | <td colspan="7"><b>BibTeX</b>: |
---|
577 | <pre> |
---|
578 | @inproceedings{Cabodi09Speeding, |
---|
579 | author = {G. Cabodi and P. Camurati and L. Garcia and M. Murciano and S. Nocco and S. Quer}, |
---|
580 | title = {Speeding up Model Checking by Exploiting Explicit and Hidden Verification Constraints}, |
---|
581 | booktitle = {DATE '09: Proceedings of the conference on Design, Automation and Test in Europe}, |
---|
582 | year = {2009}, |
---|
583 | pages = {1686-1691} |
---|
584 | } |
---|
585 | </pre></td> |
---|
586 | </tr> |
---|
587 | <tr id="6128043" class="entry"> |
---|
588 | <td>Feng, Y., Veeramani, A., Kanagasabai, R. & Rho, S. </td> |
---|
589 | <td>Automatic Service Composition via Model Checking <p class="infolinks">[<a href="javascript:toggleInfo('6128043','abstract')">Abstract</a>] [<a href="javascript:toggleInfo('6128043','bibtex')">BibTeX</a>]</p></td> |
---|
590 | <td>2011</td> |
---|
591 | <td>Services Computing Conference (APSCC), 2011 IEEE Asia-Pacific, pp. 477 -482 </td> |
---|
592 | <td>inproceedings</td> |
---|
593 | <td><a href="http://dx.doi.org/10.1109/APSCC.2011.54">DOI</a> </td> |
---|
594 | </tr> |
---|
595 | <tr id="abs_6128043" class="abstract noshow"> |
---|
596 | <td colspan="7"><b>Abstract</b>: Web service composition is the process of constructing a set of Web services which, when invoked with some user input in a particular order, can produce the output to the user's requirements. This paper proposes a novel model checking based approach for automated service composition. Modeling services as a set of interleaved processes in a class of process algebra, we formulate service composition as model checking asserted on a specific type of property on the model. We show that, under this formulation, correct composition workflows can be constructed from the counter-examples provided by model checking. With a case study on online hotel booking services, we demonstrate that the proposed approach can support directed a cyclic composition graphs and the generated composition graphs are automatically verified.</td> |
---|
597 | </tr> |
---|
598 | <tr id="bib_6128043" class="bibtex noshow"> |
---|
599 | <td colspan="7"><b>BibTeX</b>: |
---|
600 | <pre> |
---|
601 | @inproceedings{6128043, |
---|
602 | author = {Yuzhang Feng and Veeramani, A. and Kanagasabai, R. and Seungmin Rho}, |
---|
603 | title = {Automatic Service Composition via Model Checking}, |
---|
604 | booktitle = {Services Computing Conference (APSCC), 2011 IEEE Asia-Pacific}, |
---|
605 | year = {2011}, |
---|
606 | pages = {477 -482}, |
---|
607 | doi = {http://dx.doi.org/10.1109/APSCC.2011.54} |
---|
608 | } |
---|
609 | </pre></td> |
---|
610 | </tr> |
---|
611 | <tr id="springerlink:10.1007/978-3-642-16901-4_15" class="entry"> |
---|
612 | <td>Lomuscio, A., Strulo, B., Walker, N. & Wu, P. Jin Dong and Huibiao Zhu (Ed.)</td> |
---|
613 | <td>Assume-Guarantee Reasoning with Local Specifications <p class="infolinks">[<a href="javascript:toggleInfo('springerlink:10.1007/978-3-642-16901-4_15','abstract')">Abstract</a>] [<a href="javascript:toggleInfo('springerlink:10.1007/978-3-642-16901-4_15','bibtex')">BibTeX</a>]</p></td> |
---|
614 | <td>2010</td> |
---|
615 | <td><br/>Vol. 6447Formal Methods and Software Engineering, pp. 204-219 </td> |
---|
616 | <td>incollection</td> |
---|
617 | <td><a href="http://dx.doi.org/10.1007/978-3-642-16901-4_15">URL</a> </td> |
---|
618 | </tr> |
---|
619 | <tr id="abs_springerlink:10.1007/978-3-642-16901-4_15" class="abstract noshow"> |
---|
620 | <td colspan="7"><b>Abstract</b>: We investigate assume-guarantee reasoning for global specifications consisting of conjunctions of local specifications. We present a sound and complete assume-guarantee rule that permits reasoning about individual modules for local specifications and draws conclusions on global specifications. We illustrate our approach with an example from the field of network congestion control, where different agents are responsible for controlling packet flow across a shared infrastructure. In this context, we derive an assume-guarantee rule for system stability, and show that this rule is valuable to reason about any number of agents, any initial flow configuration, and any topology of bounded degree.</td> |
---|
621 | </tr> |
---|
622 | <tr id="bib_springerlink:10.1007/978-3-642-16901-4_15" class="bibtex noshow"> |
---|
623 | <td colspan="7"><b>BibTeX</b>: |
---|
624 | <pre> |
---|
625 | @incollection{springerlink:10.1007/978-3-642-16901-4_15, |
---|
626 | author = {Lomuscio, Alessio and Strulo, Ben and Walker, Nigel and Wu, Peng}, |
---|
627 | title = {Assume-Guarantee Reasoning with Local Specifications}, |
---|
628 | booktitle = {Formal Methods and Software Engineering}, |
---|
629 | publisher = {Springer Berlin / Heidelberg}, |
---|
630 | year = {2010}, |
---|
631 | volume = {6447}, |
---|
632 | pages = {204-219}, |
---|
633 | note = {10.1007/978-3-642-16901-4_15}, |
---|
634 | url = {http://dx.doi.org/10.1007/978-3-642-16901-4_15} |
---|
635 | } |
---|
636 | </pre></td> |
---|
637 | </tr> |
---|
638 | <tr id="Tripakis201" class="entry"> |
---|
639 | <td>Tripakis, S., Andrade, H., Ghosal, A., Limaye, R., Ravindran, K., Wang, G., Yang, G., Kormerup, J. & Wong, I. </td> |
---|
640 | <td>Correct and non-defensive glue design using abstract models <p class="infolinks">[<a href="javascript:toggleInfo('Tripakis201','abstract')">Abstract</a>] [<a href="javascript:toggleInfo('Tripakis201','bibtex')">BibTeX</a>]</p></td> |
---|
641 | <td>2011</td> |
---|
642 | <td>Proceedings of the seventh IEEE/ACM/IFIP international conference on Hardware/software codesign and system synthesis, pp. 59-68 </td> |
---|
643 | <td>inproceedings</td> |
---|
644 | <td><a href="http://doi.acm.org/10.1145/2039370.2039382">DOI</a> <a href="http://doi.acm.org/10.1145/2039370.2039382">URL</a> </td> |
---|
645 | </tr> |
---|
646 | <tr id="abs_Tripakis201" class="abstract noshow"> |
---|
647 | <td colspan="7"><b>Abstract</b>: Current hardware design practice often relies on integration of components, some of which may be IP or legacy blocks. While integration eases design by allowing modularization and component reuse, it is still done in a mostly ad hoc manner. Designers work with descriptions of components that are either informal or incomplete (e.g., documents in English, structural but non-behavioral specifications in IP-XACT) or too low-level (e.g., HDL code), and have little to no automatic support for stitching the components together. Providing such support is the glue design problem.<p>This paper addresses this problem using a model-based approach. The key idea is to use high-level models, such as dataflow graphs, that enable efficient automated analysis. The analysis can be used to derive performance properties of the system (e.g., component compatibility, throughput, etc.), optimize resource usage (e.g., buffer sizes), and even synthesize low-level code (e.g., control logic). However, these models are only abstractions of the real system, and often omit critical information. As a result, the analysis outcomes may be defensive (e.g., buffers that are too big) or even incorrect (e.g., buffers that are too small). The paper examines these situations and proposes a correct and non-defensive design methodology that employs the right models to explore accurate performance and resource trade-offs. </td> |
---|
648 | </tr> |
---|
649 | <tr id="bib_Tripakis201" class="bibtex noshow"> |
---|
650 | <td colspan="7"><b>BibTeX</b>: |
---|
651 | <pre> |
---|
652 | @inproceedings{Tripakis201, |
---|
653 | author = {Tripakis, Stavros and Andrade, Hugo and Ghosal, Arkadeb and Limaye, Rhishikesh and Ravindran, Kaushik and Wang, Guoqiang and Yang, Guang and Kormerup, Jacob and Wong, Ian}, |
---|
654 | title = {Correct and non-defensive glue design using abstract models}, |
---|
655 | booktitle = {Proceedings of the seventh IEEE/ACM/IFIP international conference on Hardware/software codesign and system synthesis}, |
---|
656 | publisher = {ACM}, |
---|
657 | year = {2011}, |
---|
658 | pages = {59--68}, |
---|
659 | url = {http://doi.acm.org/10.1145/2039370.2039382}, |
---|
660 | doi = {http://doi.acm.org/10.1145/2039370.2039382} |
---|
661 | } |
---|
662 | </pre></td> |
---|
663 | </tr> |
---|
664 | <tr id="5374376" class="entry"> |
---|
665 | <td>Zheng, H., Yao, H. & Yoneda, T. </td> |
---|
666 | <td>Modular Model Checking of Large Asynchronous Designs with Efficient Abstraction Refinement <p class="infolinks">[<a href="javascript:toggleInfo('5374376','abstract')">Abstract</a>] [<a href="javascript:toggleInfo('5374376','bibtex')">BibTeX</a>]</p></td> |
---|
667 | <td>2010</td> |
---|
668 | <td>Computers, IEEE Transactions on<br/>Vol. 59(4), pp. 561 -573 </td> |
---|
669 | <td>article</td> |
---|
670 | <td><a href="http://dx.doi.org/10.1109/TC.2009.187">DOI</a> </td> |
---|
671 | </tr> |
---|
672 | <tr id="abs_5374376" class="abstract noshow"> |
---|
673 | <td colspan="7"><b>Abstract</b>: Divide-and-conquer is essential to address state explosion in model checking. Verifying each individual component in a system, in isolation, efficiently requires an appropriate context, which traditionally is obtained by hand. This paper presents an efficient modular model checking approach for asynchronous design verification. It is equipped with a novel abstraction refinement method that can refine a component abstraction to be accurate enough for successful verification. It is fully automated, and eliminates the need of finding an accurate context when verifying each individual component, although such a context is still highly desirable. This method is also enhanced with additional state space reduction techniques. The experiments on several nontrivial asynchronous designs show that this method efficiently removes impossible behaviors from each component including ones violating correctness requirements.</td> |
---|
674 | </tr> |
---|
675 | <tr id="bib_5374376" class="bibtex noshow"> |
---|
676 | <td colspan="7"><b>BibTeX</b>: |
---|
677 | <pre> |
---|
678 | @article{5374376, |
---|
679 | author = {Hao Zheng and Haiqiong Yao and Yoneda, T.}, |
---|
680 | title = {Modular Model Checking of Large Asynchronous Designs with Efficient Abstraction Refinement}, |
---|
681 | journal = {Computers, IEEE Transactions on}, |
---|
682 | year = {2010}, |
---|
683 | volume = {59}, |
---|
684 | number = {4}, |
---|
685 | pages = {561 -573}, |
---|
686 | doi = {http://dx.doi.org/10.1109/TC.2009.187} |
---|
687 | } |
---|
688 | </pre></td> |
---|
689 | </tr> |
---|
690 | </tbody> |
---|
691 | </table> |
---|
692 | |
---|
693 | <p> |
---|
694 | <small>Created by <a href="http://jabref.sourceforge.net">JabRef</a> on 01/03/2012.</small> |
---|
695 | </p> |
---|
696 | |
---|
697 | </body> |
---|
698 | </html> |
---|
699 | |
---|
700 | <!-- File generated by JabRef ; Export Filter written by Mark Schenk --> |
---|