diff --git a/src/WinPrint.Console/WinPrint.Console.csproj b/src/WinPrint.Console/WinPrint.Console.csproj index 3e53c59..719b5fd 100644 --- a/src/WinPrint.Console/WinPrint.Console.csproj +++ b/src/WinPrint.Console/WinPrint.Console.csproj @@ -9,7 +9,7 @@ winprint - 2.0.4.100 + 2.0.4.103 Kindel Systems winprint Charlie Kindel diff --git a/src/WinPrint.Core/ViewModels/SheetViewModel.cs b/src/WinPrint.Core/ViewModels/SheetViewModel.cs index b9ccfc0..bcd8ee5 100644 --- a/src/WinPrint.Core/ViewModels/SheetViewModel.cs +++ b/src/WinPrint.Core/ViewModels/SheetViewModel.cs @@ -194,19 +194,17 @@ protected void OnReflowProgress(string msg) { ReflowProgress?.Invoke(this, msg); } - public bool CacheEnabled { get => _cacheEnabled; set => SetField(ref _cacheEnabled, value); } - - private bool _cacheEnabled = false; - + public class SheetViewModelSettingsChangedEvent { + public bool Reflow { get; set; } + public string PropertyName { get; set; } + } // if bool is true, reflow. Otherwise just paint - public event EventHandler SettingsChanged; - protected void OnSettingsChanged(bool reflow) { + public event EventHandler SettingsChanged; + protected void OnSettingsChanged(bool reflow, string propertyName) { LogService.TraceMessage(); - SettingsChanged?.Invoke(this, reflow); - } - // Caching of pages as bitmaps. Enables faster paint/zoom as well as usage from XAML - private List _cachedSheets = new List(); + SettingsChanged?.Invoke(this, new SheetViewModelSettingsChangedEvent() { Reflow = reflow, PropertyName = propertyName }) ; + } public SheetViewModel() { } @@ -225,8 +223,6 @@ public void Reset() { ContentEngine.PropertyChanged -= OnContentEnginePropertyChanged(); ContentEngine = null; } - - ClearCache(); _numPages = 0; } @@ -269,17 +265,17 @@ public void SetSheet(SheetSettings newSheet) { } if (_headerVM != null) { - _headerVM.SettingsChanged -= (s, reflow) => OnSettingsChanged(reflow); + _headerVM.SettingsChanged -= (s, reflow) => OnSettingsChanged(reflow, "Header"); } Header = new HeaderViewModel(this, newSheet.Header); - _headerVM.SettingsChanged += (s, reflow) => OnSettingsChanged(reflow); + _headerVM.SettingsChanged += (s, reflow) => OnSettingsChanged(reflow, "Header"); if (_footerVM != null) { - _footerVM.SettingsChanged -= (s, reflow) => OnSettingsChanged(reflow); + _footerVM.SettingsChanged -= (s, reflow) => OnSettingsChanged(reflow, "Footer"); } Footer = new FooterViewModel(this, newSheet.Footer); - _footerVM.SettingsChanged += (s, reflow) => OnSettingsChanged(reflow); + _footerVM.SettingsChanged += (s, reflow) => OnSettingsChanged(reflow, "Footer"); // Subscribe to all settings properties newSheet.PropertyChanged += OnSheetPropertyChanged(); @@ -532,10 +528,6 @@ public async Task ReflowAsync() { Ready = false; - if (CacheEnabled) { - ClearCache(); - } - if (ContentEngine is null) { LogService.TraceMessage("SheetViewModel.ReflowAsync - ContentEngine is null"); return; @@ -590,18 +582,6 @@ public SheetSettings FindSheet(string sheetName, out string sheetID) { return sheet; } - private void ClearCache() { - if (!CacheEnabled) { - return;// throw new InvalidOperationException("Cache is not enabled!"); - } - - LogService.TraceMessage(); - foreach (var i in _cachedSheets) { - i.Dispose(); - } - _cachedSheets.Clear(); - } - private System.ComponentModel.PropertyChangedEventHandler OnSheetPropertyChanged() { return (s, e) => { var reflow = false; @@ -643,7 +623,7 @@ private System.ComponentModel.PropertyChangedEventHandler OnSheetPropertyChanged default: throw new InvalidOperationException($"Property change not handled: {e.PropertyName}"); } - OnSettingsChanged(reflow); + OnSettingsChanged(reflow, e.PropertyName); }; } @@ -710,7 +690,7 @@ private System.ComponentModel.PropertyChangedEventHandler OnContentSettingsPrope default: throw new InvalidOperationException($"Property change not handled: {e.PropertyName}"); } - OnSettingsChanged(reflow); + OnSettingsChanged(reflow, e.PropertyName); }; } @@ -738,7 +718,7 @@ private System.ComponentModel.PropertyChangedEventHandler OnContentEnginePropert return; } - OnSettingsChanged(reflow); + OnSettingsChanged(reflow, e.PropertyName); }; } @@ -813,38 +793,6 @@ public void PrintSheet(Graphics graphics, int sheetNum) { graphics.Restore(state); } - - /// - /// Returns an Image with the specified sheet painted on it. Image will be of the size & resolution of the selected printer. - /// - /// Sheet to print. 1-based. - /// - public Image GetCachedSheet(Graphics graphics, int sheetNum) { - if (!CacheEnabled) { - throw new InvalidOperationException("Cache is not enabled!"); - } - - const int dpiMultiplier = 1; - float xDpi = PrinterResolution.X * dpiMultiplier; - float yDpi = PrinterResolution.Y * dpiMultiplier; - var xRes = (int)(Bounds.Width / 100 * xDpi); - var yRes = (int)(Bounds.Height / 100 * yDpi); - if (_cachedSheets.Count < sheetNum) { - // Create a new bitmap object with the resolution of a printer page - var bmp = new Bitmap(xRes, yRes); - //bmp.SetResolution(xDpi, yDpi); - - // Obtain a Graphics object from that bitmap - var g = Graphics.FromImage(bmp); - g.PageUnit = GraphicsUnit.Pixel; - PaintSheet(g, sheetNum); - _cachedSheets.Add(bmp); - } - - LogService.TraceMessage($"GetCachedSheet({sheetNum}) returning image."); - return _cachedSheets[sheetNum - 1]; - } - private void PaintSheet(Graphics g, int sheetNum) { LogService.TraceMessage($"{sheetNum}"); // background needs to be filled image scaling to work right diff --git a/src/WinPrint.Core/WinPrint.Core.csproj b/src/WinPrint.Core/WinPrint.Core.csproj index 203aff6..f6997e9 100644 --- a/src/WinPrint.Core/WinPrint.Core.csproj +++ b/src/WinPrint.Core/WinPrint.Core.csproj @@ -4,7 +4,7 @@ netcoreapp3.1 AnyCPU;x64;x86 - 2.0.4.100 + 2.0.4.105 Kindel Systems winprint Charlie Kindel diff --git a/src/WinPrint.Installer/setup.cs b/src/WinPrint.Installer/setup.cs index 630c288..71293f1 100644 --- a/src/WinPrint.Installer/setup.cs +++ b/src/WinPrint.Installer/setup.cs @@ -13,7 +13,6 @@ private static void Main() { var versionFile = $"{sourceBaseDir}\\WinPrint.Core.dll"; Debug.WriteLine($"version path: {versionFile}"); var info = FileVersionInfo.GetVersionInfo(versionFile); - var feature = new Feature(new Id("winprint")); var project = new Project(info.ProductName, new EnvironmentVariable("PATH", "[INSTALLDIR]") { Part = EnvVarPart.last }) { @@ -40,21 +39,6 @@ private static void Main() { new ExeFileShortcut("WinPrint", "[INSTALLDIR]winprintgui.exe", arguments: "")) }, - //Binaries = new[] { - //}, - - //Actions = new[] { - // new InstalledFileAction("winprintgui_exe", "") - // { - // Step = Step.InstallFinalize, - // When = When.After, - // Return = Return.asyncNoWait, - // Execute = Execute.immediate, - // Impersonate = true, - // //Condition = Feature.BeingInstall(), - // } - //}, - Properties = new[]{ //setting property to be used in install condition new Property("ALLUSERS", "1"), @@ -68,7 +52,7 @@ private static void Main() { project.SourceBaseDir = sourceBaseDir; project.OutDir = outDir; - project.Version = new Version(info.ProductVersion); //new Version("2.0.1.10040"); + project.Version = new Version(info.ProductVersion); project.MajorUpgrade = new MajorUpgrade { Schedule = UpgradeSchedule.afterInstallInitialize, AllowSameVersionUpgrades = true, @@ -76,8 +60,6 @@ private static void Main() { }; project.Platform = Platform.x64; - //project.LicenceFile = "license.rtf"; - project.ControlPanelInfo.Comments = $"winprint by Charlie Kindel"; project.ControlPanelInfo.Readme = "https://tig.github.io/winprint"; project.ControlPanelInfo.HelpLink = "https://tig.github.io/winprint"; @@ -86,16 +68,9 @@ private static void Main() { project.ControlPanelInfo.Manufacturer = info.CompanyName; project.ControlPanelInfo.InstallLocation = "[INSTALLDIR]"; project.ControlPanelInfo.NoModify = true; - //project.ControlPanelInfo.NoRepair = true, - //project.ControlPanelInfo.NoRemove = true, - //project.ControlPanelInfo.SystemComponent = true, //if set will not be shown in Control Panel project.PreserveTempFiles = true; - //project.UI = WUI.WixUI_ProgressOnly; - - //project.RemoveDialogsBetween(NativeDialogs.WelcomeDlg, NativeDialogs.); - //project.SetNetFxPrerequisite("NETFRAMEWORK20='#1'"); project.EmbeddedUI = new EmbeddedAssembly(System.Reflection.Assembly.GetExecutingAssembly().Location); diff --git a/src/WinPrint.WinForms/MainWindow.Designer.cs b/src/WinPrint.WinForms/MainWindow.Designer.cs index cd7c23c..95704c0 100644 --- a/src/WinPrint.WinForms/MainWindow.Designer.cs +++ b/src/WinPrint.WinForms/MainWindow.Designer.cs @@ -99,6 +99,7 @@ private void InitializeComponent() this.dummyButton.Location = new System.Drawing.Point(0, 33); this.dummyButton.Margin = new System.Windows.Forms.Padding(0); this.dummyButton.Name = "dummyButton"; + this.dummyButton.Padding = new System.Windows.Forms.Padding(20); this.dummyButton.Size = new System.Drawing.Size(835, 647); this.dummyButton.TabIndex = 0; this.dummyButton.Text = "dummyButton"; @@ -373,11 +374,6 @@ private void InitializeComponent() // padding // this.padding.DecimalPlaces = 2; - this.padding.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); this.padding.Location = new System.Drawing.Point(92, 82); this.padding.Name = "padding"; this.padding.Size = new System.Drawing.Size(57, 23); @@ -405,37 +401,17 @@ private void InitializeComponent() // columns // this.columns.Location = new System.Drawing.Point(92, 53); - this.columns.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); this.columns.Name = "columns"; this.columns.Size = new System.Drawing.Size(57, 23); this.columns.TabIndex = 13; - this.columns.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); this.columns.ValueChanged += new System.EventHandler(this.columns_ValueChanged); // // rows // this.rows.Location = new System.Drawing.Point(92, 23); - this.rows.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); this.rows.Name = "rows"; this.rows.Size = new System.Drawing.Size(57, 23); this.rows.TabIndex = 13; - this.rows.Value = new decimal(new int[] { - 1, - 0, - 0, - 0}); this.rows.ValueChanged += new System.EventHandler(this.rows_ValueChanged); // // groupMargins @@ -469,20 +445,10 @@ private void InitializeComponent() // this.leftMargin.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.leftMargin.DecimalPlaces = 2; - this.leftMargin.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); this.leftMargin.Location = new System.Drawing.Point(38, 50); this.leftMargin.Name = "leftMargin"; this.leftMargin.Size = new System.Drawing.Size(57, 23); this.leftMargin.TabIndex = 4; - this.leftMargin.Value = new decimal(new int[] { - 25, - 0, - 0, - 131072}); this.leftMargin.ValueChanged += new System.EventHandler(this.leftMargin_ValueChanged); // // labelRight @@ -498,20 +464,10 @@ private void InitializeComponent() // this.rightMargin.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.rightMargin.DecimalPlaces = 2; - this.rightMargin.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); this.rightMargin.Location = new System.Drawing.Point(144, 50); this.rightMargin.Name = "rightMargin"; this.rightMargin.Size = new System.Drawing.Size(57, 23); this.rightMargin.TabIndex = 3; - this.rightMargin.Value = new decimal(new int[] { - 25, - 0, - 0, - 131072}); this.rightMargin.ValueChanged += new System.EventHandler(this.rightMargin_ValueChanged); // // labelBottom @@ -527,20 +483,10 @@ private void InitializeComponent() // this.bottomMargin.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.bottomMargin.DecimalPlaces = 2; - this.bottomMargin.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); this.bottomMargin.Location = new System.Drawing.Point(92, 80); this.bottomMargin.Name = "bottomMargin"; this.bottomMargin.Size = new System.Drawing.Size(57, 23); this.bottomMargin.TabIndex = 4; - this.bottomMargin.Value = new decimal(new int[] { - 25, - 0, - 0, - 131072}); this.bottomMargin.ValueChanged += new System.EventHandler(this.bottomMargin_ValueChanged); // // labelTop @@ -556,20 +502,10 @@ private void InitializeComponent() // this.topMargin.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.topMargin.DecimalPlaces = 2; - this.topMargin.Increment = new decimal(new int[] { - 1, - 0, - 0, - 131072}); this.topMargin.Location = new System.Drawing.Point(92, 19); this.topMargin.Name = "topMargin"; this.topMargin.Size = new System.Drawing.Size(57, 23); this.topMargin.TabIndex = 1; - this.topMargin.Value = new decimal(new int[] { - 25, - 0, - 0, - 131072}); this.topMargin.ValueChanged += new System.EventHandler(this.topMargin_ValueChanged); // // comboBoxSheet diff --git a/src/WinPrint.WinForms/MainWindow.cs b/src/WinPrint.WinForms/MainWindow.cs index 01d0b41..c5be9f1 100644 --- a/src/WinPrint.WinForms/MainWindow.cs +++ b/src/WinPrint.WinForms/MainWindow.cs @@ -43,6 +43,7 @@ public MainWindow() { BackColor = dummyButton.BackColor, Location = dummyButton.Location, Margin = dummyButton.Margin, + Padding = dummyButton.Padding, Name = "printPreview", Size = dummyButton.Size, MinimumSize = new Size(0, 0), @@ -351,17 +352,26 @@ private void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs } } - private void SettingsChangedEventHandler(object o, bool reflow) { + private void SettingsChangedEventHandler(object o, SheetViewModel.SheetViewModelSettingsChangedEvent e) { if (InvokeRequired) { - BeginInvoke((Action)(() => SettingsChangedEventHandler(o, reflow))); + BeginInvoke((Action)(() => SettingsChangedEventHandler(o, e))); } else { - LogService.TraceMessage($"{reflow}"); - if (reflow) { + LogService.TraceMessage($"{e.Reflow}"); + if (e.Reflow) { LoadFile(); } else { - //printPreview.Invalidate(); + //if (e.PropertyName.Equals("Header")) { + // printPreview.Invalidate(Rectangle.Round(printPreview.SheetViewModel.Header.Bounds)); + //} + //else if (e.PropertyName.Equals("Footer")) { + // printPreview.Invalidate(Rectangle.Round(printPreview.SheetViewModel.Footer.Bounds)); + //} + //else { + // printPreview.Invalidate(); + //} + printPreview.Invalidate(); } } } diff --git a/src/WinPrint.WinForms/PrintPreview.cs b/src/WinPrint.WinForms/PrintPreview.cs index 8cc05ad..4f4d448 100644 --- a/src/WinPrint.WinForms/PrintPreview.cs +++ b/src/WinPrint.WinForms/PrintPreview.cs @@ -38,6 +38,7 @@ public SheetViewModel SheetViewModel { public int Zoom { get; set; } public PrintPreview() { + //DoubleBuffered = true; InitializeComponent(); CurrentSheet = 1; Zoom = 100; @@ -95,7 +96,7 @@ private void ZoomOut() { protected override void OnResize(EventArgs e) { Invalidate(); - base.OnResize(e); + //base.OnResize(e); } protected override void OnClick(EventArgs e) { @@ -197,25 +198,17 @@ protected override void OnTextChanged(EventArgs e) { Invalidate(GetTextRect(Graphics.FromHwnd(Handle))); } - // Minimum padding around print preview control (paper) - private const int _pagePadding = 20; protected override void OnPaint(PaintEventArgs e) { if (e is null) { throw new ArgumentNullException(nameof(e)); } - LogService.TraceMessage($"PrintPreview.Text: {Text} - clip: {e.ClipRectangle}"); - //base.OnPaint(e); - - // Paint background - using var backBrush = new SolidBrush(BackColor); - e.Graphics.FillRectangle(backBrush, ClientRectangle); if (_svm != null && _svm.Ready) { var state = e.Graphics.Save(); // Calculate scale and location - var paperSize = new Size(ClientSize.Width - _pagePadding, ClientSize.Height - _pagePadding); + var paperSize = new Size(ClientSize.Width - Padding.Horizontal, ClientSize.Height - Padding.Vertical); double w = _svm.Bounds.Width; double h = _svm.Bounds.Height; var scalingX = paperSize.Width / w; @@ -228,13 +221,18 @@ protected override void OnPaint(PaintEventArgs e) { var previewSize = new Size((int)(w * scale), (int)(h * scale)); LogService.TraceMessage($"previewSize {previewSize.Width}, {previewSize.Height}"); - // Don't do anything if the window's been shrunk too far or GDI+ will crash + // Don't do anything if the windows been shrunk too far or GDI+ will crash if (previewSize.Width > 10 && previewSize.Height > 10) { - // Center + // TODO: Enable panning if (Zoom <= 100) { + // Center e.Graphics.TranslateTransform((ClientSize.Width / 2) - (previewSize.Width / 2), (ClientSize.Height / 2) - (previewSize.Height / 2)); } + else { + // Top centered + e.Graphics.TranslateTransform((ClientSize.Width / 2) - (previewSize.Width / 2), Padding.Top); + } // Scale for client size & zoom e.Graphics.ScaleTransform((float)scale, (float)scale); @@ -242,28 +240,10 @@ protected override void OnPaint(PaintEventArgs e) { // Paint the background white e.Graphics.FillRectangle(Brushes.White, _svm.Bounds); - //if (!svm.Loading && !svm.Reflowing) { - if (_svm.CacheEnabled) { - e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; - var img = _svm.GetCachedSheet(e.Graphics, CurrentSheet); - //e.Graphics.DrawImage(img, - // new Rectangle((int)svm.PrintableArea.Left, (int)svm.PrintableArea.Top, (int)(img.Width), (int)(img.Height)), - // 0F, 0F, img.Width, img.Height, - // GraphicsUnit.Pixel); - e.Graphics.DrawImageUnscaledAndClipped(img, - new Rectangle(_svm.Bounds.Left, _svm.Bounds.Top, _svm.Bounds.Width, _svm.Bounds.Height)); - e.Graphics.Restore(state); - } - else { - _svm.PrintSheet(e.Graphics, CurrentSheet); - } - //} + _svm.PrintSheet(e.Graphics, CurrentSheet); } e.Graphics.Restore(state); } - else { - //e.Graphics.FillRectangle(Brushes.White, Rectangle.Inflate(ClientRectangle, -_pagePadding, -_pagePadding)); - } // If we're zoomed, paint zoom factor if (Zoom != 100) { diff --git a/src/WinPrint.WinForms/WinPrint.WinForms.csproj b/src/WinPrint.WinForms/WinPrint.WinForms.csproj index 1ceec5f..8acb6d2 100644 --- a/src/WinPrint.WinForms/WinPrint.WinForms.csproj +++ b/src/WinPrint.WinForms/WinPrint.WinForms.csproj @@ -12,7 +12,7 @@ winprint GUI winprintgui - 2.0.4.100 + 2.0.4.101 Kindel Systems winprint Charlie Kindel diff --git a/src/WinPrint.WinForms/WinPrint.WinForms.msbump b/src/WinPrint.WinForms/WinPrint.WinForms.msbump index 4844542..fee6de8 100644 --- a/src/WinPrint.WinForms/WinPrint.WinForms.msbump +++ b/src/WinPrint.WinForms/WinPrint.WinForms.msbump @@ -1,7 +1,7 @@ { Configurations: { "Debug": { - BumpRevision: false + BumpRevision: true }, "Release": { diff --git a/tools/generate-associations.js b/tools/generate-associations.js index c005f22..85afaa6 100644 --- a/tools/generate-associations.js +++ b/tools/generate-associations.js @@ -1,11 +1,28 @@ -// Imports file-extension to langauge mapping from both -// prismjs and lang-map and outputs a JSDON document that +// Imports file-extension to language mapping from both +// prismjs and lang-map and outputs a JSON document that // follows the vscode schema for extension mapping. // PrismJS language definitions trump for my solution. const fs = require('fs'); var map = require('lang-map'); var components = require('prismjs/components.js'); +var {PythonShell} = require( 'python-shell'); + +var options = { + mode: 'text', + pythonPath: 'C:\Python38', + pythonOptions: ['-u'], + scriptPath: 'C:\Python38\Lib\site-packages\pygments', + args: ['value1', 'value2', 'value3'] +}; + +PythonShell.run('my_script.py', options, function (err, results) { + if (err) + throw err; + // Results is an array consisting of messages collected during execution + console.log('results: %j', results); +}); + // vscode files.associations is not an array. Use a dictionary instead. var assocDict = {}; var languages = []; @@ -58,7 +75,7 @@ for (var key in components.languages) { }); } - langTemp.aliases.forEach(a => { + langTemp.aliases.forEach(a => { map.extensions(a).forEach(ext =>{ // Add it to the extensions for this langauge defn if (extensions.find(element => element == '.' + ext) == undefined) @@ -77,12 +94,12 @@ for (var key in components.languages) { // create JSON doc conforming to vscode spec. associations is not an array // languages is -var output = { +var output = { 'files.associations' : assocDict, 'languages' : languages }; -var file = "../winforms/WinPrint.Core/Properties/languages.json"; +var file = "prism_languages.json"; fs.writeFile(file, JSON.stringify(output, null, ' '), function (err) { if (err) { return console.log(err); diff --git a/tools/package-lock.json b/tools/package-lock.json new file mode 100644 index 0000000..022cbae --- /dev/null +++ b/tools/package-lock.json @@ -0,0 +1,65 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "lang-map": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/lang-map/-/lang-map-0.4.0.tgz", + "integrity": "sha1-3jiwd4Ogp9sLwILGxf9pxW41SrU=", + "requires": { + "language-map": "^1.1.0" + } + }, + "language-map": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/language-map/-/language-map-1.4.0.tgz", + "integrity": "sha512-5XHMCqKQ/14VXwJTKZX7MZwsVyTrR0bwCsRBwrBq3nP4w7liMJiR0ixXgI29EF/T1/U6be8cYK2y0ibWW9kx2w==" + }, + "prismjs": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz", + "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==", + "requires": { + "clipboard": "^2.0.0" + } + }, + "python-shell": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-1.0.8.tgz", + "integrity": "sha512-jMKagerg3alm6j+Prq5t/M3dTgEppy5vC6ns+LqAjfuHiT8olfK3PMokpqpeEcWEqvDnUcAOhp6SQzaLBtTzRw==" + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + } + } +} diff --git a/tools/prism_languages.json b/tools/prism_languages.json new file mode 100644 index 0000000..e69de29