mirror of
https://github.com/Redocly/redoc.git
synced 2024-11-27 11:03:43 +03:00
88 lines
2.0 KiB
TypeScript
88 lines
2.0 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import * as Mark from 'mark.js';
|
|
import { MenuService } from './menu.service';
|
|
|
|
const ROLL_LEN = 5;
|
|
@Injectable()
|
|
export class Marker {
|
|
permInstances = [];
|
|
rolledInstances = new Array(ROLL_LEN);
|
|
term: string;
|
|
|
|
currIdx = -1;
|
|
|
|
constructor(private menu: MenuService) {
|
|
menu.changedActiveItem.subscribe(() => {
|
|
this.roll();
|
|
});
|
|
}
|
|
|
|
addElement(el: Element) {
|
|
this.permInstances.push(new Mark(el));
|
|
}
|
|
|
|
newMarkerAtMenuItem(idx:number) {
|
|
let context = this.menu.getEl(idx);
|
|
|
|
if (this.menu.isTagOrGroupItem(idx)) {
|
|
context = this.menu.getTagInfoEl(idx);
|
|
}
|
|
let newInst = context && new Mark(context);
|
|
if (newInst && this.term) {
|
|
newInst.mark(this.term);
|
|
}
|
|
return newInst;
|
|
}
|
|
|
|
roll() {
|
|
let newIdx = this.menu.activeIdx;
|
|
let diff = newIdx - this.currIdx;
|
|
this.currIdx = newIdx;
|
|
if (diff < 0) {
|
|
diff = - diff;
|
|
for (let i=0; i < Math.min(diff, ROLL_LEN); i++) {
|
|
let prevInst = this.rolledInstances.pop();
|
|
if(prevInst) prevInst.unmark();
|
|
|
|
let idx = newIdx - Math.floor(ROLL_LEN/2) + i;
|
|
let newMark = this.newMarkerAtMenuItem(idx);
|
|
this.rolledInstances.unshift(newMark);
|
|
}
|
|
} else {
|
|
for (let i=0; i < Math.min(diff, ROLL_LEN); i++) {
|
|
let oldInst = this.rolledInstances.shift();
|
|
if (oldInst) oldInst.unmark();
|
|
|
|
let idx = newIdx + Math.floor(ROLL_LEN/2) - i;
|
|
let newMark = this.newMarkerAtMenuItem(idx);
|
|
this.rolledInstances.push(newMark);
|
|
}
|
|
}
|
|
}
|
|
|
|
mark(term: string) {
|
|
this.term = term || null;
|
|
this.remark();
|
|
}
|
|
|
|
remark() {
|
|
for (let marker of this.permInstances) {
|
|
if (marker) {
|
|
marker.unmark();
|
|
if (this.term) marker.mark(this.term);
|
|
}
|
|
}
|
|
for (let marker of this.rolledInstances) {
|
|
if (marker) {
|
|
marker.unmark();
|
|
if (this.term) marker.mark(this.term);
|
|
}
|
|
}
|
|
}
|
|
|
|
unmark() {
|
|
this.term = null;
|
|
this.remark();
|
|
}
|
|
}
|