@@ -44,6 +44,7 @@ import {
44
44
getCodeElementsInRange ,
45
45
getTokenAtPositionOrRange ,
46
46
HoveredToken ,
47
+ shouldTokenize ,
47
48
} from './token_position'
48
49
import { HoverAttachment , HoverOverlayProps , isPosition , LineOrPositionOrRange , DocumentHighlight } from './types'
49
50
import { emitLoading , MaybeLoadingResult , LOADING } from './loading'
@@ -209,6 +210,14 @@ export interface EventOptions<C extends object> {
209
210
* but a higher z-index than the code view, such as a sticky file header.
210
211
*/
211
212
scrollBoundaries ?: HTMLElement [ ]
213
+
214
+ /**
215
+ * Whether the specific code view should be tokenized. If defined, this is used over
216
+ * the `tokenize` value passed to `createHoverifier`.
217
+ *
218
+ * Useful if some code views on a code host are already tokenized while other code views are not.
219
+ */
220
+ overrideTokenize ?: boolean
212
221
}
213
222
214
223
/**
@@ -549,14 +558,18 @@ export function createHoverifier<C extends object, D, A>({
549
558
// It's important to do this before filtering otherwise navigating from
550
559
// a position, to a line-only position, back to the first position would get ignored
551
560
distinctUntilChanged ( ( a , b ) => isEqual ( a , b ) ) ,
552
- map ( ( { position, codeView, dom, ...rest } ) => {
561
+ map ( ( { position, codeView, dom, overrideTokenize , ...rest } ) => {
553
562
let cell : HTMLElement | null
554
563
let target : HTMLElement | undefined
555
564
let part : DiffPart | undefined
556
565
if ( isPosition ( position ) ) {
557
566
cell = dom . getCodeElementFromLineNumber ( codeView , position . line , position . part )
558
567
if ( cell ) {
559
- target = findElementWithOffset ( cell , { offsetStart : position . character } , tokenize )
568
+ target = findElementWithOffset (
569
+ cell ,
570
+ { offsetStart : position . character } ,
571
+ shouldTokenize ( { tokenize, overrideTokenize } )
572
+ )
560
573
if ( target ) {
561
574
part = dom . getDiffCodePart && dom . getDiffCodePart ( target )
562
575
} else {
@@ -571,6 +584,7 @@ export function createHoverifier<C extends object, D, A>({
571
584
position : { ...position , part } ,
572
585
codeView,
573
586
dom,
587
+ overrideTokenize,
574
588
}
575
589
} )
576
590
)
@@ -590,14 +604,15 @@ export function createHoverifier<C extends object, D, A>({
590
604
map (
591
605
( [
592
606
{ hoverOverlayElement, relativeElement } ,
593
- { target, position, codeView, dom, adjustPosition, resolveContext } ,
607
+ { target, position, codeView, dom, adjustPosition, resolveContext, overrideTokenize , ... rest } ,
594
608
] ) => ( {
595
609
hoverOverlayElement,
596
610
relativeElement,
597
611
target,
598
612
position,
599
613
codeView,
600
614
dom,
615
+ overrideTokenize,
601
616
adjustPosition,
602
617
resolveContext,
603
618
} )
@@ -621,13 +636,19 @@ export function createHoverifier<C extends object, D, A>({
621
636
} ) )
622
637
)
623
638
} ) ,
624
- map ( ( { target, position, codeView, dom, ...rest } ) => ( {
639
+ map ( ( { target, position, codeView, dom, overrideTokenize , ...rest } ) => ( {
625
640
// We should ensure we have the correct dom element to place the overlay above. It is possible
626
641
// that tokens span multiple elements meaning that it's possible for the hover overlay to be
627
642
// placed in the middle of a token.
628
643
target :
629
644
position && isPosition ( position )
630
- ? getTokenAtPositionOrRange ( codeView , position , dom , position . part , tokenize )
645
+ ? getTokenAtPositionOrRange (
646
+ codeView ,
647
+ position ,
648
+ dom ,
649
+ position . part ,
650
+ shouldTokenize ( { tokenize, overrideTokenize } )
651
+ )
631
652
: target ,
632
653
...rest ,
633
654
} ) ) ,
@@ -739,6 +760,7 @@ export function createHoverifier<C extends object, D, A>({
739
760
const hoverObservables : Observable < Observable < {
740
761
eventType : SupportedMouseEvent | 'jump'
741
762
dom : DOMFunctions
763
+ overrideTokenize ?: boolean
742
764
target : HTMLElement
743
765
adjustPosition ?: PositionAdjuster < C >
744
766
codeView : HTMLElement
@@ -805,21 +827,38 @@ export function createHoverifier<C extends object, D, A>({
805
827
map ( position => ( { position, hoverOrError, codeView, part, ...rest } ) )
806
828
)
807
829
} ) ,
808
- switchMap ( ( { scrollBoundaries, hoverOrError, position, codeView, codeViewId, dom, part } ) => {
809
- const highlightedRange = getHighlightedRange ( { hoverOrError, position } )
810
- const hoveredTokenElement = highlightedRange
811
- ? getTokenAtPositionOrRange ( codeView , highlightedRange , dom , part , tokenize )
812
- : undefined
813
- return resetOnBoundaryIntersection ( {
830
+ switchMap (
831
+ ( {
814
832
scrollBoundaries,
815
- codeViewId,
816
- codeView,
817
- highlightedRange,
818
833
hoverOrError,
819
- hoveredTokenElement,
820
- hoverOverlayPosition : undefined ,
821
- } )
822
- } )
834
+ position,
835
+ codeView,
836
+ codeViewId,
837
+ dom,
838
+ part,
839
+ overrideTokenize,
840
+ } ) => {
841
+ const highlightedRange = getHighlightedRange ( { hoverOrError, position } )
842
+ const hoveredTokenElement = highlightedRange
843
+ ? getTokenAtPositionOrRange (
844
+ codeView ,
845
+ highlightedRange ,
846
+ dom ,
847
+ part ,
848
+ shouldTokenize ( { tokenize, overrideTokenize } )
849
+ )
850
+ : undefined
851
+ return resetOnBoundaryIntersection ( {
852
+ scrollBoundaries,
853
+ codeViewId,
854
+ codeView,
855
+ highlightedRange,
856
+ hoverOrError,
857
+ hoveredTokenElement,
858
+ hoverOverlayPosition : undefined ,
859
+ } )
860
+ }
861
+ )
823
862
)
824
863
. subscribe ( ( { codeView, highlightedRange, hoveredTokenElement, ...rest } ) => {
825
864
container . update ( {
@@ -846,6 +885,7 @@ export function createHoverifier<C extends object, D, A>({
846
885
const documentHighlightObservables : Observable < Observable < {
847
886
eventType : SupportedMouseEvent | 'jump'
848
887
dom : DOMFunctions
888
+ overrideTokenize ?: boolean
849
889
target : HTMLElement
850
890
adjustPosition ?: PositionAdjuster < C >
851
891
codeView : HTMLElement
@@ -929,11 +969,17 @@ export function createHoverifier<C extends object, D, A>({
929
969
) ,
930
970
}
931
971
) ,
932
- mergeMap ( ( { positions, codeView, dom, part } ) =>
972
+ mergeMap ( ( { positions, codeView, dom, part, overrideTokenize } ) =>
933
973
positions . pipe (
934
974
map ( highlightedRanges =>
935
975
highlightedRanges . map ( highlightedRange =>
936
- getTokenAtPositionOrRange ( codeView , highlightedRange , dom , part , tokenize )
976
+ getTokenAtPositionOrRange (
977
+ codeView ,
978
+ highlightedRange ,
979
+ dom ,
980
+ part ,
981
+ shouldTokenize ( { tokenize, overrideTokenize } )
982
+ )
937
983
)
938
984
) ,
939
985
map ( elements => ( { elements, codeView, dom, part } ) )
@@ -1053,22 +1099,24 @@ export function createHoverifier<C extends object, D, A>({
1053
1099
1054
1100
// LOCATION CHANGES
1055
1101
subscription . add (
1056
- allPositionJumps . subscribe ( ( { position, scrollElement, codeView, dom : { getCodeElementFromLineNumber } } ) => {
1057
- container . update ( {
1058
- // Remember active position in state for blame and range expansion
1059
- selectedPosition : position ,
1060
- } )
1061
- const codeElements = getCodeElementsInRange ( { codeView, position, getCodeElementFromLineNumber } )
1062
- if ( tokenize ) {
1063
- for ( const { element } of codeElements ) {
1064
- convertNode ( element )
1102
+ allPositionJumps . subscribe (
1103
+ ( { position, scrollElement, codeView, dom : { getCodeElementFromLineNumber } , overrideTokenize } ) => {
1104
+ container . update ( {
1105
+ // Remember active position in state for blame and range expansion
1106
+ selectedPosition : position ,
1107
+ } )
1108
+ const codeElements = getCodeElementsInRange ( { codeView, position, getCodeElementFromLineNumber } )
1109
+ if ( shouldTokenize ( { tokenize, overrideTokenize } ) ) {
1110
+ for ( const { element } of codeElements ) {
1111
+ convertNode ( element )
1112
+ }
1113
+ }
1114
+ // Scroll into view
1115
+ if ( codeElements . length > 0 ) {
1116
+ scrollIntoCenterIfNeeded ( scrollElement , codeView , codeElements [ 0 ] . element )
1065
1117
}
1066
1118
}
1067
- // Scroll into view
1068
- if ( codeElements . length > 0 ) {
1069
- scrollIntoCenterIfNeeded ( scrollElement , codeView , codeElements [ 0 ] . element )
1070
- }
1071
- } )
1119
+ )
1072
1120
)
1073
1121
subscription . add (
1074
1122
resolvedPositions . subscribe ( ( { position } ) => {
0 commit comments