[Peek] Powertoys Peek MVP (#25922)

* Peek (#22498)

* Add peek dll project

* add spacebar preview and launch on hotkey press

* add todo

* add process handle to handle continuous press of hotkey

* add tool to stop all powertoys processes

* Add a blank Peek page and update nav menu

* Add some initial content to Peek page including a toggle

* refactor settings parsing

* rename spacebar peek to peek viewer

* rename script to stop powertoys processes

* remove tool

* Adding FileUtils for retrieving selected file in File Explorer

* Remove unnecessary SndPeekSettings

* Add shortcut setting

* Set the shortcut to ctrl+space

* Launching viewer with selected FE file

* Add PeekUI WinUI3 project with interop events

* Moving FileTypeUtils into PeekFileUtils project

* execute winui3 app on hotkey

* Fix paths with spaces

* remove winui3 project

* Resolve comment

* add wpf app with toggle visibility on hotkey

* fix visibility on startup

* remove window properties and add todos

* Fixed hidden extension and system file handling

* wip

* Add working WPF app with FileExplorer querying

* remove c++ projects

* Move native awaiter

* Working Image control with image files

* Resize and move window based on explorer monitor

* Image render, window positioning and sizing clean up

* add window management logic and selection logic

* add extension methods to add circular iterating capability to linkedlistnode

* Add OnArrowKeyPresshandler

* Added titlebar with file name and scaling with titlebar height

* fix flashing window on startup and process kept alive when powertoys exits

* remove wait for debugger loop in ui

* Add KeyIsDown method

* Fix KeyDown issue with Key handled and check for repeat

* Add thumbnail logic

* Add all folder items if only one item is selected

* File type helper

* Using hresult

* Add cancellation and rotation handling

* Use extension instead of path

* fIX CONFLICTS

* Fixing some file type checks

* Add new icon for Peek

* Update page with the new Peek icon

* Initialize IsEnabled and hook ActivationShortcut to dllmain

* add icon to taskbar and titlebar

* Add theme sensitive backgrounds

* rename event handlers

* add settings image

* Move window data into obserable object

* Refactor viewmodel, interop and helpers

* Clean up

* Add loading spinner

* Add todos

* Fix conflicts

* Move native code into its own folder

* Add peek to installer

* Fix building peek and peekui projects

* Replace UWP namespaces to WinAppSDK

* Working WASDK placeholder project

* Add exit when powertoys runner exit

* Working winui3 with image display

* Add WIC project with <TreatWarningAsErros> false for now

* Fit content to window

* Use Size from Windows.Foundation

* Change order

* Add some todos

* Refactored native/interop code and added helpers to imagepreviewer

* Rename projects

* Move some code

* Remove using

Co-authored-by: Michael Salmon <miksalmon@users.noreply.github.com>
Co-authored-by: Michael Salmon 🐟 <michaelpsalmon@outlook.com>
Co-authored-by: Alireza Ebadi Ghajari <alirezae@microsoft.com>
Co-authored-by: Jessie Su <Jessie.Su@microsoft.com>
Co-authored-by: sujessie <102062556+sujessie@users.noreply.github.com>

* Bump Microsoft.Windows.SDK.BuildTools version

* [Peek] Plugin pattern to enable any file type previewing (#22475)

* [Peek] Fetching image size through PropertyStore (#22530)

* Fetching metadata from PropertySTore

* Releasing objects to fix crash

* Creating new PropertyHelper

Co-authored-by: Daniel Chau <dancha@microsoft.com>

* Juliata/filetypes (#22538)

* Using the same list of file extensions as Lightbox's AppxManifest, and ensuring we convert file extension to lowercase

* Add IsFileTypeSupported to IPreviewer

* respond to PR comments

* Add scale awareness to window centering (#22541)

* [Peek] Fix installer builds, project configs and update assets (#22540)

* Update installer

* Fix installer errors

* Fix peek vcxproj

* Add package signing

* Add peek to arm64

* Add back ARM64 toMeasureToolUI

* Add versions to project

* Update assets and icons

* Add correct icon

* [Peek] Enable PropertyStore for offline files (#22567)

* Enabling PropertyStore for offline files

Co-authored-by: Daniel Chau <dancha@microsoft.com>

* [Peek] Adding unsupported file previewer (#22598)

* Unsupported file previewer

* Fix file display info

* Fix property store calls

* Update TODO

* [Peek] Add WebView2 integration (#22506)

* First commit with WIP logic to support WV2 in Peek module

* Minor code cleanup and try/catch block

* Added control to wrap WebView2 logic

* Cleanup

* Added logic to handle HTML previewing
Properly update FilePreview according to file type

* Code cleanup
Updated comments

* Updated comment

* Removed comment

* Code cleanup

* Improved opening of web browser preview to avoid "blank" or "seeing previous page" issue
Removed unused method
Added xaml fallback to guarantee default/starting state

* Removed folder

* Updated factory logic to match master

* address code review

* addressed PR review

* address PR review

* Address PR review

* address PR review

* Address PR review

* [Peek] Add basic file querying and navigation (#22589)

* Refactor to facilitate file data initialization

* Extract file-related code to new FileManager class

* Add temp basic version

* Clean + add todo for cancellations

* Fix various nav-related issues

* Temp - start moving iteration-related code to bg thread

* Minor tweaks

* Add FEHelper todo

* Rename FileManager + various tweaks

* Add basic throttling

* Improve bg thread synchronization

* Clean

* Clean

* Rename based on feedback

* Rename FileQuery

* Rename properties

* Rename remaining fields

* Add todos for nav success/failures

Co-authored-by: Esteban Margaron <emargaron@microsoft.com>

* [Peek] Add customized title bar  (#22600)

* Add basic button UI

* Add function to get default app name and to open file in default app

* Correct error output

* Add filename to titlebar

* Remove titlebar text from Resw

* Add basic button UI

* Add function to get default app name and to open file in default app

* Add filename to titlebar

* Correct error output

* Remove titlebar text from Resw

* Add SetDragRectangles

* Correct logic, update function name

* Add localization

* Cleanup and adaptive width

* Add fileIndex/NumberOfFiles for multiple files activation

* Refine titlebar styles

* Update error message; Return HResult from native methods; Update variable initialisation and string null testing

* Titlebar height and adaptive width refinement

* Add fallback to launch app picker if fail to open default app

* Temp change to hide AppTitle_FileCount

* Update launch button to command; Add keyboard accelerator

* Update titlebar inactive background color

* Update tooltip to add keyboard accelerator

* Add comments to resw file

* Fix accidental deletion from previous merge

Co-authored-by: Jojo Zhou <yizzho@microsoft.com>
Co-authored-by: Yawen Hou <yawenhou@microsoft.com>

* Fix crash

* Fix wrong thread exception

* Make CurrentItemIndex setter private

* Update titlebar filecount text

* Fix titlebar draggable region and interactive region (bump WinAppSdk to latest)

* [Peek] Unsupported File Previewer - Formatting string from resources (#22609)

* Moving to string resource usage

* Moving ReadableStringHelper to common project

* Fix comments

* [Peek] Fix foregrounding (#22633)

* Fixing foregrounding

* Get window handle inside BringToForeground extension method

Co-authored-by: Daniel Chau <dancha@microsoft.com>
Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>

* [Peek] ImagePreviewer - Handle error states (#22637)

* add better preview state handling

* add error handling in imagepreviewer and better state handling

* fix error handling so exception is not bubbled up

* improve performance and hook up unsupported previewer on error

* remove commented code

* address pr comments

* [Peek] add PDF viewing support (#22636)

* [Peek] add PDF viewing support

* Fixed issue which would redirect some HTML and PDF files to external browser

* Fixed refactored interface name

* [Peek] Refine titlebar adaptive width (#22642)

* Adjust adaptive width of titlebar

* Remove visualstate setters for AppTitle_FileCount

Co-authored-by: Jojo Zhou <yizzho@microsoft.com>

* [Peek] New File Explorer tabs break Shell API to get selected files (#22641)

* fix FE tab bug

* remove unnecessary unsafe keyword

* [Peek] add extra logic to properly render PNG files with transparency (#22613)

* [Peek] added extra logic to render PNG files with proper transparency

* Moved logic to ThumbnailHelper
Cleanup

* Created a separated previewer for PNG to only load the preview image with thumbnail logic

* removed unused code

* Updated state loading change

* [Peek] Unsupported File Previewer - Setting Window Size (#22645)

* Adding setting for unsupported file window

* Fix

* [Peek] Add tooltip to File (#22640)

* Add tooltip to File

* Add placeholder text for no tooltip

* Address comments

* Use StringBuilder

Co-authored-by: Jojo Zhou <yizzho@microsoft.com>

* Add full image quality support (#22654)

* [Peek] Window foregrounding simplification and fixes + keep window visible if FE single selection changed (#22657)

* Use different apis to bring to foreground removing remote thread wait and work as well as library loading

* Keep window open if single selected file in FE is different

* Removed unused methods

* [Peek] Add cancellation token OnFilePropertyChanged (#22643)

* Cancel file loading before opening another file

* Add omitted cancellation checks

* Catch task cancelled exception; Add more cancellation checkpoints

* Add cancellation checkpoint beofre GetBitmapFromHBitmapAsync

* Correct typo

* Update to pass cancellation token individually to each async methods

* Add lost cancellationToken source

* Add cancellation token to PngPreviewer

Co-authored-by: Yawen Hou <yawenhou@microsoft.com>

* [Peek] Unsupported File Previewer - Preserve Transparency For File Icons (#22650)

* Preserving transparency or icons

* Remove TODO

Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>

* [Peek] Update some installer build steps + assets update (#22683)

* Fix settings & peek.ui.wpf

* Add back missing icon

* Add missing files and actions to installer

* Keep window open if the selected file in explorer is different (only works for single file selection)

* Undo last

* [Peek] Add copy keyboard accelerator (#22647)

* add copy keyboard accelerator

* Fix comments

Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>

* [Peek] add WV2 improvements (behavior and UX) (#22685)

* [Peek] added logic to get max monitor size for opening WebView2

* Removed ununsed dependency property

* Added workaround for cases where the web page would not finish navigating in a quick timing, for example google.com.

* Remove window extensions from common and use nullable size argument instead

Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>

* [Peek] Merge main, self-contained .NET and fix WebView2 user data dir issue (#22899)

* Merge remote-tracking branch 'origin/main' into peek

* Test sc

* Set WebView2 user data dir

* spellcheck

* Fix comment

* Move check if higher quality image is already loaded to the exact line where we change the Preview bitmap (#23083)

* Fix opening Peek when FE window is set to full name path (#23082)

* Move check for png thubmnail loading priority

* Remove Peek.UI.WPF project

* Remove duplicated method in powertoys setup

* [Peek] Fix selecting files from the correct focused opened File Explorer tab & from Desktop (#23489)

* Get file based on active tab handle instead of window title

* Refactor code to get active tab

* Getting all items from the shell API working again, except for desktop

* Refactor and cleanup com & native code

* Add back removed peek xaml assets in Product.wxs

* Remove some dependencies that do not seem necessary in Product.wxs

* [Peek] Small images (#23554)

* change stretch value

* compare with actual window size

* consider scaling factor

* set max size

* clean up

* clean up

* clean up previewers

* scaling factor in bitmap previewer

* max image size property

* [Peek]Handle errors for HEIC/HEIF and fall back to default previewer if there is no thumbnail (#22684)

* Handle errors when getting filesize by falling back to default previewer

* Bringing back other file types that are fixed with these code changes

---------

Co-authored-by: Samuel Chapleau <sachaple@microsoft.com>

* [Peek] Add unsupported file icon fallback (#23735)

* Refactor icon retrieval, refactor hbitmap to bitmap conversion, add icon fallback

* Add svg to assets in installer

* [Peek] Refactoring of file system models, removal of PngPreviewer, retrieving of folder size via Scripting com reference and other fixes (#23955)

* Refactor icon retrieval, refactor hbitmap to bitmap conversion, add icon fallback

* Add svg to assets in installer

* - Refactor File class into IFileSystemItem, FileItem & FolderItem
- Display size for folders using Scripting namespace
- Remove default app buttons for files or folders not supporting it

* Add better content type via storage apis

* Add check for storagefile in PngPreviewer

* Fix png stretching

* Remove png previewer

* Rename ThumbnailOptions.None to ThumbnailOptions.ResizeToFit

* [Peek] Removed monitor percentage evaluation for the UnsupportedFilePreview control (#24002)

* Remove settings for percentage of windows and keep default min size.

* Fix margin on unsupported control

* Use nullable Size for image size & open file on background thread (#24004)

* [Peek] SVG support (#24237)

* svg previewer

* svg size

* set scaling factor

* set image size

* changed image source type

* non nullable image size

* notify svg previewer changed

* uncomment

* rename BitmapPreviewer

* move svg support

* remove svg previewer

* [Peek] Implementation of a performant and reliable Neighboring Files Query (#24943)

* Use IShellItemArray as the backing array of item

* Finalize and cleanup NFQ implementation

* Cleanup remainder of the code

* Remove unused using

* [Peek] Pin the window position  (#24927)

* [Peek] Telemetry and logging (#25231)

* text preview

* scrolling

* changed size

* webview2 preview

* common preview project

* previewpane: use common project

* peek: use common

* previewpane: moved md

* peek: md

* previewpane: clean up

* clean up

* moved monaco files

* moved formatters

* rename

* moved common monaco helper

* dev files support

* installer

* removed versions

* warnings: culture info

* warnings: names

* clean up

* warnings: dispose

* warnings: default values

* warnings

* warnings: charset

* warnings: exceptions

* suppress warning

* installer: added peek

* changed peek guid

* monaco folders

* peek deps

* peek files

* peek resources

* removed additional monaco folder

* set host name

* Update installer

* hardcode monaco path

* leave single webview control

* moved path to common

* project

* more meaningful todos

* moved temp folder cleanup

* todo

* extension check

* spell: monaco

* spellcheck

* spellcheck

* fix id

* fix spelling

* key to spelling

* id fix

* Fix monaco resolution at install time

* Fix user install. Add needed files

* installer: remove peek localization files. It's a WinUI app

* installer:fix signing

* removed unused

* settings: flyout enable/disable for Peek

* simplify string

* property changed handle

* [Peek][Settings] Peek OOBE page (#25895)

* [Peek] GPO (#25918)

* Add Native methods file to exception

* Fix merge issue on solution file

* Adjust spellcheck

* Remove boilerplate code

* Add module interface telemetry

* Remove change to README.md

* Add entry to README

* Clean up some non-changes

* Fix order of Peek in Settings menu

* [Settings] Make peek descriptions more descriptive

---------

Co-authored-by: Michael Salmon <miksalmon@users.noreply.github.com>
Co-authored-by: Michael Salmon 🐟 <michaelpsalmon@outlook.com>
Co-authored-by: Alireza Ebadi Ghajari <alirezae@microsoft.com>
Co-authored-by: Jessie Su <Jessie.Su@microsoft.com>
Co-authored-by: sujessie <102062556+sujessie@users.noreply.github.com>
Co-authored-by: Daniel Chau <d.chau@alumni.ubc.ca>
Co-authored-by: Daniel Chau <dancha@microsoft.com>
Co-authored-by: jth-ms <73617023+jth-ms@users.noreply.github.com>
Co-authored-by: Robson <rp.pontin@gmail.com>
Co-authored-by: estebanm123 <49930791+estebanm123@users.noreply.github.com>
Co-authored-by: Esteban Margaron <emargaron@microsoft.com>
Co-authored-by: Yawen Hou <Sytta@users.noreply.github.com>
Co-authored-by: Jojo Zhou <yizzho@microsoft.com>
Co-authored-by: Yawen Hou <yawenhou@microsoft.com>
Co-authored-by: Jojo Zhou <39350350+Joanna-Zhou@users.noreply.github.com>
Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com>
Co-authored-by: Seraphima Zykova <zykovas91@gmail.com>
Co-authored-by: Stefan Markovic <stefan@janeasystems.com>
Co-authored-by: Jaime Bernardo <jaime@janeasystems.com>
This commit is contained in:
Samuel Chapleau
2023-05-10 10:43:03 -07:00
committed by GitHub
parent 7ae93a9c7f
commit 648f30d1ab
361 changed files with 10709 additions and 182 deletions

View File

@@ -0,0 +1,306 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\Version.props" />
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<RuntimeIdentifiers>win-x64;win-arm64</RuntimeIdentifiers>
<Version>$(Version).0</Version>
<Authors>Microsoft Corporation</Authors>
<Product>PowerToys</Product>
<Description>PowerToys FilePreviewCommon</Description>
<AssemblyName>PowerToys.FilePreviewCommon</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Markdig.Signed" />
</ItemGroup>
<ItemGroup>
<None Update="customLanguages\reg.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="index.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSpecialLanguages.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\base\browser\ui\codicons\codicon\codicon.ttf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\base\worker\workerMain.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\abap\abap.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\apex\apex.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\azcli\azcli.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\bat\bat.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\cameligo\cameligo.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\clojure\clojure.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\coffee\coffee.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\cpp\cpp.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\csharp\csharp.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\csp\csp.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\css\css.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\dart\dart.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\dockerfile\dockerfile.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\ecl\ecl.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\fsharp\fsharp.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\go\go.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\graphql\graphql.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\handlebars\handlebars.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\hcl\hcl.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\html\html.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\ini\ini.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\javascript\javascript.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\java\java.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\julia\julia.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\kotlin\kotlin.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\less\less.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\lexon\lexon.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\lua\lua.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\m3\m3.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\markdown\markdown.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\mips\mips.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\msdax\msdax.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\mysql\mysql.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\objective-c\objective-c.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\pascaligo\pascaligo.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\pascal\pascal.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\perl\perl.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\pgsql\pgsql.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\php\php.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\postiats\postiats.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\powerquery\powerquery.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\powershell\powershell.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\pug\pug.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\python\python.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\razor\razor.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\redis\redis.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\redshift\redshift.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\restructuredtext\restructuredtext.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\ruby\ruby.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\rust\rust.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\r\r.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\sb\sb.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\scala\scala.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\scheme\scheme.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\scss\scss.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\shell\shell.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\solidity\solidity.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\sophia\sophia.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\sql\sql.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\st\st.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\swift\swift.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\systemverilog\systemverilog.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\tcl\tcl.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\twig\twig.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\typescript\typescript.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\vb\vb.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\xml\xml.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\basic-languages\yaml\yaml.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.css">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.de.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.es.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.fr.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.it.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.ja.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.ko.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.ru.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.zh-cn.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\editor\editor.main.nls.zh-tw.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\css\cssMode.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\css\cssWorker.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\html\htmlMode.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\html\htmlWorker.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\json\jsonMode.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\json\jsonWorker.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\typescript\tsMode.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\language\typescript\tsWorker.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monacoSRC\min\vs\loader.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="monaco_languages.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -2,7 +2,7 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
namespace Microsoft.PowerToys.PreviewHandler.Monaco.Formatters
namespace Microsoft.PowerToys.FilePreviewCommon.Monaco.Formatters
{
public interface IFormatter
{

View File

@@ -5,7 +5,7 @@
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Microsoft.PowerToys.PreviewHandler.Monaco.Formatters
namespace Microsoft.PowerToys.FilePreviewCommon.Monaco.Formatters
{
public class JsonFormatter : IFormatter
{

View File

@@ -5,7 +5,7 @@
using System.Text;
using System.Xml;
namespace Microsoft.PowerToys.PreviewHandler.Monaco.Formatters
namespace Microsoft.PowerToys.FilePreviewCommon.Monaco.Formatters
{
public class XmlFormatter : IFormatter
{

View File

@@ -10,7 +10,7 @@ using Markdig.Renderers.Html;
using Markdig.Syntax;
using Markdig.Syntax.Inlines;
namespace Microsoft.PowerToys.PreviewHandler.Markdown
namespace Microsoft.PowerToys.FilePreviewCommon
{
/// <summary>
/// Callback if extension blocks external images.

View File

@@ -0,0 +1,27 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.IO;
namespace Microsoft.PowerToys.FilePreviewCommon
{
public static class Helper
{
public static void CleanupTempDir(string folder)
{
try
{
var dir = new DirectoryInfo(folder);
foreach (var file in dir.EnumerateFiles("*.html"))
{
file.Delete();
}
}
catch (Exception)
{
}
}
}
}

View File

@@ -0,0 +1,52 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.IO;
using Markdig;
namespace Microsoft.PowerToys.FilePreviewCommon
{
public static class MarkdownHelper
{
/// <summary>
/// Markdown HTML header for light theme.
/// </summary>
private static readonly string HtmlLightHeader = "<!doctype html><style>body{width:100%;margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}.container{padding:5%}body img{max-width:100%;height:auto}body h1,body h2,body h3,body h4,body h5,body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}body h1,body h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}body h3{font-size:1.25em}body h4{font-size:1em}body h5{font-size:.875em}body h6{font-size:.85em;color:#6a737d}pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;background-color:#f6f8fa;border-radius:3px;padding:16px;font-size:85%}a{color:#0366d6}strong{font-weight:600}em{font-style:italic}code{padding:.2em .4em;margin:0;font-size:85%;background-color:#f6f8fa;border-radius:3px}hr{border-color:#EEE -moz-use-text-color #FFF;border-style:solid none;border-width:.5px 0;margin:18px 0}table{display:block;width:100%;overflow:auto;border-spacing:0;border-collapse:collapse}tbody{display:table-row-group;vertical-align:middle;border-color:inherit;vertical-align:inherit;border-color:inherit}table tr{background-color:#fff;border-top:1px solid #c6cbd1}tr{display:table-row;vertical-align:inherit;border-color:inherit}table td,table th{padding:6px 13px;border:1px solid #dfe2e5}th{font-weight:600;display:table-cell;vertical-align:inherit;font-weight:bold;text-align:-internal-center}thead{display:table-header-group;vertical-align:middle;border-color:inherit}td{display:table-cell;vertical-align:inherit}code,pre,tt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;color:#24292e;overflow-x:auto}pre code{font-size:inherit;color:inherit;word-break:normal}blockquote{background-color:#fff;border-radius:3px;padding:15px;font-size:14px;display:block;margin-block-start:1em;margin-block-end:1em;margin-inline-start:40px;margin-inline-end:40px;padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}</style><body><div class=\"container\">";
/// <summary>
/// Markdown HTML header for dark theme.
/// </summary>
private static readonly string HtmlDarkHeader = "<!doctype html><style>body{width:100%;margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";font-size:1rem;font-weight:400;line-height:1.5;color:#d4d4d4;text-align:left;background-color:#1e1e1e}.container{padding:5%}body img{max-width:100%;height:auto}body h1,body h2,body h3,body h4,body h5,body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}body h1,body h2{padding-bottom:.3em;border-bottom:1px solid #474747}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}body h3{font-size:1.25em}body h4{font-size:1em}body h5{font-size:.875em}body h6{font-size:.85em;color:#d4d4d4}pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;background-color:#161616;border-radius:3px;padding:16px;font-size:85%}a{color:#0366d6}strong{font-weight:600}em{font-style:italic}code{padding:.2em .4em;margin:0;font-size:85%;background-color:#161616;border-radius:3px}hr{border-color:#EEE -moz-use-text-color #FFF;border-style:solid none;border-width:.5px 0;margin:18px 0}table{display:block;width:100%;overflow:auto;border-spacing:0;border-collapse:collapse}tbody{display:table-row-group;vertical-align:middle;border-color:inherit;vertical-align:inherit;border-color:inherit}table tr{background-color:#1e1e1e;border-top:1px solid #c6cbd1}tr{display:table-row;vertical-align:inherit;border-color:inherit}table td,table th{padding:6px 13px;border:1px solid #474747}th{font-weight:600;display:table-cell;vertical-align:inherit;font-weight:bold;text-align:-internal-center}thead{display:table-header-group;vertical-align:middle;border-color:inherit}td{display:table-cell;vertical-align:inherit}code,pre,tt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace;color:#d4d4d4;overflow-x:auto}pre code{font-size:inherit;color:inherit;word-break:normal}blockquote{background-color:#282828;border-radius:3px;padding:15px;font-size:14px;display:block;margin-block-start:1em;margin-block-end:1em;margin-inline-start:40px;margin-inline-end:40px;padding:0 1em;color:#d4d4d4;border-left:.25em solid #d4d4d4}</style><body><div class=\"container\">";
/// <summary>
/// Markdown HTML footer.
/// </summary>
private static readonly string HtmlFooter = "</div></body></html>";
public static string MarkdownHtml(string fileContent, string theme, string filePath, ImagesBlockedCallBack imagesBlockedCallBack)
{
var htmlHeader = theme == "dark" ? HtmlDarkHeader : HtmlLightHeader;
// Extension to modify markdown AST.
HTMLParsingExtension extension = new HTMLParsingExtension(imagesBlockedCallBack);
extension.FilePath = Path.GetDirectoryName(filePath);
// if you have a string with double space, some people view it as a new line.
// while this is against spec, even GH supports this. Technically looks like GH just trims whitespace
// https://github.com/microsoft/PowerToys/issues/10354
var softlineBreak = new Markdig.Extensions.Hardlines.SoftlineBreakAsHardlineExtension();
MarkdownPipelineBuilder pipelineBuilder;
pipelineBuilder = new MarkdownPipelineBuilder().UseAdvancedExtensions().UseEmojiAndSmiley().UseYamlFrontMatter().UseMathematics();
pipelineBuilder.Extensions.Add(extension);
pipelineBuilder.Extensions.Add(softlineBreak);
MarkdownPipeline pipeline = pipelineBuilder.Build();
string parsedMarkdown = Markdown.ToHtml(fileContent, pipeline);
string markdownHTML = $"{htmlHeader}{parsedMarkdown}{HtmlFooter}";
return markdownHTML;
}
}
}

View File

@@ -0,0 +1,114 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text.Json;
using Microsoft.PowerToys.FilePreviewCommon.Monaco.Formatters;
namespace Microsoft.PowerToys.FilePreviewCommon
{
public static class MonacoHelper
{
/// <summary>
/// Name of the virtual host
/// </summary>
public const string VirtualHostName = "PowerToysLocalMonaco";
/// <summary>
/// Formatters applied before rendering the preview
/// </summary>
public static readonly IReadOnlyCollection<IFormatter> Formatters = new List<IFormatter>
{
new JsonFormatter(),
new XmlFormatter(),
}.AsReadOnly();
/// <summary>
/// Gets the path of the current assembly.
/// </summary>
/// <remarks>
/// Source: https://stackoverflow.com/a/283917/14774889
/// </remarks>
public static string AssemblyDirectory
{
get
{
string codeBase = Assembly.GetExecutingAssembly().Location;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
public static string MonacoDirectory
{
get
{
// TODO: common monaco folder
string codeBase = Assembly.GetExecutingAssembly().Location;
string path = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(codeBase), "..", "FileExplorerPreview"));
return path;
}
}
public static JsonDocument GetLanguages()
{
JsonDocument languageListDocument;
using (StreamReader jsonFileReader = new StreamReader(new FileStream(MonacoDirectory + "\\monaco_languages.json", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
languageListDocument = JsonDocument.Parse(jsonFileReader.ReadToEnd());
jsonFileReader.Close();
}
return languageListDocument;
}
/// <summary>
/// Converts a file extension to a language monaco id.
/// </summary>
/// <param name="fileExtension">The extension of the file (without the dot).</param>
/// <returns>The monaco language id</returns>
public static string GetLanguage(string fileExtension)
{
fileExtension = fileExtension.ToLower(CultureInfo.CurrentCulture);
try
{
JsonDocument languageListDocument = GetLanguages();
JsonElement languageList = languageListDocument.RootElement.GetProperty("list");
foreach (JsonElement e in languageList.EnumerateArray())
{
for (int j = 0; j < e.GetProperty("extensions").GetArrayLength(); j++)
{
if (e.GetProperty("extensions")[j].ToString() == fileExtension)
{
return e.GetProperty("id").ToString();
}
}
}
return "plaintext";
}
catch (Exception)
{
return "plaintext";
}
}
public static string ReadIndexHtml()
{
string html;
using (StreamReader htmlFileReader = new StreamReader(new FileStream(MonacoDirectory + "\\index.html", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
html = htmlFileReader.ReadToEnd();
htmlFileReader.Close();
}
return html;
}
}
}

View File

@@ -25,7 +25,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Set charset -->
<meta charset="utf-8" />
<!-- Title (normally not diaplayd)-->
<!-- Title (normally not displayed)-->
<title>Previewer for developer Files</title>
<style>
/* Fits content to window size */

Some files were not shown because too many files have changed in this diff Show More