mirror of
https://github.com/James-Yu/LaTeX-Workshop.git
synced 2024-10-04 07:07:54 +03:00
Store HTML data for PDF position restoration. #2
This commit is contained in:
parent
826f653482
commit
aab0e8899a
@ -4,7 +4,12 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [0.1.8] - 2017-01-05
|
||||
## [0.1.10] - 2017-01-09
|
||||
### Changed
|
||||
- Use HTML data to store PDF position before compilation.
|
||||
- The PDF position can be restored after compilation instead of previous SyncTeX method.
|
||||
|
||||
## [0.1.9] - 2017-01-05
|
||||
### Added
|
||||
- More colorization with textmate tex grammar.
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
"displayName": "LaTeX Workshop",
|
||||
"description": "AIO LaTeX extension to preview, compile, autocomplete, colorize, and more.",
|
||||
"icon": "img/icon.png",
|
||||
"version": "0.1.9",
|
||||
"version": "0.1.10",
|
||||
"publisher": "James-Yu",
|
||||
"license": "MIT",
|
||||
"homepage": "https://github.com/James-Yu/LaTeX-Workshop",
|
||||
|
54
pdfjs/web/latex.js
Normal file
54
pdfjs/web/latex.js
Normal file
@ -0,0 +1,54 @@
|
||||
var query = document.location.search.substring(1);
|
||||
var parts = query.split('&');
|
||||
var server, path;
|
||||
for (var i = 0, ii = parts.length; i < ii; ++i) {
|
||||
var param = parts[i].split('=');
|
||||
if (param[0].toLowerCase() == "server")
|
||||
server = param[1];
|
||||
if (param[0].toLowerCase() == "path")
|
||||
path = param[1];
|
||||
}
|
||||
|
||||
var socket = new WebSocket(server);
|
||||
socket.addEventListener("open", () => socket.send(JSON.stringify({type:"open", path:path})));
|
||||
socket.addEventListener("message", (event) => {
|
||||
var data = JSON.parse(event.data);
|
||||
switch (data.type) {
|
||||
case "synctex":
|
||||
var pos = PDFViewerApplication.pdfViewer._pages[data.data.page-1].viewport.convertToViewportPoint(data.data.x, data.data.y-72);
|
||||
var container = document.getElementById('viewerContainer');
|
||||
container.scrollTop = document.getElementsByClassName('page')[0].offsetHeight * data.data.page - pos[1];
|
||||
break;
|
||||
case "get_position":
|
||||
socket.send(JSON.stringify({type:"position",
|
||||
scale:PDFViewerApplication.pdfViewer.currentScaleValue,
|
||||
scrollTop:document.getElementById('viewerContainer').scrollTop,
|
||||
scrollLeft:document.getElementById('viewerContainer').scrollLeft}));
|
||||
case "position":
|
||||
console.log(data.scale)
|
||||
console.log(data.scrollTop)
|
||||
console.log(data.scrollTop)
|
||||
PDFViewerApplication.pdfViewer.currentScaleValue = data.scale;
|
||||
document.getElementById('viewerContainer').scrollTop = data.scrollTop;
|
||||
document.getElementById('viewerContainer').scrollLeft = data.scrollLeft;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('pagesinit', (e) => {
|
||||
socket.send(JSON.stringify({type:"loaded"}));
|
||||
});
|
||||
|
||||
document.addEventListener('pagerendered', (e) => {
|
||||
var page = e.target.dataset.pageNumber;
|
||||
var target = e.target;
|
||||
var canvas_dom = e.target.childNodes[1];
|
||||
canvas_dom.onclick = (e) => {
|
||||
if (!e.ctrlKey) return;
|
||||
var left = e.pageX - target.offsetLeft + target.parentNode.parentNode.scrollLeft - 9;
|
||||
var top = e.pageY - target.offsetTop + target.parentNode.parentNode.scrollTop - 41;
|
||||
var pos = PDFViewerApplication.pdfViewer._pages[page-1].getPagePoint(left, canvas_dom.offsetHeight - top);
|
||||
socket.send(JSON.stringify({type:"click", path:path, pos:pos, page:page}));
|
||||
}
|
||||
}, true);
|
@ -349,50 +349,7 @@ See https://github.com/adobe-type-tools/cmap-resources
|
||||
|
||||
</div> <!-- outerContainer -->
|
||||
<div id="printContainer"></div>
|
||||
<script>
|
||||
var query = document.location.search.substring(1);
|
||||
var parts = query.split('&');
|
||||
var server, path;
|
||||
for (var i = 0, ii = parts.length; i < ii; ++i) {
|
||||
var param = parts[i].split('=');
|
||||
if (param[0].toLowerCase() == "server")
|
||||
server = param[1];
|
||||
if (param[0].toLowerCase() == "path")
|
||||
path = param[1];
|
||||
}
|
||||
var socket = new WebSocket(server);
|
||||
socket.addEventListener("open", () => socket.send(JSON.stringify({type:"open", path:path})));
|
||||
socket.addEventListener("message", (event) => {
|
||||
var data = JSON.parse(event.data);
|
||||
switch (data.type) {
|
||||
case "synctex":
|
||||
var pos = PDFViewerApplication.pdfViewer._pages[data.data.page-1].viewport.convertToViewportPoint(data.data.x, data.data.y-72);
|
||||
var container = document.getElementById('viewerContainer');
|
||||
container.scrollTop = document.getElementsByClassName('page')[0].offsetHeight * data.data.page - pos[1];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('pagesloaded', (e) => {
|
||||
socket.send(JSON.stringify({type:"pagesloaded"}));
|
||||
});
|
||||
|
||||
document.addEventListener('pagerendered', (e) => {
|
||||
var page = e.target.dataset.pageNumber;
|
||||
var target = e.target;
|
||||
var canvas_dom = e.target.childNodes[1];
|
||||
canvas_dom.onclick = (e) => {
|
||||
if (!e.ctrlKey) return;
|
||||
var left = e.pageX - target.offsetLeft + target.parentNode.parentNode.scrollLeft - 9;
|
||||
var top = e.pageY - target.offsetTop + target.parentNode.parentNode.scrollTop - 41;
|
||||
var pos = PDFViewerApplication.pdfViewer._pages[page-1].getPagePoint(left, canvas_dom.offsetHeight - top);
|
||||
socket.send(JSON.stringify({type:"click", path:path, pos:pos, page:page}));
|
||||
//console.log([page, e.offsetX, e.offsetY, pos])
|
||||
}
|
||||
}, true);
|
||||
</script>
|
||||
<script src="latex.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -4,6 +4,7 @@ import * as path from "path"
|
||||
import * as vscode from 'vscode';
|
||||
import * as latex_workshop from './extension';
|
||||
import * as latex_data from './data';
|
||||
import {getPreviewPosition} from './preview';
|
||||
import {find_main_document} from './utilities';
|
||||
|
||||
var compiling = false,
|
||||
@ -12,6 +13,8 @@ var compiling = false,
|
||||
export async function compile(non_tex_alert=false) {
|
||||
vscode.workspace.saveAll();
|
||||
find_main_document();
|
||||
getPreviewPosition();
|
||||
|
||||
if (latex_data.main_document == undefined) return;
|
||||
|
||||
// Develop file name related variables
|
||||
|
@ -12,6 +12,8 @@ import {find_main_document} from './utilities';
|
||||
var fs = require('fs');
|
||||
var cursor_uri;
|
||||
var cursor_position;
|
||||
var client = undefined;
|
||||
var position = undefined;
|
||||
|
||||
export function preview(file_uri, column) {
|
||||
find_main_document();
|
||||
@ -65,10 +67,7 @@ export async function inPreview(uri, position) {
|
||||
await promise
|
||||
.then((child) => {
|
||||
record = parseSyncTex(child.stdout);
|
||||
for (let [candidate, path] of latex_workshop.preview_provider.clients.entries()) {
|
||||
if (decodeURI(path) != tex2PdfFile(latex_data.main_document)) continue;
|
||||
candidate.send(JSON.stringify({type:"synctex", data:record}))
|
||||
}
|
||||
client.send(JSON.stringify({type:"synctex", data:record}))
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err.stack)
|
||||
@ -109,13 +108,16 @@ function parseSyncTex(out: string) {
|
||||
return record;
|
||||
}
|
||||
|
||||
export function getPreviewPosition() {
|
||||
client.send(JSON.stringify({type:"get_position"}));
|
||||
}
|
||||
|
||||
export class previewProvider implements vscode.TextDocumentContentProvider {
|
||||
private _onDidChange = new vscode.EventEmitter<vscode.Uri>();
|
||||
private resource_path;
|
||||
private http_server;
|
||||
private ws_server;
|
||||
private listening;
|
||||
public clients = new Map<ws, string>();
|
||||
private exec = require('child_process').exec;
|
||||
|
||||
constructor(private context) {
|
||||
@ -123,20 +125,20 @@ export class previewProvider implements vscode.TextDocumentContentProvider {
|
||||
this.http_server = http.createServer();
|
||||
this.ws_server = ws.createServer({server: this.http_server});
|
||||
this.listening = new Promise((c, e) => this.http_server.listen(0, "localhost", undefined, err => err ? e(err) : c()));
|
||||
this.ws_server.on("connection", client => {
|
||||
client.on("message", this.onClientMessage.bind(this, client));
|
||||
client.on("close", this.onClientClose.bind(this, client));
|
||||
this.ws_server.on("connection", ws => {
|
||||
ws.on("message", this.onClientMessage.bind(this, ws));
|
||||
ws.on("close", this.onClientClose.bind(this, ws));
|
||||
});
|
||||
}
|
||||
|
||||
dispose() {}
|
||||
|
||||
private async onClientMessage(client, msg) {
|
||||
private async onClientMessage(ws, msg) {
|
||||
let data = JSON.parse(msg);
|
||||
|
||||
switch (data.type) {
|
||||
case "open":
|
||||
this.clients.set(client, data.path);
|
||||
client = ws;
|
||||
break;
|
||||
case "click":
|
||||
if (!latex_workshop.has_synctex) break;
|
||||
@ -164,20 +166,20 @@ export class previewProvider implements vscode.TextDocumentContentProvider {
|
||||
editor.selection = new vscode.Selection(pos, pos);
|
||||
await vscode.commands.executeCommand("revealLine", {lineNumber: row, at: 'center'});
|
||||
break;
|
||||
case "pagesloaded":
|
||||
inPreview(cursor_uri, cursor_position);
|
||||
case "loaded":
|
||||
if (position != undefined)
|
||||
client.send(JSON.stringify(position));
|
||||
break;
|
||||
case "position":
|
||||
position = data;
|
||||
break;
|
||||
default:
|
||||
console.log(`Unknown command received: ${data.type}`)
|
||||
break;
|
||||
}
|
||||
}
|
||||
private onClientClose(client) {
|
||||
for (let [candidate, path] of this.clients.entries()) {
|
||||
if (candidate == client) {
|
||||
this.clients.delete(candidate);
|
||||
}
|
||||
}
|
||||
private onClientClose(ws) {
|
||||
client = undefined
|
||||
}
|
||||
|
||||
get onDidChange(): vscode.Event<vscode.Uri> {
|
||||
|
Loading…
Reference in New Issue
Block a user