Skip to main content
Glama
MadCapHighlighter.js6.46 kB
/*! * Copyright MadCap Software * http://www.madcapsoftware.com/ * Unlicensed use is strictly prohibited * * v20.0.8886.22535 */ function FMCClearSearch( win ) { var highlights = FMCGetElementsByClassRoot( win.document.body, "highlight" ); for ( var i = 0; i < highlights.length; i++ ) { var highlight = highlights[i]; var innerSpan = FMCGetChildNodeByTagName( highlight, "SPAN", 0 ); var text = win.document.createTextNode( innerSpan.innerHTML ); highlight.parentNode.replaceChild( text, highlight ); } gColorIndex = 0; gFirstHighlight = null; // At this point, highlight nodes got replaced by text nodes. This causes nodes that were once single text nodes to // become divided into multiple text nodes. Future attempts to highlight multi-character strings may not work // because they may have been divided into multiple text nodes. To solve this, we merge adjacent text nodes. FMCMergeTextNodes( win.document.body ); } function FMCMergeTextNodes( node ) { for ( var i = node.childNodes.length - 1; i >= 1; i-- ) { var currNode = node.childNodes[i]; var prevNode = currNode.previousSibling; if ( currNode.nodeType == 3 && prevNode.nodeType == 3 ) { prevNode.nodeValue = prevNode.nodeValue + currNode.nodeValue; node.removeChild( currNode ); } } for ( var i = 0; i < node.childNodes.length; i++ ) { FMCMergeTextNodes( node.childNodes[i] ); } } function FMCApplyHighlight( win, root, term, color, caseSensitive, searchType ) { var re = null; // Removed the "else" for better support of partial word highlighting //if ( searchType == "NGram" ) //{ re = new RegExp("(?:^|\\s)(" + term + ")(?=\\s|[^\\w\\s]|$)", "g" + (caseSensitive ? "" : "i")); //} //else //{ // Removed this for better support of partial word highlighting //re = new RegExp( "(^|\\s|[.,;!#$/:?'\"()[\\]{}|=+*_\\-\\\\])" + FMCEscapeRegEx( term ) + "($|\\s|[.,;!#$/:?'\"()[\\]{}|=+*_\\-\\\\])", "g" + (caseSensitive ? "" : "i") ); //} for ( var i = root.childNodes.length - 1; i >= 0; i-- ) { var node = root.childNodes[i]; FMCApplyHighlight( win, node, term, color, caseSensitive, searchType ); if ( node.nodeType != 3 || node.parentNode.nodeName == "SCRIPT" ) { continue; } var currNode = node; var text = currNode.nodeValue; for ( var match = re.exec( text ); match != null; match = re.exec( text ) ) { // Used to be match[1].length, that wouldn't work, so i changed it to 0 var pos = match.index; for(var i = 0; text.charAt(match.index + i).match(/\s/g) != null && i < match.length; i++){ pos++; } var posEnd = pos + term.length; var span = win.document.createElement( "span" ); span.className = "highlight"; span.style.fontWeight = "bold"; span.style.backgroundColor = color.split( "," )[0]; span.style.color = color.split( "," )[1]; var span2 = win.document.createElement( "span" ); span2.className = "SearchHighlight" + (gColorIndex + 1); span2.appendChild( win.document.createTextNode( text.substring( pos, posEnd ) ) ); span.appendChild( span2 ); currNode.nodeValue = text.substring( 0, pos ); currNode.parentNode.insertBefore( span, currNode.nextSibling ); currNode.parentNode.insertBefore( win.document.createTextNode( text.substring( posEnd, text.length ) ), span.nextSibling ); currNode = currNode.nextSibling.nextSibling; text = currNode.nodeValue; // if ( gFirstHighlight == null || span.offsetTop < gFirstHighlight.offsetTop ) { gFirstHighlight = span; } // FMCUnhide( win, span ); } } } function FMCHighlight( win, term, color, caseSensitive, searchType ) { if ( term == "" ) { return; } FMCApplyHighlight( win, win.document.body, term, color, caseSensitive, searchType ); // Scroll to first highlighted term if ( gFirstHighlight && gFirstHighlight.offsetTop > win.document.documentElement.clientHeight ) { win.document.documentElement.scrollTop = gFirstHighlight.offsetTop; win.document.body.scrollTop = gFirstHighlight.offsetTop; } } function FMCHighlightUrl( win ) { gColorIndex = 0; gFirstHighlight = null; var url = win.document.location.search; if ( String.IsNullOrEmpty( url ) ) { return; } url = decodeURIComponent( url ); var pos = url.indexOf( "SearchType" ); var ampPos = -1; var searchType = null; if ( pos >= 0 ) { ampPos = url.indexOf( "&", pos ); searchType = url.substring( 1 + pos + "SearchType".length, ampPos >= 0 ? ampPos : url.length ); } pos = url.indexOf( "Highlight" ); if ( pos >= 0 ) { ampPos = url.indexOf( "&", pos ); var highlight = url.substring( 1 + pos + "Highlight".length, ampPos >= 0 ? ampPos : url.length ); var stems = highlight.split( "||" ); for ( var i = 0; i < stems.length; i++ ) { var phrases = stems[i].split( "|" ); for ( var j = 0; j < phrases.length; j++ ) { FMCHighlight( win, phrases[j], gColorTable[gColorIndex], false, searchType ); } gColorIndex = (++gColorIndex) % 10; } } } if (gRuntimeFileType == "Topic") { var gColorTable = new Array( "#ffff66,#000000", "#a0ffff,#000000", "#99ff99,#000000", "#ff9999,#000000", "#ff66ff,#000000", "#880000,#ffffff", "#00aa00,#ffffff", "#886800,#ffffff", "#004699,#ffffff", "#990099,#ffffff" ); var gColorIndex = 0; var gFirstHighlight = null; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/multiluca2020/visum-thinker-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server