refactorin

This commit is contained in:
Takashi Tamura 2018-10-12 07:10:35 +09:00
parent dae843e086
commit 6bb3e3f3c0

View File

@ -16,7 +16,7 @@ export class HoverProvider implements vscode.HoverProvider {
const configuration = vscode.workspace.getConfiguration('latex-workshop') const configuration = vscode.workspace.getConfiguration('latex-workshop')
const hov = configuration.get('hoverPreview.enabled') as boolean const hov = configuration.get('hoverPreview.enabled') as boolean
if (hov && this.extension.panel) { if (hov && this.extension.panel) {
const tr = this.getHoverTex(document, position) const tr = this.findHoverOnTex(document, position)
if (tr) { if (tr) {
const scale = configuration.get('hoverPreview.scale') as number const scale = configuration.get('hoverPreview.scale') as number
const [tex, range] = tr const [tex, range] = tr
@ -89,29 +89,29 @@ export class HoverProvider implements vscode.HoverProvider {
} }
private mathjaxify(tex: string, envname: string) : string { private mathjaxify(tex: string, envname: string) : string {
let ret = tex.replace(/^\s*%.*\r?\n/mg, '') let s = tex.replace(/^\s*%.*\r?\n/mg, '')
ret = ret.replace(/^((?:\\.|[^%])*).*$/mg, '$1') s = s.replace(/^((?:\\.|[^%])*).*$/mg, '$1')
ret = ret.replace(/\\label\{.*?\}/g, '') s = s.replace(/\\label\{.*?\}/g, '')
if (envname.match(/^(aligned|alignedat|array|Bmatrix|bmatrix|cases|CD|gathered|matrix|pmatrix|smallmatrix|split|subarray|Vmatrix|vmatrix)$/)) { if (envname.match(/^(aligned|alignedat|array|Bmatrix|bmatrix|cases|CD|gathered|matrix|pmatrix|smallmatrix|split|subarray|Vmatrix|vmatrix)$/)) {
ret = '\\begin{equation}' + ret + '\\end{equation}' s = '\\begin{equation}' + s + '\\end{equation}'
} }
return ret return s
} }
private getHoverTex(document: vscode.TextDocument, position: vscode.Position) : [string, vscode.Range] | undefined { private findHoverOnTex(document: vscode.TextDocument, position: vscode.Position) : [string, vscode.Range] | undefined {
const envBeginPat = /\\begin\{(align|align\*|alignat|alignat\*|aligned|alignedat|array|Bmatrix|bmatrix|cases|CD|eqnarray|eqnarray\*|equation|equation\*|gather|gather\*|gathered|matrix|multline|multline\*|pmatrix|smallmatrix|split|subarray|Vmatrix|vmatrix)\}/ const envBeginPat = /\\begin\{(align|align\*|alignat|alignat\*|aligned|alignedat|array|Bmatrix|bmatrix|cases|CD|eqnarray|eqnarray\*|equation|equation\*|gather|gather\*|gathered|matrix|multline|multline\*|pmatrix|smallmatrix|split|subarray|Vmatrix|vmatrix)\}/
let r = document.getWordRangeAtPosition(position, envBeginPat) let r = document.getWordRangeAtPosition(position, envBeginPat)
if (r) { if (r) {
const envname = this.getFirstRmemberedSubstring(document.getText(r), envBeginPat) const envname = this.getFirstRmemberedSubstring(document.getText(r), envBeginPat)
return this.getHoverEnv(document, envname, r.start) return this.findHoverOnEnv(document, envname, r.start)
} }
const parenBeginPat = /(\\\[|\\\()/ const parenBeginPat = /(\\\[|\\\()/
r = document.getWordRangeAtPosition(position, parenBeginPat) r = document.getWordRangeAtPosition(position, parenBeginPat)
if (r) { if (r) {
const paren = this.getFirstRmemberedSubstring(document.getText(r), parenBeginPat) const paren = this.getFirstRmemberedSubstring(document.getText(r), parenBeginPat)
return this.getHoverParen(document, paren, r.start) return this.findHoverOnParen(document, paren, r.start)
} }
return this.getHoverInline(document, position) return this.findHoverOnInline(document, position)
} }
private getFirstRmemberedSubstring(s: string, pat: RegExp) : string { private getFirstRmemberedSubstring(s: string, pat: RegExp) : string {
@ -147,7 +147,7 @@ export class HoverProvider implements vscode.HoverProvider {
return undefined return undefined
} }
private getHoverEnv(document: vscode.TextDocument, envname: string, startPos: vscode.Position) : [string, vscode.Range] | undefined { private findHoverOnEnv(document: vscode.TextDocument, envname: string, startPos: vscode.Position) : [string, vscode.Range] | undefined {
const pattern = new RegExp('\\\\end\\{' + envpair.escapeRegExp(envname) + '\\}') const pattern = new RegExp('\\\\end\\{' + envpair.escapeRegExp(envname) + '\\}')
const startPos1 = new vscode.Position(startPos.line, startPos.character + envname.length + '\\begin{}'.length) const startPos1 = new vscode.Position(startPos.line, startPos.character + envname.length + '\\begin{}'.length)
const endPos = this.findEndPair(document, pattern, startPos1) const endPos = this.findEndPair(document, pattern, startPos1)
@ -159,7 +159,7 @@ export class HoverProvider implements vscode.HoverProvider {
return undefined return undefined
} }
private getHoverParen(document: vscode.TextDocument, envname: string, startPos: vscode.Position) : [string, vscode.Range] | undefined { private findHoverOnParen(document: vscode.TextDocument, envname: string, startPos: vscode.Position) : [string, vscode.Range] | undefined {
const pattern = envname == '\\[' ? /\\\]/ : /\\\)/ const pattern = envname == '\\[' ? /\\\]/ : /\\\)/
const startPos1 = new vscode.Position(startPos.line, startPos.character + envname.length) const startPos1 = new vscode.Position(startPos.line, startPos.character + envname.length)
const endPos = this.findEndPair(document, pattern, startPos1) const endPos = this.findEndPair(document, pattern, startPos1)
@ -171,15 +171,15 @@ export class HoverProvider implements vscode.HoverProvider {
return undefined return undefined
} }
private getHoverInline(document: vscode.TextDocument, position: vscode.Position) : [string, vscode.Range] | undefined { private findHoverOnInline(document: vscode.TextDocument, position: vscode.Position) : [string, vscode.Range] | undefined {
let b : RegExpMatchArray | null let m : RegExpMatchArray | null
const current_line = document.lineAt(position.line).text const current_line = document.lineAt(position.line).text
let s = current_line let s = current_line
let base = 0 let base = 0
while (b = s.match(/\$(?:\\.|[^\\])+?\$|\\\(.+?\\\)/)) { while (m = s.match(/\$(?:\\.|[^\\])+?\$|\\\(.+?\\\)/)) {
if (b && b.index != null) { if (m && m.index != null) {
const matchStart = base + b.index const matchStart = base + m.index
const matchEnd = base + b.index + b[0].length const matchEnd = base + m.index + m[0].length
if ( matchStart <= position.character && position.character <= matchEnd ) { if ( matchStart <= position.character && position.character <= matchEnd ) {
const range = new vscode.Range(position.line, matchStart, position.line, matchEnd) const range = new vscode.Range(position.line, matchStart, position.line, matchEnd)
const ret = this.mathjaxify( this.renderCursor(document, range), '$' ) const ret = this.mathjaxify( this.renderCursor(document, range), '$' )