Commit 6538fdca authored by Dimitri van Heesch's avatar Dimitri van Heesch

Bug 705910 - Indexing and searching cannot treat non ASCII identifiers

parent e193c540
...@@ -138,31 +138,6 @@ class MemberIndexList : public QList<MemberDef> ...@@ -138,31 +138,6 @@ class MemberIndexList : public QList<MemberDef>
uint m_letter; uint m_letter;
}; };
/** @brief maps a unicode character code to a list of T::ElementType's
*/
template<class T>
class LetterToIndexMap : public SIntDict<T>
{
public:
LetterToIndexMap() { SIntDict<T>::setAutoDelete(TRUE); }
int compareItems(QCollection::Item item1, QCollection::Item item2)
{
T *l1=(T *)item1;
T *l2=(T *)item2;
return (int)l1->letter()-(int)l2->letter();
}
void append(uint letter,typename T::ElementType *elem)
{
T *l = SIntDict<T>::find((int)letter);
if (l==0)
{
l = new T(letter);
SIntDict<T>::inSort((int)letter,l);
}
l->append(elem);
}
};
static LetterToIndexMap<MemberIndexList> g_memberIndexLetterUsed[CMHL_Total]; static LetterToIndexMap<MemberIndexList> g_memberIndexLetterUsed[CMHL_Total];
static LetterToIndexMap<MemberIndexList> g_fileIndexLetterUsed[FMHL_Total]; static LetterToIndexMap<MemberIndexList> g_fileIndexLetterUsed[FMHL_Total];
static LetterToIndexMap<MemberIndexList> g_namespaceIndexLetterUsed[NMHL_Total]; static LetterToIndexMap<MemberIndexList> g_namespaceIndexLetterUsed[NMHL_Total];
...@@ -1783,7 +1758,7 @@ class PrefixIgnoreClassList : public ClassList ...@@ -1783,7 +1758,7 @@ class PrefixIgnoreClassList : public ClassList
class AlphaIndexTableCell class AlphaIndexTableCell
{ {
public: public:
AlphaIndexTableCell(int row,int col,uchar letter,ClassDef *cd) : AlphaIndexTableCell(int row,int col,uint letter,ClassDef *cd) :
m_letter(letter), m_class(cd), m_row(row), m_col(col) m_letter(letter), m_class(cd), m_row(row), m_col(col)
{ //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-', { //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-',
// cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>"); // cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>");
...@@ -1914,7 +1889,7 @@ static void writeAlphabeticalClassList(OutputList &ol) ...@@ -1914,7 +1889,7 @@ static void writeAlphabeticalClassList(OutputList &ol)
if (cd->isLinkableInProject() && cd->templateMaster()==0) if (cd->isLinkableInProject() && cd->templateMaster()==0)
{ {
int index = getPrefixIndex(cd->className()); int index = getPrefixIndex(cd->className());
startLetter=toupper(cd->className().at(index))&0xFF; startLetter=getUtf8Code(cd->className(),index);
// Do some sorting again, since the classes are sorted by name with // Do some sorting again, since the classes are sorted by name with
// prefix, which should be ignored really. // prefix, which should be ignored really.
if (cd->getLanguage()==SrcLangExt_VHDL) if (cd->getLanguage()==SrcLangExt_VHDL)
...@@ -1954,7 +1929,7 @@ static void writeAlphabeticalClassList(OutputList &ol) ...@@ -1954,7 +1929,7 @@ static void writeAlphabeticalClassList(OutputList &ol)
{ {
uint l = cl->letter(); uint l = cl->letter();
// add special header cell // add special header cell
tableRows->append(new AlphaIndexTableCell(row,col,(uchar)l,(ClassDef*)0x8)); tableRows->append(new AlphaIndexTableCell(row,col,l,(ClassDef*)0x8));
row++; row++;
tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8)); tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8));
row++; row++;
...@@ -2017,7 +1992,7 @@ static void writeAlphabeticalClassList(OutputList &ol) ...@@ -2017,7 +1992,7 @@ static void writeAlphabeticalClassList(OutputList &ol)
ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
"<tr>" "<tr>"
"<td><div class=\"ah\">&#160;&#160;"); "<td><div class=\"ah\">&#160;&#160;");
ol.writeString(s); ol.writeString(QString(QChar(cell->letter())).utf8());
ol.writeString( "&#160;&#160;</div>" ol.writeString( "&#160;&#160;</div>"
"</td>" "</td>"
"</tr>" "</tr>"
......
...@@ -5,7 +5,7 @@ function convertToId(search) ...@@ -5,7 +5,7 @@ function convertToId(search)
{ {
var c = search.charAt(i); var c = search.charAt(i);
var cn = c.charCodeAt(0); var cn = c.charCodeAt(0);
if (c.match(/[a-z0-9]/)) if (c.match(/[a-z0-9\u0080-\uFFFF]/))
{ {
result+=c; result+=c;
} }
...@@ -310,22 +310,20 @@ function SearchBox(name, resultsPath, inFrame, label) ...@@ -310,22 +310,20 @@ function SearchBox(name, resultsPath, inFrame, label)
var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
var code = searchValue.toLowerCase().charCodeAt(0); var code = searchValue.toLowerCase().charCodeAt(0);
var hexCode; var idxChar = searchValue.substr(0, 1).toLowerCase();
if (code<16) if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
{ {
hexCode="0"+code.toString(16); idxChar = searchValue.substr(0, 2);
}
else
{
hexCode=code.toString(16);
} }
var resultsPage; var resultsPage;
var resultsPageWithSearch; var resultsPageWithSearch;
var hasResultsPage; var hasResultsPage;
if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
if (idx!=-1)
{ {
var hexCode=idx.toString(16);
resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
resultsPageWithSearch = resultsPage+'?'+escape(searchValue); resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
hasResultsPage = true; hasResultsPage = true;
......
...@@ -358,7 +358,7 @@ function main() ...@@ -358,7 +358,7 @@ function main()
$sorted = run_query($query); $sorted = run_query($query);
// Now output the HTML stuff... // Now output the HTML stuff...
// End the HTML form // End the HTML form
end_form(preg_replace("/[^a-zA-Z0-9\-\_\.]/i", " ", $query )); end_form(preg_replace("/[^a-zA-Z0-9\-\_\.\x80-\xFF]/i", " ", $query ));
// report results to the user // report results to the user
report_results($sorted); report_results($sorted);
end_page(); end_page();
......
...@@ -358,7 +358,7 @@ ...@@ -358,7 +358,7 @@
" $sorted = run_query($query);\n" " $sorted = run_query($query);\n"
" // Now output the HTML stuff...\n" " // Now output the HTML stuff...\n"
" // End the HTML form\n" " // End the HTML form\n"
" end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.]/i\", \" \", $query ));\n" " end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.\\x80-\\xFF]/i\", \" \", $query ));\n"
" // report results to the user\n" " // report results to the user\n"
" report_results($sorted);\n" " report_results($sorted);\n"
" end_page();\n" " end_page();\n"
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
" {\n" " {\n"
" var c = search.charAt(i);\n" " var c = search.charAt(i);\n"
" var cn = c.charCodeAt(0);\n" " var cn = c.charCodeAt(0);\n"
" if (c.match(/[a-z0-9]/))\n" " if (c.match(/[a-z0-9\\u0080-\\uFFFF]/))\n"
" {\n" " {\n"
" result+=c;\n" " result+=c;\n"
" }\n" " }\n"
...@@ -310,22 +310,20 @@ ...@@ -310,22 +310,20 @@
" var searchValue = this.DOMSearchField().value.replace(/^ +/, \"\");\n" " var searchValue = this.DOMSearchField().value.replace(/^ +/, \"\");\n"
"\n" "\n"
" var code = searchValue.toLowerCase().charCodeAt(0);\n" " var code = searchValue.toLowerCase().charCodeAt(0);\n"
" var hexCode;\n" " var idxChar = searchValue.substr(0, 1).toLowerCase();\n"
" if (code<16) \n" " if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair\n"
" {\n" " {\n"
" hexCode=\"0\"+code.toString(16);\n" " idxChar = searchValue.substr(0, 2);\n"
" }\n"
" else \n"
" {\n"
" hexCode=code.toString(16);\n"
" }\n" " }\n"
"\n" "\n"
" var resultsPage;\n" " var resultsPage;\n"
" var resultsPageWithSearch;\n" " var resultsPageWithSearch;\n"
" var hasResultsPage;\n" " var hasResultsPage;\n"
"\n" "\n"
" if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')\n" " var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);\n"
" if (idx!=-1)\n"
" {\n" " {\n"
" var hexCode=idx.toString(16);\n"
" resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';\n" " resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';\n"
" resultsPageWithSearch = resultsPage+'?'+escape(searchValue);\n" " resultsPageWithSearch = resultsPage+'?'+escape(searchValue);\n"
" hasResultsPage = true;\n" " hasResultsPage = true;\n"
......
This diff is collapsed.
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <qlist.h> #include <qlist.h>
#include <ctype.h> #include <ctype.h>
#include "types.h" #include "types.h"
#include "sortdict.h"
//-------------------------------------------------------------------- //--------------------------------------------------------------------
...@@ -87,6 +88,33 @@ class TextGeneratorOLImpl : public TextGeneratorIntf ...@@ -87,6 +88,33 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
//-------------------------------------------------------------------- //--------------------------------------------------------------------
/** @brief maps a unicode character code to a list of T::ElementType's
*/
template<class T>
class LetterToIndexMap : public SIntDict<T>
{
public:
LetterToIndexMap() { SIntDict<T>::setAutoDelete(TRUE); }
int compareItems(QCollection::Item item1, QCollection::Item item2)
{
T *l1=(T *)item1;
T *l2=(T *)item2;
return (int)l1->letter()-(int)l2->letter();
}
void append(uint letter,typename T::ElementType *elem)
{
T *l = SIntDict<T>::find((int)letter);
if (l==0)
{
l = new T(letter);
SIntDict<T>::inSort((int)letter,l);
}
l->append(elem);
}
};
//--------------------------------------------------------------------
QCString langToString(SrcLangExt lang); QCString langToString(SrcLangExt lang);
QCString getLanguageSpecificSeparator(SrcLangExt lang,bool classScope=FALSE); QCString getLanguageSpecificSeparator(SrcLangExt lang,bool classScope=FALSE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment