From 45252f410d516a5d1c1bc58bdbdd838fdc816460 Mon Sep 17 00:00:00 2001 From: Tae Won Ha Date: Mon, 26 Dec 2016 17:04:03 +0900 Subject: [PATCH] GH-339 Add github markdown css --- VimR.xcodeproj/project.pbxproj | 30 +- VimR/MainWindowComponent.swift | 2 +- VimR/MarkdownRenderer.swift | 38 +- VimR/PreviewComponent.swift | 16 +- VimR/PreviewService.swift | 4 + VimR/markdown/github-markdown.css | 681 ++++++++++++++++++++++++++++++ VimR/markdown/template.html | 11 + VimR/preview/empty.html | 1 + VimR/preview/error.html | 1 + VimR/preview/save-first.html | 1 + 10 files changed, 768 insertions(+), 17 deletions(-) create mode 100644 VimR/markdown/github-markdown.css create mode 100644 VimR/markdown/template.html diff --git a/VimR.xcodeproj/project.pbxproj b/VimR.xcodeproj/project.pbxproj index 9a87714f..381922b7 100644 --- a/VimR.xcodeproj/project.pbxproj +++ b/VimR.xcodeproj/project.pbxproj @@ -34,10 +34,10 @@ 4B0BCC941D70320C00D3CE65 /* Logger.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B0BCC931D70320C00D3CE65 /* Logger.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4B183E0E1E06E2940079E8A8 /* CocoaMarkdown.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4B183E0D1E06E2940079E8A8 /* CocoaMarkdown.framework */; }; 4B183E101E06E29C0079E8A8 /* CocoaMarkdown.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4B183E0D1E06E2940079E8A8 /* CocoaMarkdown.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 4B183E161E07C1420079E8A8 /* preview in Resources */ = {isa = PBXBuildFile; fileRef = 4B183E151E07C1420079E8A8 /* preview */; }; 4B183E1B1E08748B0079E8A8 /* NeoVimAutoCommandEvent.generated.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B183E1A1E08748B0079E8A8 /* NeoVimAutoCommandEvent.generated.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4B183E1E1E09931E0079E8A8 /* MarkdownRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B183E1D1E09931E0079E8A8 /* MarkdownRenderer.swift */; }; - 4B19164C1E0B1D53007EA025 /* github-markdown.css in Resources */ = {isa = PBXBuildFile; fileRef = 4B19164B1E0B1D53007EA025 /* github-markdown.css */; }; + 4B19BEFC1E110183007E823C /* markdown in Resources */ = {isa = PBXBuildFile; fileRef = 4B19BEFA1E110183007E823C /* markdown */; }; + 4B19BEFD1E110183007E823C /* preview in Resources */ = {isa = PBXBuildFile; fileRef = 4B19BEFB1E110183007E823C /* preview */; }; 4B22F7F01D7C029400929B0E /* ScorerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B22F7EF1D7C029400929B0E /* ScorerTest.swift */; }; 4B22F7F21D7C6B9000929B0E /* ImageAndTextTableCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B22F7F11D7C6B9000929B0E /* ImageAndTextTableCell.swift */; }; 4B238BE11D3BF24200CBDD98 /* Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B238BE01D3BF24200CBDD98 /* Application.swift */; }; @@ -303,10 +303,10 @@ 4B0677361D99D9C3001A2588 /* FileBrowserComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileBrowserComponent.swift; sourceTree = ""; }; 4B0BCC931D70320C00D3CE65 /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logger.h; path = VimR/Logger.h; sourceTree = SOURCE_ROOT; }; 4B183E0D1E06E2940079E8A8 /* CocoaMarkdown.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CocoaMarkdown.framework; path = Carthage/Build/Mac/CocoaMarkdown.framework; sourceTree = SOURCE_ROOT; }; - 4B183E151E07C1420079E8A8 /* preview */ = {isa = PBXFileReference; lastKnownFileType = folder; path = preview; sourceTree = ""; }; 4B183E1A1E08748B0079E8A8 /* NeoVimAutoCommandEvent.generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NeoVimAutoCommandEvent.generated.h; sourceTree = ""; }; 4B183E1D1E09931E0079E8A8 /* MarkdownRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownRenderer.swift; sourceTree = ""; }; - 4B19164B1E0B1D53007EA025 /* github-markdown.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = "github-markdown.css"; path = "Carthage/Checkouts/github-markdown-css/github-markdown.css"; sourceTree = SOURCE_ROOT; }; + 4B19BEFA1E110183007E823C /* markdown */ = {isa = PBXFileReference; lastKnownFileType = folder; path = markdown; sourceTree = ""; }; + 4B19BEFB1E110183007E823C /* preview */ = {isa = PBXFileReference; lastKnownFileType = folder; path = preview; sourceTree = ""; }; 4B1BB3521D16C5E500CA4FEF /* InputTestView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputTestView.swift; sourceTree = ""; }; 4B22F7EF1D7C029400929B0E /* ScorerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScorerTest.swift; sourceTree = ""; }; 4B22F7F11D7C6B9000929B0E /* ImageAndTextTableCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageAndTextTableCell.swift; sourceTree = ""; }; @@ -687,8 +687,8 @@ 4B97E2CF1D33F92200FC0660 /* resources */ = { isa = PBXGroup; children = ( - 4B19164B1E0B1D53007EA025 /* github-markdown.css */, - 4B183E151E07C1420079E8A8 /* preview */, + 4B19BEFA1E110183007E823C /* markdown */, + 4B19BEFB1E110183007E823C /* preview */, 4BEBA50C1CFF374B00673FDF /* MainMenu.xib */, 4B97E2CE1D33F53D00FC0660 /* MainWindow.xib */, 4B029F1C1D45E349004EE0D3 /* PrefWindow.xib */, @@ -962,6 +962,7 @@ isa = PBXNativeTarget; buildConfigurationList = 4BEBA51D1CFF374B00673FDF /* Build configuration list for PBXNativeTarget "VimR" */; buildPhases = ( + 4B19BEFF1E110208007E823C /* ShellScript */, 4BEBA5011CFF374B00673FDF /* Sources */, 4BEBA5021CFF374B00673FDF /* Frameworks */, 4BEBA5031CFF374B00673FDF /* Resources */, @@ -1105,12 +1106,12 @@ 4BDF50171D77540900D8FBC3 /* OpenQuicklyWindow.xib in Resources */, 4B37ADB91D6E471B00970D55 /* vimr in Resources */, 4BB409E51DD68CCC005F39A2 /* FileBrowserMenu.xib in Resources */, - 4B19164C1E0B1D53007EA025 /* github-markdown.css in Resources */, 4BEBA50E1CFF374B00673FDF /* MainMenu.xib in Resources */, 4B97E2CC1D33F53D00FC0660 /* MainWindow.xib in Resources */, + 4B19BEFC1E110183007E823C /* markdown in Resources */, 4B029F1A1D45E349004EE0D3 /* PrefWindow.xib in Resources */, + 4B19BEFD1E110183007E823C /* preview in Resources */, 4B3AC8941DB031C600AC5823 /* sparkle_pub.pem in Resources */, - 4B183E161E07C1420079E8A8 /* preview in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1138,6 +1139,19 @@ shellPath = /bin/sh; shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if [ -f \"SwiftNeoVim/NeoVimAutoCommandEvent.generated.h\" ]; then\n exit 0\n fi\nfi\n\nsed 's/^typedef enum auto_event/typedef NS_ENUM(NSUInteger, NeoVimAutoCommandEvent)/' <./neovim/build/include/auevents_enum.generated.h | sed 's/ event_T//' | sed 's/EVENT_/NeoVimAutoCommandEvent/' | sed 's/NUM_EVENTS/NumberOfAutoCommandEvents/' | sed -e '1s/^/@import Foundation;\\'$'\\n/' > SwiftNeoVim/NeoVimAutoCommandEvent.generated.h\n"; }; + 4B19BEFF1E110208007E823C /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cp ${SRCROOT}/Carthage/Checkouts/github-markdown-css/github-markdown.css ${SRCROOT}/VimR/markdown/"; + }; 4BBA71F11D319E0900E16612 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/VimR/MainWindowComponent.swift b/VimR/MainWindowComponent.swift index 0d6ab81a..d07a492f 100644 --- a/VimR/MainWindowComponent.swift +++ b/VimR/MainWindowComponent.swift @@ -296,7 +296,7 @@ class MainWindowComponent: WindowComponent, self.neoVimView.select(buffer: buffer) default: - NSLog("WARN unrecognized action: \(action)") + NSLog("Not handled action: \(action)") return } diff --git a/VimR/MarkdownRenderer.swift b/VimR/MarkdownRenderer.swift index e17b73cb..971f6835 100644 --- a/VimR/MarkdownRenderer.swift +++ b/VimR/MarkdownRenderer.swift @@ -14,13 +14,38 @@ protocol PreviewRenderer: class { enum PreviewRendererAction { - case htmlString(renderer: PreviewRenderer, html: String) + case htmlString(renderer: PreviewRenderer, html: String, baseUrl: URL) case error(renderer: PreviewRenderer) } class MarkdownRenderer: StandardFlow, PreviewRenderer { - fileprivate let extensions = Set([ "md", "markdown", ]) + fileprivate let baseUrl = Bundle.main.resourceURL!.appendingPathComponent("markdown") + fileprivate let extensions = Set(["md", "markdown", ]) + fileprivate let template: String + + override init(source: Observable) { + guard let templateUrl = Bundle.main.url(forResource: "template", + withExtension: "html", + subdirectory: "markdown") + else { + preconditionFailure("ERROR Cannot load markdown template") + } + + guard let template = try? String(contentsOf: templateUrl) else { + preconditionFailure("ERROR Cannot load markdown template") + } + + self.template = template + + super.init(source: source) + } + + fileprivate func filledTemplate(body: String, title: String) -> String { + return self.template + .replacingOccurrences(of: "{{ title }}", with: title) + .replacingOccurrences(of: "{{ body }}", with: body) + } fileprivate func canRender(fileExtension: String) -> Bool { return extensions.contains(fileExtension) @@ -41,14 +66,19 @@ class MarkdownRenderer: StandardFlow, PreviewRenderer { } fileprivate func render(from url: URL) { + NSLog("\(#function): \(url)") + let doc = CMDocument(contentsOfFile: url.path) let renderer = CMHTMLRenderer(document: doc) - guard let html = renderer?.render() else { + guard let body = renderer?.render() else { self.publish(event: PreviewRendererAction.error) return } - self.publish(event: PreviewRendererAction.htmlString(renderer: self, html: html)) + let html = filledTemplate(body: body, title: url.lastPathComponent) + + try? html.write(toFile: "/tmp/markdown-preview.html", atomically: false, encoding: .utf8) + self.publish(event: PreviewRendererAction.htmlString(renderer: self, html: html, baseUrl: self.baseUrl)) } } diff --git a/VimR/PreviewComponent.swift b/VimR/PreviewComponent.swift index 097815b4..cca01053 100644 --- a/VimR/PreviewComponent.swift +++ b/VimR/PreviewComponent.swift @@ -38,6 +38,8 @@ class PreviewComponent: NSView, ViewComponent { fileprivate let webview = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) + fileprivate let baseUrl: URL + fileprivate var currentRenderer: PreviewRenderer? fileprivate let renderers: [PreviewRenderer] @@ -58,6 +60,8 @@ class PreviewComponent: NSView, ViewComponent { init(source: Observable) { self.flow = EmbeddableComponent(source: source) + + self.baseUrl = self.previewService.baseUrl() self.markdownRenderer = MarkdownRenderer(source: self.flow.sink) self.renderers = [ @@ -69,7 +73,7 @@ class PreviewComponent: NSView, ViewComponent { self.flow.set(subscription: self.subscription) - self.webview.loadHTMLString(self.previewService.emptyHtml(), baseURL: nil) + self.webview.loadHTMLString(self.previewService.emptyHtml(), baseURL: self.baseUrl) self.addViews() self.addReactions() @@ -96,6 +100,10 @@ class PreviewComponent: NSView, ViewComponent { return } + guard self.isOpen else { + return + } + self.flow.publish(event: PreviewAction.automaticRefresh(url: url)) case let .toggleTool(tool): @@ -122,11 +130,11 @@ class PreviewComponent: NSView, ViewComponent { switch action { - case let .htmlString(_, html): - self.webview.loadHTMLString(html, baseURL: nil) + case let .htmlString(_, html, baseUrl): + self.webview.loadHTMLString(html, baseURL: baseUrl) case .error: - self.webview.loadHTMLString(self.previewService.errorHtml(), baseURL: nil) + self.webview.loadHTMLString(self.previewService.errorHtml(), baseURL: self.baseUrl) } }) diff --git a/VimR/PreviewService.swift b/VimR/PreviewService.swift index 901460e9..4deb05fa 100644 --- a/VimR/PreviewService.swift +++ b/VimR/PreviewService.swift @@ -44,6 +44,10 @@ class PreviewService { self.saveFirst = saveFirstHtml } + func baseUrl() -> URL { + return Bundle.main.resourceURL!.appendingPathComponent("preview") + } + func emptyHtml() -> String { return self.empty } diff --git a/VimR/markdown/github-markdown.css b/VimR/markdown/github-markdown.css new file mode 100644 index 00000000..42e38eba --- /dev/null +++ b/VimR/markdown/github-markdown.css @@ -0,0 +1,681 @@ +@font-face { + font-family: octicons-link; + src: url(data:font/woff;charset=utf-8;base64,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) format('woff'); +} + +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + line-height: 1.5; + color: #333; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +.markdown-body .pl-c { + color: #969896; +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: #0086b3; +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: #795da3; +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: #333; +} + +.markdown-body .pl-ent { + color: #63a35c; +} + +.markdown-body .pl-k { + color: #a71d5d; +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: #183691; +} + +.markdown-body .pl-v { + color: #ed6a43; +} + +.markdown-body .pl-id { + color: #b52a1d; +} + +.markdown-body .pl-ii { + color: #f8f8f8; + background-color: #b52a1d; +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: #63a35c; +} + +.markdown-body .pl-ml { + color: #693a17; +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: #1d3e81; +} + +.markdown-body .pl-mq { + color: #008080; +} + +.markdown-body .pl-mi { + font-style: italic; + color: #333; +} + +.markdown-body .pl-mb { + font-weight: bold; + color: #333; +} + +.markdown-body .pl-md { + color: #bd2c00; + background-color: #ffecec; +} + +.markdown-body .pl-mi1 { + color: #55a532; + background-color: #eaffea; +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: #795da3; +} + +.markdown-body .pl-mo { + color: #1d3e81; +} + +.markdown-body .octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} + +.markdown-body a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +.markdown-body a:active, +.markdown-body a:hover { + outline-width: 0; +} + +.markdown-body strong { + font-weight: inherit; +} + +.markdown-body strong { + font-weight: bolder; +} + +.markdown-body h1 { + font-size: 2em; + margin: 0.67em 0; +} + +.markdown-body img { + border-style: none; +} + +.markdown-body svg:not(:root) { + overflow: hidden; +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre { + font-family: monospace, monospace; + font-size: 1em; +} + +.markdown-body hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +.markdown-body input { + font: inherit; + margin: 0; +} + +.markdown-body input { + overflow: visible; +} + +.markdown-body [type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +.markdown-body * { + box-sizing: border-box; +} + +.markdown-body input { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body a { + color: #4078c0; + text-decoration: none; +} + +.markdown-body a:hover, +.markdown-body a:active { + text-decoration: underline; +} + +.markdown-body strong { + font-weight: 600; +} + +.markdown-body hr { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid #ddd; +} + +.markdown-body hr::before { + display: table; + content: ""; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body h1 { + font-size: 32px; + font-weight: 600; +} + +.markdown-body h2 { + font-size: 24px; + font-weight: 600; +} + +.markdown-body h3 { + font-size: 20px; + font-weight: 600; +} + +.markdown-body h4 { + font-size: 16px; + font-weight: 600; +} + +.markdown-body h5 { + font-size: 14px; + font-weight: 600; +} + +.markdown-body h6 { + font-size: 12px; + font-weight: 600; +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; +} + +.markdown-body .octicon { + vertical-align: text-bottom; +} + +.markdown-body input { + -webkit-font-feature-settings: "liga" 0; + font-feature-settings: "liga" 0; +} + +.markdown-body::before { + display: table; + content: ""; +} + +.markdown-body::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body>*:first-child { + margin-top: 0 !important; +} + +.markdown-body>*:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body hr { + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: #e7e7e7; + border: 0; +} + +.markdown-body blockquote { + padding: 0 1em; + color: #777; + border-left: 0.25em solid #ddd; +} + +.markdown-body blockquote>:first-child { + margin-top: 0; +} + +.markdown-body blockquote>:last-child { + margin-bottom: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #555; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #ccc; + border-bottom-color: #bbb; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: #000; + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid #eee; +} + +.markdown-body h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid #eee; +} + +.markdown-body h3 { + font-size: 1.25em; +} + +.markdown-body h4 { + font-size: 1em; +} + +.markdown-body h5 { + font-size: 0.875em; +} + +.markdown-body h6 { + font-size: 0.85em; + color: #777; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 2em; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li>p { + margin-top: 16px; +} + +.markdown-body li+li { + margin-top: 0.25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: bold; +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table { + display: block; + width: 100%; + overflow: auto; +} + +.markdown-body table th { + font-weight: bold; +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid #ddd; +} + +.markdown-body table tr { + background-color: #fff; + border-top: 1px solid #ccc; +} + +.markdown-body table tr:nth-child(2n) { + background-color: #f8f8f8; +} + +.markdown-body img { + max-width: 100%; + box-sizing: content-box; + background-color: #fff; +} + +.markdown-body code { + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; + margin: 0; + font-size: 85%; + background-color: rgba(0,0,0,0.04); + border-radius: 3px; +} + +.markdown-body code::before, +.markdown-body code::after { + letter-spacing: -0.2em; + content: "\00a0"; +} + +.markdown-body pre { + word-wrap: normal; +} + +.markdown-body pre>code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f7f7f7; + border-radius: 3px; +} + +.markdown-body pre code { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body pre code::before, +.markdown-body pre code::after { + content: normal; +} + +.markdown-body .pl-0 { + padding-left: 0 !important; +} + +.markdown-body .pl-1 { + padding-left: 3px !important; +} + +.markdown-body .pl-2 { + padding-left: 6px !important; +} + +.markdown-body .pl-3 { + padding-left: 12px !important; +} + +.markdown-body .pl-4 { + padding-left: 24px !important; +} + +.markdown-body .pl-5 { + padding-left: 36px !important; +} + +.markdown-body .pl-6 { + padding-left: 48px !important; +} + +.markdown-body .full-commit .btn-outline:not(:disabled):hover { + color: #4078c0; + border: 1px solid #4078c0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; + line-height: 10px; + color: #555; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #ccc; + border-bottom-color: #bbb; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; +} + +.markdown-body :checked+.radio-label { + position: relative; + z-index: 1; + border-color: #4078c0; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item+.task-list-item { + margin-top: 3px; +} + +.markdown-body .task-list-item input { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; +} + +.markdown-body hr { + border-bottom-color: #eee; +} diff --git a/VimR/markdown/template.html b/VimR/markdown/template.html new file mode 100644 index 00000000..e96cda46 --- /dev/null +++ b/VimR/markdown/template.html @@ -0,0 +1,11 @@ + + + + + + {{ title }} + + +{{ body }} + + diff --git a/VimR/preview/empty.html b/VimR/preview/empty.html index 879dd614..402ff597 100644 --- a/VimR/preview/empty.html +++ b/VimR/preview/empty.html @@ -2,6 +2,7 @@ + Empty diff --git a/VimR/preview/error.html b/VimR/preview/error.html index 66a757da..93587ccb 100644 --- a/VimR/preview/error.html +++ b/VimR/preview/error.html @@ -2,6 +2,7 @@ + Error diff --git a/VimR/preview/save-first.html b/VimR/preview/save-first.html index e6d99094..2114037d 100644 --- a/VimR/preview/save-first.html +++ b/VimR/preview/save-first.html @@ -2,6 +2,7 @@ + Error