File size: 1,060 Bytes
6556bb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51


/**
 * Indicates position of spans of text inside the string. 
 * (for visual applications only, no semantic sense here.)
 */
interface Span {
	type:  string;
	start: number;
	end:   number;
}

class Displacy {
	
	/**
	 * Render a text string and its entity spans
	 * 
	 * *see displacy-ent.js*
	 */
	static render(text: string, spans: Span[]): string {
		let out = {
			__content: "",
			append(s: string) {
				this.__content += s;
			}
		};
		let offset = 0;
		
		spans.forEach(({ type, start, end }) => {
			const entity = text.slice(start, end);
			const fragments = text.slice(offset, start).split('\n');
			
			fragments.forEach((fragment, i) => {
				out.append(fragment);
				if (fragments.length > 1 && i !== fragments.length - 1) {
					out.append('<br>');
				}
			});
			
			// Breaking change from displacy-ent.js:
			// We do not filter any entity type out.
			out.append(`<mark data-entity=${ type.toLowerCase() }>${ entity }</mark>`);
			
			offset = end;
		});
		
		out.append(text.slice(offset, text.length));
		return out.__content;
	}
}