You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
scrutiny/webapp/frontend/src/@treo/components/highlight/highlight.service.ts

88 lines
2.6 KiB

import { Injectable } from '@angular/core';
import * as hljs from 'highlight.js';
@Injectable({
providedIn: 'root'
})
export class TreoHighlightService
{
/**
* Constructor
*/
constructor()
{
}
// -----------------------------------------------------------------------------------------------------
// @ Private methods
// -----------------------------------------------------------------------------------------------------
/**
* Remove the empty lines around the code block
* and re-align the indentation based on the first
* non-whitespace indented character
*
* @param code
* @private
*/
private _format(code: string): string
{
let firstCharIndentation: number | null = null;
// Split the code into lines and store the lines
const lines = code.split('\n');
// Trim the empty lines around the code block
while ( lines.length && lines[0].trim() === '' )
{
lines.shift();
}
while ( lines.length && lines[lines.length - 1].trim() === '' )
{
lines.pop();
}
// Iterate through the lines to figure out the first
// non-whitespace character indentation
lines.forEach((line) => {
// Skip the line if its length is zero
if ( line.length === 0 )
{
return;
}
// We look at all the lines to find the smallest indentation
// of the first non-whitespace char since the first ever line
// is not necessarily has to be the line with the smallest
// non-whitespace char indentation
firstCharIndentation = firstCharIndentation === null ?
line.search(/\S|$/) :
Math.min(line.search(/\S|$/), firstCharIndentation);
});
// Iterate through the lines one more time, remove the extra
// indentation, join them together and return it
return lines.map((line) => {
return line.substring(firstCharIndentation);
}).join('\n');
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Highlight
*/
highlight(code: string, language: string): string
{
// Format the code
code = this._format(code);
// Highlight and return the code
return hljs.highlight(language, code).value;
}
}