mirror of https://github.com/writeas/writefreely
parent
cb1553d67e
commit
ee712bbfaa
File diff suppressed because one or more lines are too long
@ -0,0 +1,365 @@ |
||||
.ProseMirror { |
||||
position: relative; |
||||
} |
||||
|
||||
.ProseMirror { |
||||
word-wrap: break-word; |
||||
white-space: pre-wrap; |
||||
-webkit-font-variant-ligatures: none; |
||||
font-variant-ligatures: none; |
||||
} |
||||
|
||||
.ProseMirror pre { |
||||
white-space: pre-wrap; |
||||
} |
||||
|
||||
.ProseMirror li { |
||||
position: relative; |
||||
} |
||||
|
||||
.ProseMirror-hideselection *::selection { background: transparent; } |
||||
.ProseMirror-hideselection *::-moz-selection { background: transparent; } |
||||
.ProseMirror-hideselection { caret-color: transparent; } |
||||
|
||||
.ProseMirror-selectednode { |
||||
outline: 2px solid #8cf; |
||||
} |
||||
|
||||
/* Make sure li selections wrap around markers */ |
||||
|
||||
li.ProseMirror-selectednode { |
||||
outline: none; |
||||
} |
||||
|
||||
li.ProseMirror-selectednode:after { |
||||
content: ""; |
||||
position: absolute; |
||||
left: -32px; |
||||
right: -2px; top: -2px; bottom: -2px; |
||||
border: 2px solid #8cf; |
||||
pointer-events: none; |
||||
} |
||||
.ProseMirror-textblock-dropdown { |
||||
min-width: 3em; |
||||
} |
||||
|
||||
.ProseMirror-menu { |
||||
margin: 0 -4px; |
||||
line-height: 1; |
||||
} |
||||
|
||||
.ProseMirror-tooltip .ProseMirror-menu { |
||||
width: -webkit-fit-content; |
||||
width: fit-content; |
||||
white-space: pre; |
||||
} |
||||
|
||||
.ProseMirror-menuitem { |
||||
margin-right: 3px; |
||||
display: inline-block; |
||||
} |
||||
|
||||
.ProseMirror-menuseparator { |
||||
border-right: 1px solid #ddd; |
||||
margin-right: 3px; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown, .ProseMirror-menu-dropdown-menu { |
||||
font-size: 90%; |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown { |
||||
vertical-align: 1px; |
||||
cursor: pointer; |
||||
position: relative; |
||||
padding-right: 15px; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown-wrap { |
||||
padding: 1px 0 1px 4px; |
||||
display: inline-block; |
||||
position: relative; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown:after { |
||||
content: ""; |
||||
border-left: 4px solid transparent; |
||||
border-right: 4px solid transparent; |
||||
border-top: 4px solid currentColor; |
||||
opacity: .6; |
||||
position: absolute; |
||||
right: 4px; |
||||
top: calc(50% - 2px); |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown-menu, .ProseMirror-menu-submenu { |
||||
position: absolute; |
||||
background: white; |
||||
color: #666; |
||||
border: 1px solid #aaa; |
||||
padding: 2px; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown-menu { |
||||
z-index: 15; |
||||
min-width: 6em; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown-item { |
||||
cursor: pointer; |
||||
padding: 2px 8px 2px 4px; |
||||
} |
||||
|
||||
.ProseMirror-menu-dropdown-item:hover { |
||||
background: #f2f2f2; |
||||
} |
||||
|
||||
.ProseMirror-menu-submenu-wrap { |
||||
position: relative; |
||||
margin-right: -4px; |
||||
} |
||||
|
||||
.ProseMirror-menu-submenu-label:after { |
||||
content: ""; |
||||
border-top: 4px solid transparent; |
||||
border-bottom: 4px solid transparent; |
||||
border-left: 4px solid currentColor; |
||||
opacity: .6; |
||||
position: absolute; |
||||
right: 4px; |
||||
top: calc(50% - 4px); |
||||
} |
||||
|
||||
.ProseMirror-menu-submenu { |
||||
display: none; |
||||
min-width: 4em; |
||||
left: 100%; |
||||
top: -3px; |
||||
} |
||||
|
||||
.ProseMirror-menu-active { |
||||
background: #eee; |
||||
border-radius: 4px; |
||||
} |
||||
|
||||
.ProseMirror-menu-active { |
||||
background: #eee; |
||||
border-radius: 4px; |
||||
} |
||||
|
||||
.ProseMirror-menu-disabled { |
||||
opacity: .3; |
||||
} |
||||
|
||||
.ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu, .ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu { |
||||
display: block; |
||||
} |
||||
|
||||
.ProseMirror-menubar { |
||||
border-top-left-radius: inherit; |
||||
border-top-right-radius: inherit; |
||||
position: relative; |
||||
min-height: 1em; |
||||
color: #666; |
||||
padding: 1px 6px; |
||||
top: 0; left: 0; right: 0; |
||||
border-bottom: 1px solid silver; |
||||
background: white; |
||||
z-index: 10; |
||||
-moz-box-sizing: border-box; |
||||
box-sizing: border-box; |
||||
overflow: visible; |
||||
} |
||||
|
||||
.ProseMirror-icon { |
||||
display: inline-block; |
||||
line-height: .8; |
||||
vertical-align: -2px; /* Compensate for padding */ |
||||
padding: 2px 8px; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.ProseMirror-menu-disabled.ProseMirror-icon { |
||||
cursor: default; |
||||
} |
||||
|
||||
.ProseMirror-icon svg { |
||||
fill: currentColor; |
||||
height: 1em; |
||||
} |
||||
|
||||
.ProseMirror-icon span { |
||||
vertical-align: text-top; |
||||
} |
||||
.ProseMirror-gapcursor { |
||||
display: none; |
||||
pointer-events: none; |
||||
position: absolute; |
||||
} |
||||
|
||||
.ProseMirror-gapcursor:after { |
||||
content: ""; |
||||
display: block; |
||||
position: absolute; |
||||
top: -2px; |
||||
width: 20px; |
||||
border-top: 1px solid black; |
||||
animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite; |
||||
} |
||||
|
||||
@keyframes ProseMirror-cursor-blink { |
||||
to { |
||||
visibility: hidden; |
||||
} |
||||
} |
||||
|
||||
.ProseMirror-focused .ProseMirror-gapcursor { |
||||
display: block; |
||||
} |
||||
/* Add space around the hr to make clicking it easier */ |
||||
|
||||
.ProseMirror-example-setup-style hr { |
||||
padding: 2px 10px; |
||||
border: none; |
||||
margin: 1em 0; |
||||
} |
||||
|
||||
.ProseMirror-example-setup-style hr:after { |
||||
content: ""; |
||||
display: block; |
||||
height: 1px; |
||||
background-color: silver; |
||||
line-height: 2px; |
||||
} |
||||
|
||||
.ProseMirror ul, .ProseMirror ol { |
||||
padding-left: 30px; |
||||
} |
||||
|
||||
.ProseMirror blockquote { |
||||
padding-left: 1em; |
||||
border-left: 3px solid #eee; |
||||
margin-left: 0; margin-right: 0; |
||||
} |
||||
|
||||
.ProseMirror-example-setup-style img { |
||||
cursor: default; |
||||
} |
||||
|
||||
.ProseMirror-prompt { |
||||
background: white; |
||||
padding: 5px 10px 5px 15px; |
||||
border: 1px solid silver; |
||||
position: fixed; |
||||
border-radius: 3px; |
||||
z-index: 11; |
||||
box-shadow: -.5px 2px 5px rgba(0, 0, 0, .2); |
||||
} |
||||
|
||||
.ProseMirror-prompt h5 { |
||||
margin: 0; |
||||
font-weight: normal; |
||||
font-size: 100%; |
||||
color: #444; |
||||
} |
||||
|
||||
.ProseMirror-prompt input[type="text"], |
||||
.ProseMirror-prompt textarea { |
||||
background: #eee; |
||||
border: none; |
||||
outline: none; |
||||
} |
||||
|
||||
.ProseMirror-prompt input[type="text"] { |
||||
padding: 0 4px; |
||||
} |
||||
|
||||
.ProseMirror-prompt-close { |
||||
position: absolute; |
||||
left: 2px; top: 1px; |
||||
color: #666; |
||||
border: none; background: transparent; padding: 0; |
||||
} |
||||
|
||||
.ProseMirror-prompt-close:after { |
||||
content: "✕"; |
||||
font-size: 12px; |
||||
} |
||||
|
||||
.ProseMirror-invalid { |
||||
background: #ffc; |
||||
border: 1px solid #cc7; |
||||
border-radius: 4px; |
||||
padding: 5px 10px; |
||||
position: absolute; |
||||
min-width: 10em; |
||||
} |
||||
|
||||
.ProseMirror-prompt-buttons { |
||||
margin-top: 5px; |
||||
display: none; |
||||
} |
||||
#editor, .editor { |
||||
background: white; |
||||
color: black; |
||||
background-clip: padding-box; |
||||
border-radius: 4px; |
||||
border: 2px solid rgba(0, 0, 0, 0.2); |
||||
padding: 5px 0; |
||||
margin: 4em auto 23px auto; |
||||
} |
||||
|
||||
.ProseMirror p:first-child, |
||||
.ProseMirror h1:first-child, |
||||
.ProseMirror h2:first-child, |
||||
.ProseMirror h3:first-child, |
||||
.ProseMirror h4:first-child, |
||||
.ProseMirror h5:first-child, |
||||
.ProseMirror h6:first-child { |
||||
margin-top: 10px; |
||||
} |
||||
|
||||
.ProseMirror { |
||||
padding: 4px 8px 4px 14px; |
||||
line-height: 1.2; |
||||
outline: none; |
||||
} |
||||
|
||||
.ProseMirror p { margin-bottom: 1em } |
||||
|
||||
.ProseMirror { height: 120px; overflow-y: auto; box-sizing: border-box; -moz-box-sizing: border-box } |
||||
textarea { width: 100%; height: 123px; border: 1px solid silver; box-sizing: border-box; -moz-box-sizing: border-box; padding: 3px 10px; |
||||
border: none; outline: none; font-family: inherit; font-size: inherit } |
||||
.ProseMirror-menubar-wrapper, #markdown textarea { display: block; margin-bottom: 4px } |
||||
|
||||
@media all and (min-width: 50em) { |
||||
#editor { |
||||
margin-left: 10%; |
||||
margin-right: 10%; |
||||
} |
||||
} |
||||
@media all and (min-width: 60em) { |
||||
#editor { |
||||
margin-left: 15%; |
||||
margin-right: 15%; |
||||
} |
||||
} |
||||
@media all and (min-width: 70em) { |
||||
#editor { |
||||
margin-left: 20%; |
||||
margin-right: 20%; |
||||
} |
||||
} |
||||
@media all and (min-width: 85em) { |
||||
#editor { |
||||
margin-left: 25%; |
||||
margin-right: 25%; |
||||
} |
||||
} |
||||
@media all and (min-width: 105em) { |
||||
#editor { |
||||
margin-left: 30%; |
||||
margin-right: 30%; |
||||
} |
||||
} |
File diff suppressed because one or more lines are too long
@ -0,0 +1,376 @@ |
||||
{{define "pad"}}<!DOCTYPE HTML> |
||||
<html> |
||||
<head> |
||||
|
||||
<title>{{if .Editing}}Editing {{if .Post.Title}}{{.Post.Title}}{{else}}{{.Post.Id}}{{end}}{{else}}New Post{{end}} — {{.SiteName}}</title> |
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/write.css" /> |
||||
<link rel="stylesheet" type="text/css" href="/css/prose.css" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
|
||||
<meta name="google" value="notranslate"> |
||||
</head> |
||||
<body id="pad" class="light"> |
||||
|
||||
<div id="overlay"></div> |
||||
|
||||
<!-- <div style="text-align: center"> --> |
||||
<!-- <label style="border-right: 1px solid silver"> --> |
||||
<!-- Markdown <input type=radio name=inputformat value=markdown checked> </label> --> |
||||
<!-- <label> <input type=radio name=inputformat value=prosemirror> WYSIWYM</label> --> |
||||
<!-- </div> --> |
||||
<div id="editor" style="margin-bottom: 0"></div> |
||||
|
||||
<div style="display: none"><textarea id="content">{{if .Post.Content }}{{.Post.Content}}{{end}}</textarea></div> |
||||
|
||||
<header id="tools"> |
||||
<div id="clip"> |
||||
{{if not .SingleUser}}<h1><a href="/me/c/" title="View blogs"><img class="ic-24dp" src="/img/ic_blogs_dark@2x.png" /></a></h1>{{end}} |
||||
<nav id="target" {{if .SingleUser}}style="margin-left:0"{{end}}><ul> |
||||
{{if .Editing}}<li>{{if .EditCollection}}<a href="{{.EditCollection.CanonicalURL}}">{{.EditCollection.Title}}</a>{{else}}<a>Draft</a>{{end}}</li> |
||||
{{else}}<li><a id="publish-to"><span id="target-name">Draft</span> <img class="ic-18dp" src="/img/ic_down_arrow_dark@2x.png" /></a> |
||||
<ul> |
||||
<li class="menu-heading">Publish to...</li> |
||||
{{if .Blogs}}{{range $idx, $el := .Blogs}} |
||||
<li class="target{{if eq $idx 0}} selected{{end}}" id="blog-{{$el.Alias}}"><a href="#{{$el.Alias}}"><i class="material-icons md-18">public</i> {{if $el.Title}}{{$el.Title}}{{else}}{{$el.Alias}}{{end}}</a></li> |
||||
{{end}}{{end}} |
||||
<li class="target" id="blog-anonymous"><a href="#anonymous"><i class="material-icons md-18">description</i> <em>Draft</em></a></li> |
||||
<li id="user-separator" class="separator"><hr /></li> |
||||
{{ if .SingleUser }} |
||||
<li><a href="/"><i class="material-icons md-18">launch</i> View Blog</a></li> |
||||
<li><a href="/me/c/{{.Username}}"><i class="material-icons md-18">palette</i> Customize</a></li> |
||||
<li><a href="/me/c/{{.Username}}/stats"><i class="material-icons md-18">trending_up</i> Stats</a></li> |
||||
{{ else }} |
||||
<li><a href="/me/c/"><i class="material-icons md-18">library_books</i> View Blogs</a></li> |
||||
{{ end }} |
||||
<li><a href="/me/posts/"><i class="material-icons md-18">view_list</i> View Drafts</a></li> |
||||
<li><a href="/me/logout"><i class="material-icons md-18">power_settings_new</i> Log out</a></li> |
||||
</ul> |
||||
</li>{{end}} |
||||
</ul></nav> |
||||
<nav id="font-picker" class="if-room room-3 hidden" style="margin-left:-1em"><ul> |
||||
<li><a href="#" id="" onclick="return false"><img class="ic-24dp" src="/img/ic_font_dark@2x.png" /> <img class="ic-18dp" src="/img/ic_down_arrow_dark@2x.png" /></a> |
||||
<ul style="text-align: center"> |
||||
<li class="menu-heading">Font</li> |
||||
<li class="selected"><a class="font norm" href="#norm">Serif</a></li> |
||||
<li><a class="font sans" href="#sans">Sans-serif</a></li> |
||||
<li><a class="font wrap" href="#wrap">Monospace</a></li> |
||||
</ul> |
||||
</li> |
||||
</ul></nav> |
||||
<span id="wc" class="hidden if-room room-4">0 words</span> |
||||
</div> |
||||
<noscript style="margin-left: 2em;"><strong>NOTE</strong>: for now, you'll need Javascript enabled to post.</noscript> |
||||
<div id="belt"> |
||||
{{if .Editing}}<div class="tool hidden if-room"><a href="{{if .EditCollection}}{{.EditCollection.CanonicalURL}}{{.Post.Slug}}/edit/meta{{else}}/{{if .SingleUser}}d/{{end}}{{.Post.Id}}/meta{{end}}" title="Edit post metadata" id="edit-meta"><img class="ic-24dp" src="/img/ic_info_dark@2x.png" /></a></div>{{end}} |
||||
<div class="tool hidden if-room room-2"><a href="#theme" title="Toggle theme" id="toggle-theme"><img class="ic-24dp" src="/img/ic_brightness_dark@2x.png" /></a></div> |
||||
<div class="tool if-room room-1"><a href="{{if not .User}}/pad/posts{{else}}/me/posts/{{end}}" title="View posts" id="view-posts"><img class="ic-24dp" src="/img/ic_list_dark@2x.png" /></a></div> |
||||
<div class="tool"><a href="#publish" title="Publish" id="publish"><img class="ic-24dp" src="/img/ic_send_dark@2x.png" /></a></div> |
||||
</div> |
||||
</header> |
||||
|
||||
<script src="/js/prose.bundle.js"></script> |
||||
<script src="/js/h.js"></script> |
||||
<script> |
||||
function toggleTheme() { |
||||
var btns = Array.prototype.slice.call(document.getElementById('tools').querySelectorAll('a img')); |
||||
var newTheme = ''; |
||||
if (document.body.classList.contains('light')) { |
||||
newTheme = 'dark'; |
||||
document.body.className = document.body.className.replace(/(?:^|\s)light(?!\S)/g, newTheme); |
||||
for (var i=0; i<btns.length; i++) { |
||||
btns[i].src = btns[i].src.replace('_dark@2x.png', '@2x.png'); |
||||
} |
||||
} else { |
||||
TextnewTheme = 'light'; |
||||
document.body.className = document.body.className.replace(/(?:^|\s)dark(?!\S)/g, newTheme); |
||||
for (var i=0; i<btns.length; i++) { |
||||
btns[i].src = btns[i].src.replace('@2x.png', '_dark@2x.png'); |
||||
} |
||||
} |
||||
H.set('padTheme', newTheme); |
||||
} |
||||
if (H.get('padTheme', 'light') != 'light') { |
||||
toggleTheme(); |
||||
} |
||||
var $writer = H.getQEl('div.ProseMirror'); |
||||
var $content = H.getEl('content'); |
||||
var $btnPublish = H.getEl('publish'); |
||||
var $wc = H.getEl("wc"); |
||||
var updateWordCount = function() { |
||||
var words = 0; |
||||
var val = $content.el.innerText.trim(); |
||||
if (val != '') { |
||||
words = $content.el.innerText.trim().replace(/\s+/gi, ' ').split(' ').length; |
||||
} |
||||
$wc.el.innerText = words + " word" + (words != 1 ? "s" : ""); |
||||
}; |
||||
var setButtonStates = function() { |
||||
if (!canPublish) { |
||||
$btnPublish.el.className = 'disabled'; |
||||
return; |
||||
} |
||||
if ($content.el.innerText.length === 0 || (draftDoc != 'lastDoc' && $content.el.innerText == origDoc)) { |
||||
$btnPublish.el.className = 'disabled'; |
||||
} else { |
||||
$btnPublish.el.className = ''; |
||||
} |
||||
}; |
||||
{{if .Post.Id}}var draftDoc = 'draft{{.Post.Id}}'; |
||||
var origDoc = '{{.Post.Content}}';{{else}}var draftDoc = 'lastDoc';{{end}} |
||||
H.loadText($content, draftDoc, true); |
||||
updateWordCount(); |
||||
|
||||
var typingTimer; |
||||
var doneTypingInterval = 200; |
||||
|
||||
var posts; |
||||
{{if and .Post.Id (not .Post.Slug)}} |
||||
var token = null; |
||||
var curPostIdx; |
||||
posts = JSON.parse(H.get('posts', '[]')); |
||||
for (var i=0; i<posts.length; i++) { |
||||
if (posts[i].id == "{{.Post.Id}}") { |
||||
token = posts[i].token; |
||||
break; |
||||
} |
||||
} |
||||
var canPublish = token != null; |
||||
{{else}}var canPublish = true;{{end}} |
||||
var publishing = false; |
||||
var justPublished = false; |
||||
var silenced = {{.Silenced}}; |
||||
var publish = function(content, font) { |
||||
if (silenced === true) { |
||||
alert("Your account is silenced, so you can't publish or update posts."); |
||||
return; |
||||
} |
||||
{{if and (and .Post.Id (not .Post.Slug)) (not .User)}} |
||||
if (!token) { |
||||
alert("You don't have permission to update this post."); |
||||
return; |
||||
} |
||||
if ($btnPublish.el.className == 'disabled') { |
||||
return; |
||||
} |
||||
{{end}} |
||||
$btnPublish.el.children[0].textContent = 'more_horiz'; |
||||
publishing = true; |
||||
var xpostTarg = H.get('crosspostTarget', '[]'); |
||||
|
||||
var http = new XMLHttpRequest(); |
||||
var lang = navigator.languages ? navigator.languages[0] : (navigator.language || navigator.userLanguage); |
||||
lang = lang.substring(0, 2); |
||||
var post = H.getTitleStrict(content); |
||||
|
||||
var params = { |
||||
body: post.content, |
||||
title: post.title, |
||||
font: font, |
||||
lang: lang |
||||
}; |
||||
{{ if .Post.Slug }} |
||||
var url = "/api/collections/{{.EditCollection.Alias}}/posts/{{.Post.Id}}"; |
||||
{{ else if .Post.Id }} |
||||
var url = "/api/posts/{{.Post.Id}}"; |
||||
if (typeof token === 'undefined' || !token) { |
||||
token = ""; |
||||
} |
||||
params.token = token; |
||||
{{ else }} |
||||
var url = "/api/posts"; |
||||
var postTarget = H.get('postTarget', 'anonymous'); |
||||
if (postTarget != 'anonymous') { |
||||
url = "/api/collections/" + postTarget + "/posts"; |
||||
} |
||||
params.crosspost = JSON.parse(xpostTarg); |
||||
{{ end }} |
||||
|
||||
http.open("POST", url, true); |
||||
|
||||
// Send the proper header information along with the request |
||||
http.setRequestHeader("Content-type", "application/json"); |
||||
|
||||
http.onreadystatechange = function() { |
||||
if (http.readyState == 4) { |
||||
publishing = false; |
||||
if (http.status == 200 || http.status == 201) { |
||||
data = JSON.parse(http.responseText); |
||||
id = data.data.id; |
||||
nextURL = '{{if .SingleUser}}/d{{end}}/'+id; |
||||
|
||||
{{ if not .Post.Id }} |
||||
// Post created |
||||
if (postTarget != 'anonymous') { |
||||
nextURL = {{if not .SingleUser}}'/'+postTarget+{{end}}'/'+data.data.slug; |
||||
} |
||||
editToken = data.data.token; |
||||
|
||||
{{ if not .User }}if (postTarget == 'anonymous') { |
||||
// Save the data |
||||
var posts = JSON.parse(H.get('posts', '[]')); |
||||
|
||||
{{if .Post.Id}}var newPost = H.createPost("{{.Post.Id}}", token, content); |
||||
for (var i=0; i<posts.length; i++) { |
||||
if (posts[i].id == "{{.Post.Id}}") { |
||||
posts[i].title = newPost.title; |
||||
posts[i].summary = newPost.summary; |
||||
break; |
||||
} |
||||
} |
||||
nextURL = "/pad/posts";{{else}}posts.push(H.createPost(id, editToken, content));{{end}} |
||||
|
||||
H.set('posts', JSON.stringify(posts)); |
||||
} |
||||
{{ end }} |
||||
{{ end }} |
||||
|
||||
justPublished = true; |
||||
if (draftDoc != 'lastDoc') { |
||||
H.remove(draftDoc); |
||||
{{if .Editing}}H.remove('draft{{.Post.Id}}font');{{end}} |
||||
} else { |
||||
H.set(draftDoc, ''); |
||||
} |
||||
|
||||
{{if .EditCollection}} |
||||
window.location = '{{.EditCollection.CanonicalURL}}{{.Post.Slug}}'; |
||||
{{else}} |
||||
window.location = nextURL; |
||||
{{end}} |
||||
} else { |
||||
$btnPublish.el.children[0].textContent = 'send'; |
||||
alert("Failed to post. Please try again."); |
||||
} |
||||
} |
||||
} |
||||
http.send(JSON.stringify(params)); |
||||
}; |
||||
|
||||
setButtonStates(); |
||||
$writer.on('keyup input', function() { |
||||
setButtonStates(); |
||||
clearTimeout(typingTimer); |
||||
typingTimer = setTimeout(doneTyping, doneTypingInterval); |
||||
}, false); |
||||
$writer.on('keydown', function(e) { |
||||
clearTimeout(typingTimer); |
||||
if (e.keyCode == 13 && (e.metaKey || e.ctrlKey)) { |
||||
$btnPublish.el.click(); |
||||
} |
||||
}); |
||||
$btnPublish.on('click', function(e) { |
||||
e.preventDefault(); |
||||
if (!publishing && $content.el.innerText) { |
||||
var content = $content.el.innerText; |
||||
publish(content, selectedFont); |
||||
} |
||||
}); |
||||
|
||||
H.getEl('toggle-theme').on('click', function(e) { |
||||
e.preventDefault(); |
||||
var newTheme = 'light'; |
||||
if (document.body.className == 'light') { |
||||
newTheme = 'dark'; |
||||
} |
||||
toggleTheme(); |
||||
}); |
||||
|
||||
var targets = document.querySelectorAll('#target li.target a'); |
||||
for (var i=0; i<targets.length; i++) { |
||||
targets[i].addEventListener('click', function(e) { |
||||
e.preventDefault(); |
||||
var targetName = this.href.substring(this.href.indexOf('#')+1); |
||||
H.set('postTarget', targetName); |
||||
|
||||
document.querySelector('#target li.target.selected').classList.remove('selected'); |
||||
this.parentElement.classList.add('selected'); |
||||
var newText = this.innerText.split(' '); |
||||
newText.shift(); |
||||
document.getElementById('target-name').innerText = newText.join(' '); |
||||
}); |
||||
} |
||||
var postTarget = H.get('postTarget', '{{if .Blogs}}{{$blog := index .Blogs 0}}{{$blog.Alias}}{{else}}anonymous{{end}}'); |
||||
if (location.hash != '') { |
||||
postTarget = location.hash.substring(1); |
||||
// TODO: pushState to /pad (or whatever the URL is) so we live on a clean URL |
||||
location.hash = ''; |
||||
} |
||||
var pte = document.querySelector('#target li.target#blog-'+postTarget+' a'); |
||||
if (pte != null) { |
||||
pte.click(); |
||||
} else { |
||||
postTarget = 'anonymous'; |
||||
H.set('postTarget', postTarget); |
||||
} |
||||
|
||||
var sansLoaded = false; |
||||
WebFontConfig = { |
||||
custom: { families: [ 'Lora:400,700:latin' ], urls: [ '/css/fonts.css' ] } |
||||
}; |
||||
var loadSans = function() { |
||||
if (sansLoaded) return; |
||||
sansLoaded = true; |
||||
WebFontConfig.custom.families.push('Open+Sans:400,700:latin'); |
||||
try { |
||||
(function() { |
||||
var wf=document.createElement('script'); |
||||
wf.src = '/js/webfont.js'; |
||||
wf.type='text/javascript'; |
||||
wf.async='true'; |
||||
var s=document.getElementsByTagName('script')[0]; |
||||
s.parentNode.insertBefore(wf, s); |
||||
})(); |
||||
} catch (e) {} |
||||
}; |
||||
var fonts = document.querySelectorAll('nav#font-picker a.font'); |
||||
for (var i=0; i<fonts.length; i++) { |
||||
fonts[i].addEventListener('click', function(e) { |
||||
e.preventDefault(); |
||||
selectedFont = this.href.substring(this.href.indexOf('#')+1); |
||||
// TODO: don't change classes on the editor window |
||||
//$writer.el.className = selectedFont; |
||||
document.querySelector('nav#font-picker li.selected').classList.remove('selected'); |
||||
this.parentElement.classList.add('selected'); |
||||
H.set('{{if .Editing}}draft{{.Post.Id}}font{{else}}padFont{{end}}', selectedFont); |
||||
if (selectedFont == 'sans') { |
||||
loadSans(); |
||||
} |
||||
}); |
||||
} |
||||
var selectedFont = H.get('{{if .Editing}}draft{{.Post.Id}}font{{else}}padFont{{end}}', '{{.Post.Font}}'); |
||||
var sfe = document.querySelector('nav#font-picker a.font.'+selectedFont); |
||||
if (sfe != null) { |
||||
sfe.click(); |
||||
} |
||||
|
||||
var doneTyping = function() { |
||||
if (draftDoc == 'lastDoc' || $content.el.innerText != origDoc) { |
||||
H.saveText($content, draftDoc); |
||||
updateWordCount(); |
||||
} |
||||
}; |
||||
window.addEventListener('beforeunload', function(e) { |
||||
if (draftDoc != 'lastDoc' && $content.el.innerText == origDoc) { |
||||
H.remove(draftDoc); |
||||
} else if (!justPublished) { |
||||
doneTyping(); |
||||
} |
||||
}); |
||||
|
||||
try { |
||||
(function() { |
||||
var wf=document.createElement('script'); |
||||
wf.src = '/js/webfont.js'; |
||||
wf.type='text/javascript'; |
||||
wf.async='true'; |
||||
var s=document.getElementsByTagName('script')[0]; |
||||
s.parentNode.insertBefore(wf, s); |
||||
})(); |
||||
} catch (e) { |
||||
// whatevs |
||||
} |
||||
</script> |
||||
<link href="/css/icons.css" rel="stylesheet"> |
||||
</body> |
||||
</html>{{end}} |
Loading…
Reference in new issue