Разметка базы позволяет связывать словарные списки друг с другом, т.е. записи одного могут ссылаться на не текст статей, а на записи другого. Связь списков регулируется параметром LinkType, входящим в блоки LinkOptions и FullTextSEarchOptions, которые описаны здесь.
Это актуально не только для списков полнотекста, которые ссылаются на список с контекстом поиска (этот вариант в статье не рассматривается), но и для любых других типов списков, в т.ч. отображаемых.
- наиболее распространенным вариантом линковки являются ссылки с записи списка с контекстом поиска на оригинальную запись словарного списка (что позволяет приложению перейти из результатов поиска к словарному списку с сохранением выбранного слова)
- другим примером могут являться списки WordOfTheDay и PreloadedFavourites – они являются тематическим набором слов и для удобства работы их записи ссылаются на слова оригинального списка
Рассмотрим пример получения ссылки на оригинальное слово на примере полнотекстового поиска, в котором после поиска список с результатами указывает на eWordListType_FullTextAuxiliary, а он, в свою очередь, на eWordListType_Dictionary:
error = dict->DoFullTextSearch((UInt16*)L"абонемент", 512);
if (error != eOK)
return 0;
Int32 listIndex;
// в реальном приложении интересен цикл по всем результатам, но мы возьмем один из них, чтобы не раздувать пример
Int32 globalIndex = 2;
while (true)
{
// выбираем нужные нам список и слово
error = dict->SetCurrentWordlist(listIndex);
if (error != eOK)
return 0;
error = dict->GetWordByIndex(globalIndex);
if (error != eOK)
return 0;
// получаем информацию о том, куда эта запись ссылается
Int32 realListIndex = SLD_DEFAULT_LIST_INDEX;
dict->GetRealListIndex(globalIndex, &realListIndex);
if (error != eOK)
return 0;
Int32 realGlobalIndex = SLD_DEFAULT_WORD_INDEX;
dict->GetRealGlobalIndex(globalIndex, &realGlobalIndex);
if (error != eOK)
return 0;
// в случае, если ссылка на другой список не нашлась (характеризуется тем, что GetReal-функции возвращают дефолтные индексы),
// прекращаем цикл - мы пришли к последней записи в цепочке
if (realListIndex == SLD_DEFAULT_LIST_INDEX || realGlobalIndex == SLD_DEFAULT_WORD_INDEX)
break;
listIndex = realListIndex;
globalIndex = realGlobalIndex;
}