redoc/lib/services/marker.service.ts
2017-02-02 23:13:39 +02:00

91 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.isTagItem(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();
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();
}
updateMark() {
}
}