Skip to content

Commit

Permalink
添加公式支持,about页面
Browse files Browse the repository at this point in the history
  • Loading branch information
caol64 committed Aug 29, 2024
1 parent da91a2d commit e795aa4
Show file tree
Hide file tree
Showing 12 changed files with 146 additions and 64 deletions.
5 changes: 4 additions & 1 deletion WenYan/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,15 @@ struct ContentView: View {
.background(.white)
}
.onAppear() {
markdownViewModel.loadExampleArticle()
markdownViewModel.loadArticle()
htmlViewModel.content = markdownViewModel.content
}
.onChange(of: markdownViewModel.content) {
htmlViewModel.content = markdownViewModel.content
htmlViewModel.onUpdate()
Task {
UserDefaults.standard.set(markdownViewModel.content, forKey: "lastArticle")
}
}
.toolbar() {
ToolbarItemGroup {
Expand Down
27 changes: 24 additions & 3 deletions WenYan/HtmlView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,14 @@ extension HtmlViewModel {
callJavascript(javascriptString: "getPostprocessMarkdown();", callback: block)
}

func getContentWithMathImg(_ block: JavascriptCallback?) {
callJavascript(javascriptString: "getContentWithMathImg();", callback: block)
}

func getContentWithMathSvg(_ block: JavascriptCallback?) {
callJavascript(javascriptString: "getContentWithMathSvg();", callback: block)
}

func setPreviewMode() {
callJavascript(javascriptString: "setPreviewMode(\"\(previewMode.rawValue)\");")
}
Expand Down Expand Up @@ -150,7 +158,16 @@ extension HtmlViewModel {

func onCopy() {
let fetchContent: (@escaping JavascriptCallback) -> Void
fetchContent = getContent
switch self.platform {
case .gzh:
fetchContent = getContentWithMathSvg
case .zhihu:
fetchContent = getContentWithMathImg
case .juejin:
fetchContent = getPostprocessMarkdown
default:
fetchContent = getContent
}
fetchContent { result in
do {
var content = try result.get() as! String
Expand All @@ -160,10 +177,14 @@ extension HtmlViewModel {
content = "\(content)<style>\(theme)\(highlight)</style>"
}

print(content)
// print(content)
let pasteBoard = NSPasteboard.general
pasteBoard.clearContents()
pasteBoard.setString(content, forType: .html)
if self.platform == .juejin {
pasteBoard.setString(content, forType: .string)
} else {
pasteBoard.setString(content, forType: .html)
}
} catch {
self.appState.appError = AppError.bizError(description: error.localizedDescription)
}
Expand Down
15 changes: 9 additions & 6 deletions WenYan/MarkdownView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,16 @@ extension MarkdownViewModel {
WenYan.callJavascript(webView: webView, javascriptString: javascriptString, callback: callback)
}

func loadExampleArticle() {
do {
content = try loadFileFromResource(forResource: "example", withExtension: "md")
} catch {
self.appState.appError = AppError.bizError(description: error.localizedDescription)
func loadArticle() {
if let lastArticle = UserDefaults.standard.string(forKey: "lastArticle") {
content = lastArticle
} else {
do {
content = try loadFileFromResource(forResource: "example", withExtension: "md")
} catch {
self.appState.appError = AppError.bizError(description: error.localizedDescription)
}
}

}

}
16 changes: 16 additions & 0 deletions WenYan/Resources.bundle/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,22 @@
</script>
<script src="highlight/highlight.min.js"></script>
<script src="marked/marked_hljs.umd.min.js"></script>
<script>
function addContainer(math, doc) {
const tag = math.display ? 'section' : 'span';
const cls = math.display ? 'block-equation' : 'inline-equation';
math.typesetRoot.setAttribute("math", math.math);
math.typesetRoot = doc.adaptor.node(tag, {class: cls}, [math.typesetRoot]);
}
MathJax = {
options: {
renderActions: {
addContainer: [190, (doc) => {for (const math of doc.math) {addContainer(math, doc)}}, addContainer]
}
}
};
</script>
<script src="mathjax/tex-svg.min.js"></script>
<script src="main.js" defer></script>
</head>
<body>
Expand Down
49 changes: 39 additions & 10 deletions WenYan/Resources.bundle/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ function setContent(content) {
container.setAttribute("id", "wenyan");
container.setAttribute("class", "preview");
document.body.appendChild(container);
MathJax.typeset();
}
function setPreviewMode(mode) {
document.getElementById("style")?.remove();
Expand All @@ -51,16 +52,44 @@ function setHighlight(highlight) {
}
}
function getContent() {
// const wenyan = document.getElementById("wenyan");
// const clonedWenyan = wenyan.cloneNode(true);
// const elements = clonedWenyan.querySelectorAll("#wenyan pre");
// elements.forEach(element => {
// const span = document.createElement("span");
// span.setAttribute("style", macCodeStyle);
// element.insertBefore(span, element.firstChild);
// });
// return clonedWenyan.outerHTML;
return document.getElementById("wenyan")?.outerHTML;
const wenyan = document.getElementById("wenyan");
const clonedWenyan = wenyan.cloneNode(true);
const elements = clonedWenyan.querySelectorAll("mjx-container");
elements.forEach(element => {
const math = element.getAttribute("math");
const parent = element.parentElement;
element.remove();
parent.innerHTML = math;
});
return clonedWenyan.outerHTML;
}
function getContentWithMathImg() {
const wenyan = document.getElementById("wenyan");
const clonedWenyan = wenyan.cloneNode(true);
const elements = clonedWenyan.querySelectorAll("mjx-container");
elements.forEach(element => {
const math = element.getAttribute("math");
const parent = element.parentElement;
element.remove();
let img = document.createElement("img");
img.setAttribute("alt", math);
img.setAttribute("data-eeimg", "true");
img.setAttribute("style", "margin: 0 auto; width: auto; max-width: 100%;");
parent.appendChild(img);
});
return clonedWenyan.outerHTML;
}
function getContentWithMathSvg() {
const wenyan = document.getElementById("wenyan");
const clonedWenyan = wenyan.cloneNode(true);
const elements = clonedWenyan.querySelectorAll("mjx-container");
elements.forEach(element => {
const svg = element.querySelector('svg');
const parent = element.parentElement;
element.remove();
parent.appendChild(svg);
});
return clonedWenyan.outerHTML;
}
function getPostprocessMarkdown() {
return postprocessMarkdown;
Expand Down
32 changes: 0 additions & 32 deletions WenYan/Resources.bundle/marked/mermaid.min.js

This file was deleted.

3 changes: 3 additions & 0 deletions WenYan/Resources.bundle/mathjax/tex-svg.min.js

Large diffs are not rendered by default.

9 changes: 4 additions & 5 deletions WenYan/Resources.bundle/themes/gzh_default.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
line-height: 1.75;
}
#wenyan * {
margin: 1em 0;
box-sizing: border-box;
}
#wenyan h1, h2, h3, h4, h5, h6, p, pre {
margin: 1em 0;
}
#wenyan pre code::-webkit-scrollbar {
width: 6px;
height: 6px;
Expand All @@ -25,16 +27,13 @@
text-align: center;
font-size: 1.5em;
font-weight: bold;
padding-bottom: 1em;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
}
#wenyan h2 {
text-align: center;
font-size: 1.2em;
border-bottom: 1px solid #f7f7f7;
font-weight: bold;
padding-bottom: 1em 0;
line-height: 2.5;
}
#wenyan h3, h4, h5, h6 {
font-size: 1em;
Expand All @@ -49,7 +48,7 @@
#wenyan img {
max-width: 100%;
height: auto;
margin:0 auto;
margin: 0 auto;
}
#wenyan table {
border-collapse: collapse;
Expand Down
6 changes: 4 additions & 2 deletions WenYan/Resources.bundle/themes/juejin_default.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
line-height: 1.75;
}
#wenyan * {
margin: 1em 0;
box-sizing: border-box;
}
#wenyan h1, h2, h3, h4, h5, h6, p, pre {
margin: 1em 0;
}
#wenyan pre code::-webkit-scrollbar {
width: 6px;
height: 6px;
Expand Down Expand Up @@ -51,7 +53,7 @@
#wenyan img {
max-width: 100%;
height: auto;
margin:0 auto;
margin: 0 auto;
}
#wenyan table {
display: inline-block !important;
Expand Down
6 changes: 4 additions & 2 deletions WenYan/Resources.bundle/themes/toutiao_default.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
line-height: 1.75;
}
#wenyan * {
margin: 1em 0;
box-sizing: border-box;
}
#wenyan h1, h2, h3, h4, h5, h6, p, pre {
margin: 1em 0;
}
#wenyan pre code::-webkit-scrollbar {
width: 6px;
height: 6px;
Expand Down Expand Up @@ -50,7 +52,7 @@
#wenyan img {
max-width: 100%;
height: auto;
margin:0 auto;
margin: 0 auto;
}
#wenyan table {
margin-left: auto;
Expand Down
6 changes: 4 additions & 2 deletions WenYan/Resources.bundle/themes/zhihu_default.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
font-size: 16px;
}
#wenyan * {
margin: 1em 0;
box-sizing: border-box;
}
#wenyan h1, h2, h3, h4, h5, h6, p, pre {
margin: 1em 0;
}
#wenyan pre code::-webkit-scrollbar {
width: 6px;
height: 6px;
Expand Down Expand Up @@ -47,7 +49,7 @@
#wenyan img {
max-width: 100%;
height: auto;
margin:0 auto;
margin: 0 auto;
}
#wenyan table {
border-collapse: collapse;
Expand Down
36 changes: 35 additions & 1 deletion WenYan/WenYanApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,45 @@ import SwiftData
struct WenYanApp: App {

@State private var appState = AppState()

var body: some Scene {
WindowGroup {
ContentView(appState: appState)
.alert(isPresented: appState.showError, error: appState.appError) {}
}
.commands {
CommandGroup(replacing: .appInfo) {
Button("About 文颜") {
NSApplication.shared.orderFrontStandardAboutPanel(
options: [
NSApplication.AboutPanelOptionKey.credits: str(),
NSApplication.AboutPanelOptionKey(
rawValue: "Copyright"
): "© 2024 Lei Cao. All rights reserved."
]
)
}
}
}
}

func str() -> NSMutableAttributedString {
let contactInfo = "问题反馈:[email protected]"
let email = "[email protected]"

// 创建一个可变的富文本字符串
let attributedString = NSMutableAttributedString(
string: contactInfo,
attributes: [
.font: NSFont.systemFont(ofSize: NSFont.smallSystemFontSize)
]
)

// 获取 email 在字符串中的范围
let emailRange = (contactInfo as NSString).range(of: email)

// 设置 email 为可点击链接
attributedString.addAttribute(.link, value: "mailto:\(email)", range: emailRange)
return attributedString
}
}

0 comments on commit e795aa4

Please sign in to comment.