sharkey-web 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +24 -0
- data/Gemfile +4 -0
- data/LICENSE.md +19 -0
- data/README.md +188 -0
- data/Rakefile +8 -0
- data/bin/sharkey-web +9 -0
- data/config.ru +3 -0
- data/lib/sharkey.rb +12 -0
- data/lib/sharkey/app.rb +526 -0
- data/lib/sharkey/importerexporter.rb +79 -0
- data/lib/sharkey/models.rb +295 -0
- data/lib/sharkey/public/css/loading.gif +0 -0
- data/lib/sharkey/public/css/magicsuggest.css +232 -0
- data/lib/sharkey/public/css/nprogress.css +74 -0
- data/lib/sharkey/public/css/styles.css +263 -0
- data/lib/sharkey/public/css/ui.fancytree.css +545 -0
- data/lib/sharkey/public/data/sentences.txt +5 -0
- data/lib/sharkey/public/fonts/Quadrata.eot +0 -0
- data/lib/sharkey/public/fonts/Quadrata.svg +613 -0
- data/lib/sharkey/public/fonts/Quadrata.ttf +0 -0
- data/lib/sharkey/public/fonts/Quadrata.woff +0 -0
- data/lib/sharkey/public/fonts/Quadrata.zip +0 -0
- data/lib/sharkey/public/images/loader.gif +0 -0
- data/lib/sharkey/public/images/sharkey-logo.png +0 -0
- data/lib/sharkey/public/images/sharkey.png +0 -0
- data/lib/sharkey/public/js/ajaxmanager.js +67 -0
- data/lib/sharkey/public/js/keybindings.js +92 -0
- data/lib/sharkey/public/js/lib/bootstrap.min.js +6 -0
- data/lib/sharkey/public/js/lib/jquery-1.9.1.min.js +5 -0
- data/lib/sharkey/public/js/lib/jquery-ui.js +16150 -0
- data/lib/sharkey/public/js/lib/jquery.bootstrap-autohidingnavbar.js +213 -0
- data/lib/sharkey/public/js/lib/jquery.fancytree-all.js +6424 -0
- data/lib/sharkey/public/js/lib/jquery.tagcloud.js +92 -0
- data/lib/sharkey/public/js/lib/magicsuggest.js +1468 -0
- data/lib/sharkey/public/js/lib/mousetrap.min.js +9 -0
- data/lib/sharkey/public/js/lib/nprogress.js +476 -0
- data/lib/sharkey/public/js/page-add-link-autofill.js +102 -0
- data/lib/sharkey/public/js/page-add-link.js +156 -0
- data/lib/sharkey/public/js/page-categories.js +348 -0
- data/lib/sharkey/public/js/page-edit-link.js +103 -0
- data/lib/sharkey/public/js/page-links.js +54 -0
- data/lib/sharkey/public/js/page-settings.js +93 -0
- data/lib/sharkey/public/js/page-tagcloud.js +35 -0
- data/lib/sharkey/public/js/page-tags.js +287 -0
- data/lib/sharkey/public/js/scripts.js +147 -0
- data/lib/sharkey/public/themes/amelia/style.css +7 -0
- data/lib/sharkey/public/themes/bootstrap/style.css +5785 -0
- data/lib/sharkey/public/themes/cerulean/style.css +7 -0
- data/lib/sharkey/public/themes/cosmo/style.css +7 -0
- data/lib/sharkey/public/themes/cyborg/style.css +7 -0
- data/lib/sharkey/public/themes/darkly/style.css +7 -0
- data/lib/sharkey/public/themes/facebook-like/README.md +6 -0
- data/lib/sharkey/public/themes/facebook-like/style.css +6085 -0
- data/lib/sharkey/public/themes/flatly/style.css +7 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.svg +229 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/sharkey/public/themes/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/sharkey/public/themes/holo-like/README.md +5 -0
- data/lib/sharkey/public/themes/holo-like/style.css +5997 -0
- data/lib/sharkey/public/themes/journal/style.css +7 -0
- data/lib/sharkey/public/themes/lumen/style.css +7 -0
- data/lib/sharkey/public/themes/readable/style.css +7 -0
- data/lib/sharkey/public/themes/simplex/style.css +7 -0
- data/lib/sharkey/public/themes/slate/style.css +7 -0
- data/lib/sharkey/public/themes/spacelab/style.css +7 -0
- data/lib/sharkey/public/themes/superhero/style.css +7 -0
- data/lib/sharkey/public/themes/united/style.css +7 -0
- data/lib/sharkey/public/themes/yeti/style.css +7 -0
- data/lib/sharkey/setting.rb +74 -0
- data/lib/sharkey/version.rb +5 -0
- data/lib/sharkey/views/404.slim +4 -0
- data/lib/sharkey/views/about.slim +7 -0
- data/lib/sharkey/views/add_link.slim +157 -0
- data/lib/sharkey/views/categories.slim +101 -0
- data/lib/sharkey/views/category.slim +22 -0
- data/lib/sharkey/views/centered.slim +49 -0
- data/lib/sharkey/views/dashboard.slim +107 -0
- data/lib/sharkey/views/dashboard_index.slim +26 -0
- data/lib/sharkey/views/edit_link.slim +121 -0
- data/lib/sharkey/views/help.slim +74 -0
- data/lib/sharkey/views/keybindings.slim +58 -0
- data/lib/sharkey/views/link.slim +30 -0
- data/lib/sharkey/views/links.slim +22 -0
- data/lib/sharkey/views/navbar.slim +68 -0
- data/lib/sharkey/views/settings.slim +74 -0
- data/lib/sharkey/views/settings_index.slim +220 -0
- data/lib/sharkey/views/single_category.slim +37 -0
- data/lib/sharkey/views/single_link.slim +95 -0
- data/lib/sharkey/views/single_tag.slim +33 -0
- data/lib/sharkey/views/tag.slim +22 -0
- data/lib/sharkey/views/tagcloud.slim +54 -0
- data/lib/sharkey/views/tags.slim +99 -0
- data/sharkey-web.gemspec +44 -0
- metadata +324 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
/ Layout for simple, centered information
|
2
|
+
doctype html
|
3
|
+
html
|
4
|
+
head
|
5
|
+
meta charset="utf-8"
|
6
|
+
title Sharkey
|
7
|
+
|
8
|
+
/ Bootstrap
|
9
|
+
(Poor Man's Theme Support)
|
10
|
+
link[
|
11
|
+
rel="stylesheet" media="screen, projection"
|
12
|
+
href="/themes/#{Sharkey::Setting['theme']}/style.css"
|
13
|
+
]
|
14
|
+
|
15
|
+
/ Misc. Styles
|
16
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
17
|
+
link rel="stylesheet" href="/css/nprogress.css"
|
18
|
+
|
19
|
+
link rel="stylesheet" href="/css/magicsuggest.css"
|
20
|
+
|
21
|
+
/ Custom Styles
|
22
|
+
link rel="stylesheet" media="screen, projection" href="/css/styles.css"
|
23
|
+
|
24
|
+
/[if lt IE 9]
|
25
|
+
script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"
|
26
|
+
|
27
|
+
/ jQuery
|
28
|
+
script src="/js/lib/jquery-1.9.1.min.js"
|
29
|
+
script src="/js/lib/jquery-ui.js"
|
30
|
+
|
31
|
+
/ Bootstrap
|
32
|
+
script src="/js/lib/bootstrap.min.js"
|
33
|
+
|
34
|
+
/ Misc. Scripts
|
35
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
36
|
+
script src="/js/lib/nprogress.js"
|
37
|
+
|
38
|
+
/ Custom Scripts
|
39
|
+
script src="/js/scripts.js"
|
40
|
+
|
41
|
+
body
|
42
|
+
== slim(:navbar, locals: { page: page })
|
43
|
+
|
44
|
+
.container-fluid
|
45
|
+
.row
|
46
|
+
/ The actual content
|
47
|
+
.col-md-8.col-sm-offset-2.main
|
48
|
+
== yield
|
49
|
+
|
@@ -0,0 +1,107 @@
|
|
1
|
+
/
|
2
|
+
Layout for the main dashboard
|
3
|
+
|
4
|
+
doctype html
|
5
|
+
html
|
6
|
+
head
|
7
|
+
meta charset="utf-8"
|
8
|
+
|
9
|
+
/!
|
10
|
+
.
|
11
|
+
mmm mmm m mm m m mmmmm mmm m mm
|
12
|
+
# ' ' # #' ' # # # # # ' # #' #
|
13
|
+
'''m m'''# # # # # # # m'''# # #
|
14
|
+
'mmm' 'mm'# # 'mm'# # # # 'mm'# # #
|
15
|
+
sharkey link: the best thing since Delicious
|
16
|
+
.
|
17
|
+
|
18
|
+
title Sharkey
|
19
|
+
|
20
|
+
/ Bootstrap
|
21
|
+
(Poor Man's Theme Support)
|
22
|
+
link[
|
23
|
+
rel="stylesheet" media="screen, projection"
|
24
|
+
href="/themes/#{Sharkey::Setting['theme']}/style.css"
|
25
|
+
]
|
26
|
+
|
27
|
+
/ Misc. Styles
|
28
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
29
|
+
link rel="stylesheet" href="/css/nprogress.css"
|
30
|
+
|
31
|
+
link rel="stylesheet" href="/css/magicsuggest.css"
|
32
|
+
link rel="stylesheet" href="/css/ui.fancytree.css"
|
33
|
+
|
34
|
+
/ Custom Styles
|
35
|
+
link rel="stylesheet" media="screen, projection" href="/css/styles.css"
|
36
|
+
|
37
|
+
/[if lt IE 9]
|
38
|
+
script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"
|
39
|
+
|
40
|
+
/ jQuery
|
41
|
+
script src="/js/lib/jquery-1.9.1.min.js"
|
42
|
+
script src="/js/lib/jquery-ui.js"
|
43
|
+
|
44
|
+
/ Bootstrap
|
45
|
+
script src="/js/lib/bootstrap.min.js"
|
46
|
+
|
47
|
+
/ Misc. Scripts
|
48
|
+
- if Sharkey::Setting['loading_bar'] == 'true'
|
49
|
+
script src="/js/lib/nprogress.js"
|
50
|
+
|
51
|
+
/ Custom Scripts
|
52
|
+
script src="/js/scripts.js"
|
53
|
+
|
54
|
+
body
|
55
|
+
== slim(:navbar, locals: { page: page })
|
56
|
+
|
57
|
+
.container-fluid
|
58
|
+
.row
|
59
|
+
|
60
|
+
/ The sidebar
|
61
|
+
.col-sm-3.col-md-2.sidebar#the-sidebar
|
62
|
+
ul.nav.nav-sidebar
|
63
|
+
li class="#{ if page == 'home' then 'active' end }"
|
64
|
+
a href="/"
|
65
|
+
span> class="glyphicon glyphicon-tasks"
|
66
|
+
| Dashboard
|
67
|
+
|
68
|
+
ul.nav.nav-sidebar
|
69
|
+
li class="#{ if page == 'links' then 'active' end }"
|
70
|
+
a#keybind-links href="/links"
|
71
|
+
span> class="glyphicon glyphicon-link"
|
72
|
+
| Links
|
73
|
+
span.badge.pull-right = Sharkey::Link.all.size
|
74
|
+
li class="#{ if page == 'favorites' then 'active' end }"
|
75
|
+
a#keybind-favorites href="/favorites"
|
76
|
+
span> class="glyphicon glyphicon-star"
|
77
|
+
| Favorites
|
78
|
+
span.badge.pull-right = Sharkey::Link.all(favorite: true).size
|
79
|
+
|
80
|
+
li
|
81
|
+
a href="/random"
|
82
|
+
span> class="glyphicon glyphicon-random"
|
83
|
+
| Random Link
|
84
|
+
|
85
|
+
ul.nav.nav-sidebar
|
86
|
+
li class="#{ if page == 'tags' then 'active' end }"
|
87
|
+
a#keybind-tags href="/tags"
|
88
|
+
span> class="glyphicon glyphicon-tags"
|
89
|
+
| Tags
|
90
|
+
span.badge.pull-right = Sharkey::Tag.all.size
|
91
|
+
|
92
|
+
li class="#{ if page == 'tagcloud' then 'active' end }"
|
93
|
+
a#keybind-tags href="/tagcloud"
|
94
|
+
span> class="glyphicon glyphicon-cloud"
|
95
|
+
| Tag Cloud
|
96
|
+
|
97
|
+
ul.nav.nav-sidebar
|
98
|
+
li class="#{ if page == 'categories' then 'active' end }"
|
99
|
+
a#keybind-categories href="/categories"
|
100
|
+
span> class="glyphicon glyphicon-book"
|
101
|
+
| Categories
|
102
|
+
span.badge.pull-right = Sharkey::Category.all.size
|
103
|
+
|
104
|
+
/ The actual content
|
105
|
+
.col-sm-9.col-sm-offset-3.col-md-10.col-md-offset-2.main
|
106
|
+
== yield
|
107
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/
|
2
|
+
The main Page
|
3
|
+
|
4
|
+
h1.page-header Dashboard
|
5
|
+
|
6
|
+
p Welcome to Sharkey Link!
|
7
|
+
|
8
|
+
p You have...
|
9
|
+
|
10
|
+
ul
|
11
|
+
- if Sharkey::Link.all.size == 0
|
12
|
+
li no links;
|
13
|
+
- else
|
14
|
+
li #{Sharkey::Link.all.size} links;
|
15
|
+
|
16
|
+
- if Sharkey::Tag.all.size == 0
|
17
|
+
li no tags;
|
18
|
+
- else
|
19
|
+
li #{Sharkey::Tag.all.size} tags;
|
20
|
+
|
21
|
+
h2.sub-header Awesome!
|
22
|
+
|
23
|
+
p Sweet, beibeh!
|
24
|
+
|
25
|
+
p [insert awesome statistics here]
|
26
|
+
|
@@ -0,0 +1,121 @@
|
|
1
|
+
/ The 'Edit Button' dialog
|
2
|
+
It will only get shown when requested by a button
|
3
|
+
Expects a local variable `link` with a.. link.
|
4
|
+
|
5
|
+
.modal.fade.input-link#edit-link tabindex="-1" role="dialog" aria-labelledby="input-link-label" aria-hidden="true"
|
6
|
+
.modal-dialog
|
7
|
+
.modal-content
|
8
|
+
.modal-header
|
9
|
+
button.close type="button" data-dismiss="modal" aria-hidden="true"
|
10
|
+
| ×
|
11
|
+
|
12
|
+
h4.modal-title.input-link-label
|
13
|
+
| Edit link
|
14
|
+
|
15
|
+
p.random-sentence
|
16
|
+
| ...#{random_sentence}
|
17
|
+
|
18
|
+
.modal-body
|
19
|
+
/ Form that creates a Link
|
20
|
+
It's 'action' will get changed by the JavaScript
|
21
|
+
to conform to the API like '/update/link/:id'
|
22
|
+
form.form-horizontal role="form" action="/update/link" method="POST"
|
23
|
+
|
24
|
+
.form-group
|
25
|
+
label.col-sm-2.control-label for="input-link-url"
|
26
|
+
| URL
|
27
|
+
.col-sm-10
|
28
|
+
input.form-control type="text" id="input-link-url" name="url" placeholder="URL" required="true" autofocus="true"
|
29
|
+
|
30
|
+
.form-group
|
31
|
+
.col-sm-offset-2.col-sm-10
|
32
|
+
button.btn.btn-primary type="submit"
|
33
|
+
span.glyphicon.glyphicon-flash
|
34
|
+
'
|
35
|
+
| Edit link
|
36
|
+
|
37
|
+
.form-group
|
38
|
+
label.col-sm-2.control-label for="input-link-title"
|
39
|
+
| Title
|
40
|
+
.col-sm-10
|
41
|
+
input.form-control type="text" id="input-link-title" name="title" placeholder="title"
|
42
|
+
|
43
|
+
.form-group
|
44
|
+
label.col-sm-2.control-label for="input-link-tags"
|
45
|
+
| Tags
|
46
|
+
.col-sm-10
|
47
|
+
input.form-control.tagsinput type="text" id="input-link-tags" name="tags" placeholder="tag (comma-separated)"
|
48
|
+
|
49
|
+
.form-group
|
50
|
+
label.col-sm-2.control-label for="input-links-url"
|
51
|
+
| Comments
|
52
|
+
.col-sm-10
|
53
|
+
textarea.form-control[
|
54
|
+
type="textarea"
|
55
|
+
id="input-link-comment"
|
56
|
+
name="comment"
|
57
|
+
placeholder="express yourself"
|
58
|
+
]
|
59
|
+
|
60
|
+
.form-group
|
61
|
+
label.col-sm-2.control-label for="input-link-category-one"
|
62
|
+
| Category
|
63
|
+
.col-sm-10
|
64
|
+
select.form-control id="input-link-category-one" name="category" placeholder="Category"
|
65
|
+
ruby:
|
66
|
+
# This magic function shows all Categories in
|
67
|
+
# hierarchical order. Just like:
|
68
|
+
#
|
69
|
+
# parent
|
70
|
+
# - child
|
71
|
+
# - other_child
|
72
|
+
# - - other_other_child
|
73
|
+
# other_parent
|
74
|
+
# - another_child
|
75
|
+
|
76
|
+
def select_options
|
77
|
+
$output = "<option value=''>(none)</option>"
|
78
|
+
|
79
|
+
def recursive_childs(count, category)
|
80
|
+
$output << "<option value='#{category.id}'>#{'- ' * count}#{category.name}</option>"
|
81
|
+
|
82
|
+
category.childs.each do |child|
|
83
|
+
recursive_childs(count + 1, child)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
Sharkey::Category.orphans.each do |orphan|
|
88
|
+
recursive_childs(0, orphan)
|
89
|
+
end
|
90
|
+
return $output
|
91
|
+
end
|
92
|
+
|
93
|
+
== select_options
|
94
|
+
|
95
|
+
.col-sm-offset-2.col-sm-10
|
96
|
+
button.btn.btn-default.new-category
|
97
|
+
span> class="glyphicon glyphicon-book"
|
98
|
+
| New Category
|
99
|
+
|
100
|
+
form.form-horizontal.new-category-form role="form" action="/category" method="POST"
|
101
|
+
.form-group
|
102
|
+
|
103
|
+
label.col-sm-2.control-label for="new-category-name"
|
104
|
+
| Name
|
105
|
+
.col-sm-10
|
106
|
+
input.form-control.new-category-name type="text" name="name" placeholder="New category name" required="true" autofocus="true"
|
107
|
+
|
108
|
+
label.col-sm-2.control-label for="new-category-parent"
|
109
|
+
| Parent
|
110
|
+
.col-sm-10
|
111
|
+
select.form-control.new-category-parent name="parent" placeholder="Parent"
|
112
|
+
== select_options
|
113
|
+
|
114
|
+
button.btn.btn-default.new-category-button type="submit"
|
115
|
+
span> class="glyphicon glyphicon-book"
|
116
|
+
| Create Category
|
117
|
+
|
118
|
+
/ If you ever want to add a footer some day,
|
119
|
+
just uncomment these two lines
|
120
|
+
.modal-footer
|
121
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
h1.page-header
|
2
|
+
| Help
|
3
|
+
|
4
|
+
markdown:
|
5
|
+
Welcome to `sharkey` help!
|
6
|
+
For info on it's creation and contact, see the _About_ section.
|
7
|
+
|
8
|
+
h2.sub-header
|
9
|
+
| Intro
|
10
|
+
|
11
|
+
markdown:
|
12
|
+
`sharkey` is a cute web-based personal bookmarking service.
|
13
|
+
|
14
|
+
* **Bookmarking** means it _saves your links_, allows you to _tag them_, arrange
|
15
|
+
in _categories_ and, most important of all, _keep track of what you should visit later_.
|
16
|
+
* **Personal** means _you control your own data_. Everything is stored on your
|
17
|
+
computer and _you can import/export/delete as you please_. It is like the anti-social
|
18
|
+
cousin of [Delicious][delicious].
|
19
|
+
* **Web-based** means it runs on your browser. _You don't need an internet connection_,
|
20
|
+
though! It doesn't mean you access a site to use it - it runs on _your computer_.
|
21
|
+
It just happens that I prefer to make sites instead of designing windows and buttons
|
22
|
+
and stuff.
|
23
|
+
* **Cute** means it has a nice appearance. It comes with _lots of themes_ and you can
|
24
|
+
even customize it _with your own themes_ too.
|
25
|
+
|
26
|
+
h2.sub-header
|
27
|
+
| Example
|
28
|
+
|
29
|
+
markdown:
|
30
|
+
If you're unsure on how to start using `sharkey`, here's how I do it.
|
31
|
+
|
32
|
+
I have lots of tabs opened in my browser. Some of them has sites I want to see later,
|
33
|
+
others are just there because... well, I might need them some day.
|
34
|
+
|
35
|
+
So I start organizing them. I create some tags and categories, placing links
|
36
|
+
more or less like the following:
|
37
|
+
|
38
|
+
table.table.table-hover
|
39
|
+
thead
|
40
|
+
tr
|
41
|
+
th site
|
42
|
+
th category
|
43
|
+
th tags
|
44
|
+
tbody
|
45
|
+
tr
|
46
|
+
td a youtube video I can't see right now
|
47
|
+
td Video > Youtube
|
48
|
+
td watch-later
|
49
|
+
tr
|
50
|
+
td funny images I might link to some friends later
|
51
|
+
td Images > Funny
|
52
|
+
td link-later
|
53
|
+
tr
|
54
|
+
td news site I visit regularly
|
55
|
+
td News
|
56
|
+
td daily
|
57
|
+
tr
|
58
|
+
td page with important download link
|
59
|
+
td Download > Image/Video/Document
|
60
|
+
td download-later, important
|
61
|
+
tr
|
62
|
+
td great online game I recently discovered (and might link to friends later)
|
63
|
+
td Game > Online
|
64
|
+
td game-later, link-later
|
65
|
+
|
66
|
+
markdown:
|
67
|
+
So, in general, _tags are for quick finding things_ and _categories are
|
68
|
+
for organized classifying_.
|
69
|
+
|
70
|
+
Since `sharkey` has a [Tag Cloud](/tagcloud), it becomes easy to find, say,
|
71
|
+
sites I need to visit daily or important things I must see later.
|
72
|
+
|
73
|
+
And on the [Categories Page](/categories), they're listed like folders on the computer,
|
74
|
+
just how Firefox or Chrome displays it's bookmarks.
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
/ Helper that shows the Keybindings
|
3
|
+
.modal.fade#keybindings tabindex="-1" role="dialog" aria-labelledby="keybinding-label" aria-hidden="true"
|
4
|
+
.modal-dialog
|
5
|
+
.modal-content
|
6
|
+
.modal-header
|
7
|
+
button.close type="button" data-dismiss="modal" aria-hidden="true"
|
8
|
+
| ×
|
9
|
+
h3.modal-title#input-link-label
|
10
|
+
| Key Bindings
|
11
|
+
|
12
|
+
.modal-body
|
13
|
+
|
14
|
+
table.table.table-striped.table-hover
|
15
|
+
thead
|
16
|
+
tr
|
17
|
+
th key
|
18
|
+
th action
|
19
|
+
tbody
|
20
|
+
tr
|
21
|
+
td
|
22
|
+
kbd a
|
23
|
+
td Add single Link
|
24
|
+
tr
|
25
|
+
td
|
26
|
+
kbd m
|
27
|
+
td Add multiple Links
|
28
|
+
tr
|
29
|
+
td
|
30
|
+
kbd d
|
31
|
+
td Go to the Dashboard
|
32
|
+
tr
|
33
|
+
td
|
34
|
+
kbd s
|
35
|
+
td Go to Settings
|
36
|
+
tr
|
37
|
+
td
|
38
|
+
kbd h
|
39
|
+
td Show Help
|
40
|
+
tr
|
41
|
+
td
|
42
|
+
kbd l
|
43
|
+
td Show Links
|
44
|
+
tr
|
45
|
+
td
|
46
|
+
kbd t
|
47
|
+
td Show Tags
|
48
|
+
tr
|
49
|
+
td
|
50
|
+
kbd c
|
51
|
+
td Show Categories
|
52
|
+
tr
|
53
|
+
td
|
54
|
+
kbd k
|
55
|
+
td Show this window
|
56
|
+
|
57
|
+
|
58
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/
|
2
|
+
Layout for a page of a single Link
|
3
|
+
|
4
|
+
== slim(:navbar, locals: { page: "link" })
|
5
|
+
|
6
|
+
.col-md.12
|
7
|
+
.container
|
8
|
+
|
9
|
+
- if link.title
|
10
|
+
h1 Title: #{link.title}
|
11
|
+
h2
|
12
|
+
a href="#{link.url}" target="_blank"
|
13
|
+
| URL: #{link.url}
|
14
|
+
|
15
|
+
- else
|
16
|
+
h1
|
17
|
+
a href="#{link.url}" target="_blank"
|
18
|
+
| Title: #{link.url}
|
19
|
+
|
20
|
+
- if link.tags.empty?
|
21
|
+
p
|
22
|
+
em No Tags
|
23
|
+
|
24
|
+
- else
|
25
|
+
p Tags:
|
26
|
+
|
27
|
+
- link.tags.each do |tag|
|
28
|
+
a.link-tag href="/tag/#{tag.id}" title="#{tag.name}"
|
29
|
+
span.badge = tag.name
|
30
|
+
|