feat: customizable html

This commit is contained in:
relikd
2025-11-02 00:45:54 +01:00
parent d634763eef
commit f49e184dbb
3 changed files with 36 additions and 34 deletions

View File

@@ -11,9 +11,26 @@ class PreviewViewController: NSViewController, QLPreviewingController {
return NSNib.Name("PreviewViewController")
}
/// Load resource file either from user documents dir (if exists) or app bundle (default).
func bundleFile(filename: String, ext: String) throws -> String {
if let appSupport = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let override = appSupport.appendingPathComponent(filename + "." + ext)
if FileManager.default.fileExists(atPath: override.path) {
return try String(contentsOfFile: override.path, encoding: .utf8)
}
// else: do NOT copy! Breaks on future updates
}
// else, load bundle file
let path = Bundle.main.url(forResource: filename, withExtension: ext)
return try String(contentsOf: path!, encoding: .utf8)
}
func preparePreviewOfFile(at url: URL) async throws {
let meta = MetaInfo(url)
let html = HtmlGenerator(meta).applyHtmlTemplate()
let html = HtmlGenerator(meta).generate(
template: try bundleFile(filename: "template", ext: "html"),
css: try bundleFile(filename: "style", ext: "css"),
)
// sure, we could use `WKWebView`, but that requires the `com.apple.security.network.client` entitlement
//let web = WKWebView(frame: self.view.bounds)
let web = WebView(frame: self.view.bounds)

View File

@@ -24,42 +24,31 @@ I merely want things to be done.
Also, I've removed support for provisioning profiles (`.mobileprovision`, `.provisionprofile`) to focus on app bundles.
## ToDO
## ToDo
- [ ] support for `.apk` files
## Development notes
## Features
### Customize HTML / CSS
1. Right click on the app and select "Show Package Contents"
2. Copy `Contents/Resources/template.html` (or `style.css`)
3. Open `~/Library/Containers/de.relikd.QLAppBundle.Preview/Data/Documents/`
4. Paste the previous file and modify it to your liking
5. `QLAppBundle` will use the new file from now on
## Development notes
### Debug
You can show Console logs with `subsystem:de.relikd.QLAppBundle`
### Compile errors
If you encounter compile errors like:
```
Command SwiftEmitModule failed with a nonzero exit code
```
or
```
Could not build Objective-C module 'ExtensionFoundation'
```
or `ThumbnailProvider` is throwing lots of errors for undefined classes:
remove the `SYSTEM_FRAMEWORK_SEARCH_PATHS` attribute from Project > Build Settings then try to compile again (it will fail).
Afterwards, restore the value in the attribute.
Now, the build index should be up-to-date and the app should compile fine.
I havent figured out the exact issue, consider it a workaround.
It should only be necessary once (or if you delete your `DerivedData` folder).
[1]: https://github.com/ealeksandrov/ProvisionQL
[2]: https://github.com/ealeksandrov/ProvisionQL/pull/54

View File

@@ -20,9 +20,6 @@ struct HtmlGenerator {
procFooterInfo()
// App Icon (last, because the image uses a lot of memory)
data["AppIcon"] = AppIcon(meta).extractImage(from: plistApp).withRoundCorners().asBase64()
// insert CSS styles
let cssURL = Bundle.main.url(forResource: "style", withExtension: "css")!
data["CSS"] = try! String(contentsOf: cssURL, encoding: .utf8)
}
mutating func apply(_ values: [String: String]) {
@@ -39,9 +36,8 @@ struct HtmlGenerator {
}
/// prepare html, replace values
func applyHtmlTemplate() -> String {
let templateURL = Bundle.main.url(forResource: "template", withExtension: "html")!
let html = try! String(contentsOf: templateURL, encoding: .utf8)
func generate(template html: String, css: String) -> String {
let templateValues = data.merging(["CSS": css]) { (_, new) in new }
// this is less efficient
// for (key, value) in templateValues {
@@ -58,7 +54,7 @@ struct HtmlGenerator {
rv.append(contentsOf: html[prevLoc ..< start])
prevLoc = html.index(start, offsetBy: match!.range.length)
// append key if exists (else remove template-key)
if let value = data[key] {
if let value = templateValues[key] {
rv.append(value)
} else {
// os_log(.debug, log: log, "unknown template key: %{public}@", key)