mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-04-03 07:01:38 +00:00
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import hljs from 'highlight.js';
|
|
|
|
@Injectable({ providedIn: 'root' })
|
|
export class FuseHighlightService {
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Public methods
|
|
// -----------------------------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Highlight
|
|
*/
|
|
highlight(code: string, language: string): string {
|
|
// Format the code
|
|
code = this._format(code);
|
|
|
|
// Highlight and return the code
|
|
return hljs.highlight(code, { language }).value;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ 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 indentation = 0;
|
|
|
|
// 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
|
|
lines
|
|
.filter((line) => line.length)
|
|
.forEach((line, index) => {
|
|
// Always get the indentation of the first line so we can
|
|
// have something to compare with
|
|
if (index === 0) {
|
|
indentation = line.search(/\S|$/);
|
|
return;
|
|
}
|
|
|
|
// Look at all the remaining lines to figure out the smallest indentation.
|
|
indentation = Math.min(line.search(/\S|$/), indentation);
|
|
});
|
|
|
|
// Iterate through the lines one more time, remove the extra
|
|
// indentation, join them together and return it
|
|
return lines.map((line) => line.substring(indentation)).join('\n');
|
|
}
|
|
}
|