@@ -36,22 +36,6 @@ let navigator = (~siteUrl: string): DocSearch.navigator => {
3636 },
3737}
3838
39- let getHighlightedTitle : DocSearch .docSearchHit => string = %raw (`
40- function (hit ) {
41- var type = hit .type ;
42- var h = hit ._highlightResult && hit ._highlightResult .hierarchy ;
43- var raw = hit .hierarchy ;
44- try {
45- if (type && type !== ' lvl1' && type !== ' lvl0' ) {
46- var lvl = h && h[type] && h[type].value ;
47- if (lvl) return lvl;
48- }
49- if (h && h .lvl1 && h .lvl1 .value ) return h .lvl1 .value ;
50- } catch (e) {}
51- return (raw && raw .lvl1 ) || ' ' ;
52- }
53- ` )
54-
5539let getSubtitle : DocSearch .docSearchHit => option <string > = %raw (`
5640 function (hit ) {
5741 var type = hit .type ;
@@ -63,6 +47,120 @@ let getSubtitle: DocSearch.docSearchHit => option<string> = %raw(`
6347 }
6448` )
6549
50+ let highlightedValue = (value : Nullable .t <DocSearch .highlightedValue >): option <string > =>
51+ value -> Nullable .toOption -> Option .map (value => value .value )
52+
53+ let highlightedValueWithMarkup = (value : Nullable .t <DocSearch .highlightedValue >): option <string > =>
54+ switch highlightedValue (value ) {
55+ | Some (value ) if value -> String .includes ("<mark>" ) => Some (value )
56+ | _ => None
57+ }
58+
59+ let highlightedHierarchyValue = (
60+ hierarchy : DocSearch .highlightedHierarchy ,
61+ type_ : DocSearch .contentType ,
62+ ): option <string > =>
63+ switch type_ {
64+ | Lvl0 => hierarchy .lvl0 -> highlightedValue
65+ | Lvl1 => hierarchy .lvl1 -> highlightedValue
66+ | Lvl2 => hierarchy .lvl2 -> highlightedValue
67+ | Lvl3 => hierarchy .lvl3 -> highlightedValue
68+ | Lvl4 => hierarchy .lvl4 -> highlightedValue
69+ | Lvl5 => hierarchy .lvl5 -> highlightedValue
70+ | Lvl6 => hierarchy .lvl6 -> highlightedValue
71+ | Content => None
72+ }
73+
74+ let highlightedHierarchyValueWithMarkup = (
75+ hierarchy : DocSearch .highlightedHierarchy ,
76+ type_ : DocSearch .contentType ,
77+ ): option <string > =>
78+ switch type_ {
79+ | Lvl0 => hierarchy .lvl0 -> highlightedValueWithMarkup
80+ | Lvl1 => hierarchy .lvl1 -> highlightedValueWithMarkup
81+ | Lvl2 => hierarchy .lvl2 -> highlightedValueWithMarkup
82+ | Lvl3 => hierarchy .lvl3 -> highlightedValueWithMarkup
83+ | Lvl4 => hierarchy .lvl4 -> highlightedValueWithMarkup
84+ | Lvl5 => hierarchy .lvl5 -> highlightedValueWithMarkup
85+ | Lvl6 => hierarchy .lvl6 -> highlightedValueWithMarkup
86+ | Content => None
87+ }
88+
89+ let firstMarkedText = (html : string ): option <string > => {
90+ switch RegExp .exec (/ <mark >([^ <]+ )<\/ mark >/ , html ) {
91+ | Some (result ) =>
92+ let matches = RegExp .Result .matches (result )
93+ switch matches [0 ] {
94+ | Some (Some (markedText )) => Some (markedText )
95+ | _ => None
96+ }
97+ | None => None
98+ }
99+ }
100+
101+ let markTitlePrefix = (title : string , markedText : string ): string => {
102+ let markedLength = String .length (markedText )
103+ if (
104+ markedLength > 0 && title -> String .toLowerCase -> String .startsWith (markedText -> String .toLowerCase )
105+ ) {
106+ let prefix = String .slice (title , ~start = 0 , ~end = markedLength )
107+ let suffix = String .slice (title , ~start = markedLength )
108+ ` <mark>${prefix}</mark>${suffix}`
109+ } else {
110+ title
111+ }
112+ }
113+
114+ let getSnippetContent = (hit : DocSearch .docSearchHit ): option <string > =>
115+ hit ._snippetResult .content -> highlightedValue
116+
117+ let getApiTitle = (hit : DocSearch .docSearchHit ): option <string > => {
118+ if hit .url -> String .includes ("/docs/manual/api/" ) {
119+ switch (hit .hierarchy .lvl0 -> Nullable .toOption , hit .hierarchy .lvl1 -> Nullable .toOption ) {
120+ | (Some (moduleName ), Some (valueName )) if moduleName !== "" && valueName !== "" =>
121+ let title = ` ${moduleName}.${valueName}`
122+ switch hit -> getSnippetContent -> Option .flatMap (firstMarkedText ) {
123+ | Some (markedText ) => Some (markTitlePrefix (title , markedText ))
124+ | None => Some (title )
125+ }
126+ | _ => None
127+ }
128+ } else {
129+ None
130+ }
131+ }
132+
133+ let getHighlightedTitle = (hit : DocSearch .docSearchHit ): string => {
134+ let highlightedHierarchy = hit ._highlightResult .hierarchy -> Nullable .toOption
135+ let highlightedTitleWithMarkup = highlightedHierarchy -> Option .flatMap (hierarchy =>
136+ switch hit .type_ {
137+ | Lvl0 | Lvl1 => None
138+ | _ => highlightedHierarchyValueWithMarkup (hierarchy , hit .type_ )
139+ }
140+ )
141+
142+ switch highlightedTitleWithMarkup {
143+ | Some (title ) => title
144+ | None =>
145+ switch highlightedHierarchy -> Option .flatMap (hierarchy =>
146+ hierarchy .lvl1 -> highlightedValueWithMarkup
147+ ) {
148+ | Some (title ) => title
149+ | None =>
150+ switch getApiTitle (hit ) {
151+ | Some (title ) => title
152+ | None =>
153+ switch highlightedHierarchy -> Option .flatMap (hierarchy =>
154+ highlightedHierarchyValue (hierarchy , hit .type_ )
155+ ) {
156+ | Some (title ) => title
157+ | None => hit .hierarchy .lvl1 -> Nullable .toOption -> Option .getOr ("" )
158+ }
159+ }
160+ }
161+ }
162+ }
163+
66164let markdownToHtml = (text : string ): string =>
67165 text
68166 // Strip stray backslashes from MDX processing
@@ -90,10 +188,16 @@ let isChildHit = (hit: DocSearch.docSearchHit) =>
90188 | Lvl0 | Lvl1 => hit .url -> String .includes ("#" )
91189 }
92190
191+ let getContentHtml = (hit : DocSearch .docSearchHit ): option <string > =>
192+ switch getSnippetContent (hit ) {
193+ | Some (content ) => Some (content -> markdownToHtml )
194+ | None => hit .content -> Nullable .toOption -> Option .map (markdownToHtml )
195+ }
196+
93197let hitComponent = ({hit , children : _ }: DocSearch .hitComponent ): React .element => {
94198 let titleHtml = getHighlightedTitle (hit )
95199 let subtitle = getSubtitle (hit )
96- let contentHtml = hit . content -> Nullable . toOption -> Option . map ( markdownToHtml )
200+ let contentHtml = getContentHtml ( hit )
97201 let isChild = isChildHit (hit )
98202
99203 <a href = {hit .url }>
0 commit comments