Store HTML data for PDF position restoration. #2

This commit is contained in:
James-Yu 2017-01-09 09:35:01 +08:00
parent 826f653482
commit aab0e8899a
6 changed files with 85 additions and 64 deletions

View File

@ -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.

View File

@ -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
View 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);

View File

@ -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>

View File

@ -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

View File

@ -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> {