Skip to content
This repository was archived by the owner on Apr 9, 2020. It is now read-only.

Commit debb198

Browse files
authored
Merge pull request #44 from cssho/zoon-in-out
implement zoon in/out (#43)
2 parents 523806e + 273addd commit debb198

File tree

7 files changed

+64
-7
lines changed

7 files changed

+64
-7
lines changed

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"request": "launch",
99
"runtimeExecutable": "${execPath}",
1010
"args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
11-
"stopOnEntry": true,
11+
"stopOnEntry": false,
1212
"sourceMaps": true,
1313
"outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
1414
"preLaunchTask": "npm: watch"

README-ja.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ EXPLORERのコンテキストメニューからSVGをプレビューする
2121
### View SVG - `Alt+Shift+S O`
2222
SVGをエディタ上で表示
2323

24+
#### 拡大/縮小
25+
ctrl/cmdキーを押しながらマウスホイールを上下
26+
2427
### Export PNG - `Alt+Shift+S E`
2528
SVGをPNGに変換
2629

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ Viewing an SVG file from explorer context menu.
2222
### View SVG - `Alt+Shift+S O`
2323
Display SVG on an Editor
2424

25+
#### Zoom in/out
26+
Holding ctrl/cmd and using mouse wheel(up/down)
27+
2528
### Export PNG - `Alt+Shift+S E`
2629
Convert from SVG to PNG
2730

media/preview.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const regexp = /scale\(([0-9\.]+)\)/g;
2+
window.addEventListener("load", function () {
3+
document.onwheel = function (event) {
4+
if (event.ctrlKey) {
5+
if (event.wheelDeltaY < 0) zoomOut();
6+
else zoomIn();
7+
}
8+
}
9+
}, false);
10+
11+
function zoomIn() {
12+
var svgimg = document.getElementById('svgimg');
13+
var zoomFloat = currentZoomValue(svgimg);
14+
zoomFloat += zoomFloat * 0.1;
15+
svgimg.style.transform = 'scale(' + zoomFloat + ')';
16+
}
17+
18+
function zoomOut() {
19+
var svgimg = document.getElementById('svgimg');
20+
var zoomFloat = currentZoomValue(svgimg);
21+
zoomFloat -= zoomFloat * 0.1;
22+
if (zoomFloat < 0.1) return;
23+
svgimg.style.transform = 'scale(' + zoomFloat + ')';
24+
};
25+
26+
function currentZoomValue(svgimg) {
27+
var zoom;
28+
if (svgimg.style.transform) {
29+
var array;
30+
while ((array = regexp.exec(svgimg.style.transform)) !== null) {
31+
zoom = array[1];
32+
}
33+
} else
34+
zoom = '1.0';
35+
var zoomFloat = parseFloat(zoom);
36+
return zoomFloat;
37+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "vscode-svgviewer",
33
"displayName": "SVG Viewer",
44
"description": "SVG Viewer for Visual Studio Code.",
5-
"version": "1.4.4",
5+
"version": "1.4.5",
66
"publisher": "cssho",
77
"engines": {
88
"vscode": "^1.12.0"

src/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function activate(context: vscode.ExtensionContext) {
2323
path.join(path.dirname(phantomjs.path), 'phantom', 'bin', 'phantomjs');
2424
}
2525

26-
let provider = new SvgDocumentContentProvider();
26+
let provider = new SvgDocumentContentProvider(context);
2727
let registration = vscode.workspace.registerTextDocumentContentProvider('svg-preview', provider);
2828

2929
let fileUriProviders = new Map<string, { uri: vscode.Uri, provider: SvgFileContentProvider, registration: vscode.Disposable }>();
@@ -70,7 +70,7 @@ export function activate(context: vscode.ExtensionContext) {
7070
let fileUriProvider = fileUriProviders.get(fName);
7171
if (fileUriProvider == undefined) {
7272
let fileUri = getSvgUri(uri);
73-
let fileProvider = new SvgFileContentProvider(fileUri, document.fileName);
73+
let fileProvider = new SvgFileContentProvider(context, fileUri, document.fileName);
7474
let fileRegistration = vscode.workspace.registerTextDocumentContentProvider('svg-preview', fileProvider);
7575
fileUriProvider = { uri: fileUri, provider: fileProvider, registration: fileRegistration };
7676
fileUriProviders.set(fName, fileUriProvider);

src/svgProvider.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
import * as vscode from 'vscode';
4+
import * as path from 'path';
45
import fs = require('fs')
56

67
export function getSvgUri(uri: vscode.Uri) {
@@ -19,6 +20,8 @@ export class SvgDocumentContentProvider implements vscode.TextDocumentContentPro
1920
private _onDidChange = new vscode.EventEmitter<vscode.Uri>();
2021
private _waiting: boolean = false;
2122

23+
public constructor(protected context: vscode.ExtensionContext) {}
24+
2225
public provideTextDocumentContent(uri: vscode.Uri): Thenable<string> {
2326
let sourceUri = vscode.Uri.parse(uri.query);
2427
console.log(sourceUri);
@@ -44,6 +47,10 @@ export class SvgDocumentContentProvider implements vscode.TextDocumentContentPro
4447
}
4548
}
4649

50+
private getPath(file: string): string {
51+
return path.join(this.context.extensionPath, file);
52+
}
53+
4754
protected snippet(properties): string {
4855
let showTransGrid = vscode.workspace.getConfiguration('svgviewer').get('transparencygrid');
4956
let transparencycolor = vscode.workspace.getConfiguration('svgviewer').get('transparencycolor');
@@ -54,6 +61,7 @@ export class SvgDocumentContentProvider implements vscode.TextDocumentContentPro
5461
<style type="text/css">
5562
.svgbg img {
5663
background: `+ transparencycolor + `;
64+
transform-origin: top left;
5765
}
5866
</style>`;
5967
} else {
@@ -63,18 +71,24 @@ export class SvgDocumentContentProvider implements vscode.TextDocumentContentPro
6371
background:initial;
6472
background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAeUlEQVRYR+3XMQ4AIQhEUTiU9+/hUGy9Wk2G8luDIS8EMWdmYvF09+JtEUmBpieCJiA96AIiiKAswEsik10JCCIoCrAsiGBPOIK2YFWt/knOOW5Nv/ykQNMTQRMwEERQFWAOqmJ3PIIIigIMahHs3ahZt0xCetAEjA99oc8dGNmnIAAAAABJRU5ErkJggg==);
6573
background-position: left,top;
74+
transform-origin: top left;
6675
}
6776
</style>`;
6877
}
6978
}
70-
return `<!DOCTYPE html><html><head>${transparencyGridCss}</head><body><div class="svgbg"><img src="data:image/svg+xml,${encodeURIComponent(properties)}"></div></body></html>`;
79+
80+
return `<!DOCTYPE html><html><head>${transparencyGridCss}
81+
<script src="${this.getPath('media/preview.js')}"></script>
82+
</script></head><body>
83+
<div class="svgbg"><img id="svgimg" src="data:image/svg+xml,${encodeURIComponent(properties)}"></div>
84+
</body></html>`;
7185
}
7286
}
7387

7488
export class SvgFileContentProvider extends SvgDocumentContentProvider {
7589
filename: string;
76-
constructor(previewUri: vscode.Uri, filename: string) {
77-
super();
90+
constructor(protected context: vscode.ExtensionContext,previewUri: vscode.Uri, filename: string) {
91+
super(context);
7892
this.filename = filename;
7993
vscode.workspace.createFileSystemWatcher(this.filename, true, false, true).onDidChange((e: vscode.Uri) => {
8094
this.update(previewUri);

0 commit comments

Comments
 (0)