kickstart-node
Version:
A front-end framework for clean HTML and fast performance
180 lines (145 loc) • 5.62 kB
text/coffeescript
document.addEventListener 'DOMContentLoaded', ->
window.$$ = (el) -> document.querySelectorAll(el)
window.$ = (el) -> $$(el)[0]
###
CRUD DOCUMENTATION SETTINGS
###
# Default settings
defaults =
viewOptions:
jquery: false
semantic: true
booleanViewOptions = ['jquery', 'semantic']
# Retrieve user's saved settings
options = JSON.parse localStorage.getItem 'kickstartDocs'
# Create shallow extend function
# (http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/)
extend = (destination, source) ->
for property of source
if source[property] and source[property].constructor and source[property].constructor is Object
destination[property] = destination[property] or {}
arguments.callee destination[property], source[property]
else
destination[property] = source[property]
destination
# Extend from defaults
settings = if options then extend defaults, options else defaults
# Create function to write to localStorage
setSettings = (settings) ->
localStorage.setItem 'kickstartDocs', JSON.stringify settings
for option in booleanViewOptions
if settings.viewOptions["#{option}"]
document.body.classList.add "show-#{option}"
else
document.body.classList.remove "show-#{option}"
# Write to localStorage
setSettings(settings)
els = []
for option in booleanViewOptions
option = "#docs-#{option}"
els.push option
if $$(els).length
# This page has checkboxes for view options.
for option in booleanViewOptions
# Closure needed for event listeners
do (option) ->
window["$opt#{option}"] = $ "#docs-#{option}"
# Set state of buttons based on saved options in localStorage
window["$opt#{option}"].checked = (if settings.viewOptions["#{option}"] then true else false)
# Listen for checkbox changes
window["$opt#{option}"].addEventListener 'click', ->
settings.viewOptions["#{option}"] = this.checked
setSettings settings
# Show growls
if k$.$('#example-showGrowl')
k$.$('#example-showGrowl').addEventListener 'click', ->
growls = [
{
title: 'Document Saved.',
text: 'Your document was successfully saved.'
type: 'alert-green'
},
{
title: 'Library book not found'
text: 'Sorry, we could find that library book.',
type: 'alert-red'
},
{
title: 'Wide clearance selection',
text: 'Remember to check out our clearance',
type: 'alert-blue'
},
{
title: 'Deadline approaching',
text: 'Friendly reminder that your deadline is quickly approaching.',
type: 'alert-yellow'
}
]
k$.exampleCounter++
k$.exampleCounter = 0 if not k$.exampleCounter or k$.exampleCounter > 3
k$.growl growls[k$.exampleCounter]
# Show status message
if k$.$('#example-showStatus')
k$.$('#example-showStatus').addEventListener 'click', ->
statuses = [
{
text: 'Document Saved.',
type: 'status-green'
},
{
text: 'Sorry, we could find that library book.',
type: 'status-red'
},
{
text: 'Remember to check out our clearance',
type: 'status-blue'
},
{
text: 'Deadline is approaching!',
type: 'status-yellow'
}
]
k$.exampleCounter++
k$.exampleCounter = 0 if not k$.exampleCounter or k$.exampleCounter > 3
k$.status(statuses[k$.exampleCounter])
k$.slugify = (str) ->
`str.toLowerCase().replace(/ /g,'-').replace(/[^\w-]+/g,'')`
# Create a table of contents
if k$.$$('#toc').length
k$.$('.creating-table').parentNode.removeChild k$.$('.creating-table')
$toc = document.createElement 'ul'
$toc.className = "list list-unstyled"
$link = document.createElement('li')
$link.innerHTML = '<a></a>'
# Assuming proper html, start with h1.
$headingLevel = 1
# The node we're currently appending to. Always a ul.
$targetNode = $toc
$documentContainer = k$.$('.document-container')
for heading in $documentContainer.querySelectorAll('h1, h2, h3, h4, h5, h6')
# Ignore headings that declare themselves as exempt from the TOC
if not heading.classList.contains 'toc-exempt'
# For extra unique names.
# heading.id = "#{k$.slugify heading.innerHTML}-#{_k}"
heading.id = k$.slugify heading.innerHTML
# If this is a lower level.
$thisHeadingLevel = parseInt(heading.tagName.substr(1, 2))
if $thisHeadingLevel > $headingLevel
# Append a new submenu and make that the targetNode.
$newSubmenu = document.createElement 'ul'
$targetNode.children[$targetNode.children.length - 1].appendChild $newSubmenu
$targetNode = $newSubmenu
$headingLevel = $thisHeadingLevel
# If this is a higher level
if $thisHeadingLevel < $headingLevel
$stepsUp = $headingLevel - $thisHeadingLevel
while $stepsUp > -1
$targetNode = $targetNode.parentNode
$stepsUp--
$headingLevel = $thisHeadingLevel
# Make a new li and append it to the target ul node.
$menuItem = $link.cloneNode true
$menuItem.querySelector('a').href = "##{heading.id}"
$menuItem.querySelector('a').innerHTML = heading.innerHTML
$targetNode.appendChild $menuItem
k$.$('#toc').appendChild $toc