jekyll-rp_logs 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.gitmodules +3 -0
- data/.themes/default/source/_config.yml.default +51 -0
- data/.themes/default/source/_includes/footer.html +23 -0
- data/.themes/default/source/_includes/head.html +13 -0
- data/.themes/default/source/_includes/header.html +27 -0
- data/.themes/default/source/_includes/rp.html +19 -0
- data/.themes/default/source/_layouts/default.html +20 -0
- data/.themes/default/source/_layouts/page.html +14 -0
- data/.themes/default/source/_layouts/post.html +15 -0
- data/.themes/default/source/_layouts/rp.html +32 -0
- data/.themes/default/source/_layouts/tag_index.html +9 -0
- data/.themes/default/source/_sass/_base.scss +204 -0
- data/.themes/default/source/_sass/_layout.scss +236 -0
- data/.themes/default/source/_sass/_rp.scss +142 -0
- data/.themes/default/source/_sass/_syntax-highlighting.scss +67 -0
- data/.themes/default/source/arcs.html +22 -0
- data/.themes/default/source/css/main.scss +64 -0
- data/.themes/default/source/index.html +23 -0
- data/.themes/default/source/js/toggle_ooc.js +93 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +92 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/jekyll-rp_logs.gemspec +30 -0
- data/lib/jekyll/rp_logs/parse_irssi_xchat.rb +47 -0
- data/lib/jekyll/rp_logs/parse_weechat.rb +46 -0
- data/lib/jekyll/rp_logs/rp_arcs.rb +69 -0
- data/lib/jekyll/rp_logs/rp_log_converter.rb +202 -0
- data/lib/jekyll/rp_logs/rp_parser.rb +114 -0
- data/lib/jekyll/rp_logs/rp_tag_index.rb +56 -0
- data/lib/jekyll/rp_logs/rp_tags.rb +107 -0
- data/lib/jekyll/rp_logs/rp_tasks.rb +57 -0
- data/lib/jekyll/rp_logs/version.rb +5 -0
- data/lib/jekyll/rp_logs.rb +18 -0
- metadata +123 -0
@@ -0,0 +1,142 @@
|
|
1
|
+
@mixin transition($transition-property, $transition-time, $method) {
|
2
|
+
-webkit-transition: $transition-property $transition-time $method;
|
3
|
+
-moz-transition: $transition-property $transition-time $method;
|
4
|
+
-ms-transition: $transition-property $transition-time $method;
|
5
|
+
-o-transition: $transition-property $transition-time $method;
|
6
|
+
transition: $transition-property $transition-time $method;
|
7
|
+
}
|
8
|
+
|
9
|
+
// Temporary fix until baseline is back to normal
|
10
|
+
li {
|
11
|
+
list-style: none;
|
12
|
+
}
|
13
|
+
|
14
|
+
.rp-list li {
|
15
|
+
margin-bottom: 15px;
|
16
|
+
}
|
17
|
+
|
18
|
+
.rp-entry-container {
|
19
|
+
align-items: baseline;
|
20
|
+
display: flex;
|
21
|
+
flex-wrap: wrap;
|
22
|
+
margin-bottom: .2em;
|
23
|
+
width: 100%;
|
24
|
+
}
|
25
|
+
|
26
|
+
.rp-entry {
|
27
|
+
flex: 1 1 auto;
|
28
|
+
max-width: 450px;
|
29
|
+
}
|
30
|
+
|
31
|
+
.rp-title {
|
32
|
+
margin-bottom: 0px;
|
33
|
+
}
|
34
|
+
|
35
|
+
.rp-metadata-container {
|
36
|
+
// Basis so that content wraps afterwards
|
37
|
+
flex: 1 0 auto;
|
38
|
+
text-align: right;
|
39
|
+
|
40
|
+
.rp-completion {
|
41
|
+
font-size: 1.125em;
|
42
|
+
text-align: center;
|
43
|
+
width: 1.5em;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
.rp-complete { color: $light-green; }
|
48
|
+
.rp-incomplete { color: $light-red; }
|
49
|
+
|
50
|
+
// Styling for when the screen is too small
|
51
|
+
// @include media-query($on-palm) {
|
52
|
+
// .rp-entry {
|
53
|
+
// flex-basis: $on-palm;
|
54
|
+
// }
|
55
|
+
// }
|
56
|
+
|
57
|
+
/* Undo normal pre styles */
|
58
|
+
#log {
|
59
|
+
|
60
|
+
p {
|
61
|
+
margin: 0;
|
62
|
+
margin-top: 0.5em;
|
63
|
+
}
|
64
|
+
|
65
|
+
.rp { color: #DCDCCC; }
|
66
|
+
.ooc {
|
67
|
+
color: #A0A090;
|
68
|
+
white-space: pre-wrap;
|
69
|
+
font-family: monospace;
|
70
|
+
font-size: 80%;
|
71
|
+
}
|
72
|
+
|
73
|
+
/* timestamps */
|
74
|
+
a {
|
75
|
+
color: inherit;
|
76
|
+
|
77
|
+
&:hover {
|
78
|
+
text-decoration: underline;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
/* OOC toggling menu */
|
84
|
+
.scroll-nav {
|
85
|
+
background: #222;
|
86
|
+
display: block;
|
87
|
+
@include transition(all, 0.25s, ease-in-out);
|
88
|
+
left: 0;
|
89
|
+
right: 0;
|
90
|
+
top: -2.5em;
|
91
|
+
line-height: 2.5em;
|
92
|
+
position: fixed;
|
93
|
+
text-align: center;
|
94
|
+
|
95
|
+
&.shown {
|
96
|
+
top: 0;
|
97
|
+
}
|
98
|
+
|
99
|
+
a,
|
100
|
+
#ooc_label {
|
101
|
+
padding: 0.5em;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
#ooc_toggle {
|
106
|
+
vertical-align: middle;
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
a.rp-tag {
|
111
|
+
background-color: #333;
|
112
|
+
// border: 1px solid $text-color;
|
113
|
+
box-shadow: 0 0 2px 0px darken($text-color, 25%);
|
114
|
+
color: inherit;
|
115
|
+
display: inline-block;
|
116
|
+
margin-bottom: 0.25em;
|
117
|
+
padding: 0 0.25em;
|
118
|
+
white-space: nowrap;
|
119
|
+
|
120
|
+
&.rp-tag-character {
|
121
|
+
background-color: $dark-green;
|
122
|
+
// border: 1px solid $light-green;
|
123
|
+
box-shadow: 0 0 2px 0px darken($light-green, 25%);
|
124
|
+
color: $light-green;
|
125
|
+
}
|
126
|
+
|
127
|
+
&.rp-tag-meta {
|
128
|
+
background-color: $dark-red;
|
129
|
+
// border: 1px solid $light-red;
|
130
|
+
box-shadow: 0 0 2px 0px darken($light-red, 25%);
|
131
|
+
color: $light-red;
|
132
|
+
}
|
133
|
+
|
134
|
+
&:hover {
|
135
|
+
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
// Undo a styling for RP and arc titles
|
140
|
+
.arc-title>a {
|
141
|
+
color: inherit;
|
142
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
/**
|
2
|
+
* Syntax highlighting styles
|
3
|
+
*/
|
4
|
+
.highlight {
|
5
|
+
background: #fff;
|
6
|
+
@extend %vertical-rhythm;
|
7
|
+
|
8
|
+
.c { color: #998; font-style: italic } // Comment
|
9
|
+
.err { color: #a61717; background-color: #e3d2d2 } // Error
|
10
|
+
.k { font-weight: bold } // Keyword
|
11
|
+
.o { font-weight: bold } // Operator
|
12
|
+
.cm { color: #998; font-style: italic } // Comment.Multiline
|
13
|
+
.cp { color: #999; font-weight: bold } // Comment.Preproc
|
14
|
+
.c1 { color: #998; font-style: italic } // Comment.Single
|
15
|
+
.cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special
|
16
|
+
.gd { color: #000; background-color: #fdd } // Generic.Deleted
|
17
|
+
.gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific
|
18
|
+
.ge { font-style: italic } // Generic.Emph
|
19
|
+
.gr { color: #a00 } // Generic.Error
|
20
|
+
.gh { color: #999 } // Generic.Heading
|
21
|
+
.gi { color: #000; background-color: #dfd } // Generic.Inserted
|
22
|
+
.gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific
|
23
|
+
.go { color: #888 } // Generic.Output
|
24
|
+
.gp { color: #555 } // Generic.Prompt
|
25
|
+
.gs { font-weight: bold } // Generic.Strong
|
26
|
+
.gu { color: #aaa } // Generic.Subheading
|
27
|
+
.gt { color: #a00 } // Generic.Traceback
|
28
|
+
.kc { font-weight: bold } // Keyword.Constant
|
29
|
+
.kd { font-weight: bold } // Keyword.Declaration
|
30
|
+
.kp { font-weight: bold } // Keyword.Pseudo
|
31
|
+
.kr { font-weight: bold } // Keyword.Reserved
|
32
|
+
.kt { color: #458; font-weight: bold } // Keyword.Type
|
33
|
+
.m { color: #099 } // Literal.Number
|
34
|
+
.s { color: #d14 } // Literal.String
|
35
|
+
.na { color: #008080 } // Name.Attribute
|
36
|
+
.nb { color: #0086B3 } // Name.Builtin
|
37
|
+
.nc { color: #458; font-weight: bold } // Name.Class
|
38
|
+
.no { color: #008080 } // Name.Constant
|
39
|
+
.ni { color: #800080 } // Name.Entity
|
40
|
+
.ne { color: #900; font-weight: bold } // Name.Exception
|
41
|
+
.nf { color: #900; font-weight: bold } // Name.Function
|
42
|
+
.nn { color: #555 } // Name.Namespace
|
43
|
+
.nt { color: #000080 } // Name.Tag
|
44
|
+
.nv { color: #008080 } // Name.Variable
|
45
|
+
.ow { font-weight: bold } // Operator.Word
|
46
|
+
.w { color: #bbb } // Text.Whitespace
|
47
|
+
.mf { color: #099 } // Literal.Number.Float
|
48
|
+
.mh { color: #099 } // Literal.Number.Hex
|
49
|
+
.mi { color: #099 } // Literal.Number.Integer
|
50
|
+
.mo { color: #099 } // Literal.Number.Oct
|
51
|
+
.sb { color: #d14 } // Literal.String.Backtick
|
52
|
+
.sc { color: #d14 } // Literal.String.Char
|
53
|
+
.sd { color: #d14 } // Literal.String.Doc
|
54
|
+
.s2 { color: #d14 } // Literal.String.Double
|
55
|
+
.se { color: #d14 } // Literal.String.Escape
|
56
|
+
.sh { color: #d14 } // Literal.String.Heredoc
|
57
|
+
.si { color: #d14 } // Literal.String.Interpol
|
58
|
+
.sx { color: #d14 } // Literal.String.Other
|
59
|
+
.sr { color: #009926 } // Literal.String.Regex
|
60
|
+
.s1 { color: #d14 } // Literal.String.Single
|
61
|
+
.ss { color: #990073 } // Literal.String.Symbol
|
62
|
+
.bp { color: #999 } // Name.Builtin.Pseudo
|
63
|
+
.vc { color: #008080 } // Name.Variable.Class
|
64
|
+
.vg { color: #008080 } // Name.Variable.Global
|
65
|
+
.vi { color: #008080 } // Name.Variable.Instance
|
66
|
+
.il { color: #099 } // Literal.Number.Integer.Long
|
67
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
title: Arc Index
|
4
|
+
rp_arcs: true
|
5
|
+
---
|
6
|
+
|
7
|
+
<ul class="rp-list">
|
8
|
+
{% for x in page['rps'] %}
|
9
|
+
{% assign type = x[0] %}
|
10
|
+
{% assign rp = x[1] %}
|
11
|
+
{% if type == 'arc' %}
|
12
|
+
<h3 class="arc-title"><a name="{{ rp.name | slugify }}" href="#{{ rp.name | slugify }}">{{ rp.name }}</a></h3>
|
13
|
+
<ul class="arc-rp-list">
|
14
|
+
{% for arc_rp in rp.rps %}
|
15
|
+
{% include rp.html rp=arc_rp %}
|
16
|
+
{% endfor %}
|
17
|
+
</ul>
|
18
|
+
{% else %}
|
19
|
+
{% include rp.html rp=rp %}
|
20
|
+
{% endif %}
|
21
|
+
{% endfor %}
|
22
|
+
</ul>
|
@@ -0,0 +1,64 @@
|
|
1
|
+
---
|
2
|
+
# Only the main Sass file needs front matter (the dashes are enough)
|
3
|
+
layout: nil
|
4
|
+
---
|
5
|
+
@charset "utf-8";
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
// Our variables
|
10
|
+
$base-font-family: Helvetica, Arial, sans-serif;
|
11
|
+
$base-font-size: 16px;
|
12
|
+
$small-font-size: $base-font-size * 0.875;
|
13
|
+
$base-line-height: 1.5;
|
14
|
+
|
15
|
+
$spacing-unit: 30px;
|
16
|
+
|
17
|
+
$text-color: #dcdccc;
|
18
|
+
$background-color: #3f3f3f;
|
19
|
+
$header-color: #303030;
|
20
|
+
$brand-color: #8cd0d3;
|
21
|
+
|
22
|
+
$light-green: #80d4aa;
|
23
|
+
$dark-green: #313C36;
|
24
|
+
$light-red: #ecbcbc;
|
25
|
+
$dark-red: #41363c;
|
26
|
+
|
27
|
+
$link-hover: #c0bed1;
|
28
|
+
$link-visited: #8c8cbc;
|
29
|
+
|
30
|
+
$grey-color: #8f8f8f;
|
31
|
+
// swapped because of dark theme
|
32
|
+
$grey-color-light: lighten($grey-color, 25%);
|
33
|
+
$grey-color-dark: lighten($grey-color, 40%);
|
34
|
+
|
35
|
+
// Width of the content area
|
36
|
+
$content-width: 800px;
|
37
|
+
|
38
|
+
$on-palm: 600px;
|
39
|
+
$on-laptop: 800px;
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
// Using media queries with like this:
|
44
|
+
// @include media-query($on-palm) {
|
45
|
+
// .wrapper {
|
46
|
+
// padding-right: $spacing-unit / 2;
|
47
|
+
// padding-left: $spacing-unit / 2;
|
48
|
+
// }
|
49
|
+
// }
|
50
|
+
@mixin media-query($device) {
|
51
|
+
@media screen and (max-width: $device) {
|
52
|
+
@content;
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
// Import partials from `sass_dir` (defaults to `_sass`)
|
59
|
+
@import
|
60
|
+
"base",
|
61
|
+
"layout",
|
62
|
+
"syntax-highlighting",
|
63
|
+
"rp"
|
64
|
+
;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
layout: page
|
3
|
+
title: All RPs
|
4
|
+
rp_index: true
|
5
|
+
---
|
6
|
+
|
7
|
+
{% if page['rps']['canon'].size > 0 then %}
|
8
|
+
<h2 class="arc-title"><a name="canon" href="#canon">Canon</a></h2>
|
9
|
+
<ul class="rp-list">
|
10
|
+
{% for rp in page['rps']['canon'] %}
|
11
|
+
{% include rp.html rp=rp %}
|
12
|
+
{% endfor %}
|
13
|
+
</ul>
|
14
|
+
{% endif %}
|
15
|
+
|
16
|
+
{% if page['rps']['noncanon'].size > 0 %}
|
17
|
+
<h2 class="arc-title"><a name="non-canon" href="#non-canon">Non-Canon</a></h2>
|
18
|
+
<ul class="rp-list">
|
19
|
+
{% for rp in page['rps']['noncanon'] %}
|
20
|
+
{% include rp.html rp=rp %}
|
21
|
+
{% endfor %}
|
22
|
+
</ul>
|
23
|
+
{% endif %}
|
@@ -0,0 +1,93 @@
|
|
1
|
+
(function() {
|
2
|
+
"use strict";
|
3
|
+
var fixedMenu = $("#fixed_menu");
|
4
|
+
var oocButton = $("#ooc_label");
|
5
|
+
// get window
|
6
|
+
var win = $(window);
|
7
|
+
// use vars to short circuit doing work again
|
8
|
+
var shown = false;
|
9
|
+
var canClose = false;
|
10
|
+
|
11
|
+
var lastScroll = 0;
|
12
|
+
var minScroll = 200; // how far down in order to show it
|
13
|
+
|
14
|
+
var timeout;
|
15
|
+
var closeableTimeout;
|
16
|
+
|
17
|
+
var hideMenu = function() {
|
18
|
+
shown = false;
|
19
|
+
fixedMenu.removeClass('shown');
|
20
|
+
clearHideTimer();
|
21
|
+
};
|
22
|
+
|
23
|
+
var showMenu = function() {
|
24
|
+
shown = true;
|
25
|
+
fixedMenu.addClass('shown');
|
26
|
+
resetHideTimer();
|
27
|
+
};
|
28
|
+
|
29
|
+
var allowMenuClose = function() {
|
30
|
+
canClose = true;
|
31
|
+
};
|
32
|
+
|
33
|
+
var resetHideTimer = function() {
|
34
|
+
clearTimeout(timeout);
|
35
|
+
clearTimeout(closeableTimeout);
|
36
|
+
canClose = false;
|
37
|
+
timeout = setTimeout(hideMenu, 2000);
|
38
|
+
closeableTimeout = setTimeout(allowMenuClose, 500);
|
39
|
+
};
|
40
|
+
|
41
|
+
var clearHideTimer = function() {
|
42
|
+
clearTimeout(timeout);
|
43
|
+
};
|
44
|
+
|
45
|
+
win.on("scroll", function() {
|
46
|
+
var curScroll = win.scrollTop();
|
47
|
+
if (!shown && curScroll > minScroll && curScroll < lastScroll) {
|
48
|
+
showMenu();
|
49
|
+
} else if (shown && canClose && (curScroll > lastScroll || curScroll < minScroll)) {
|
50
|
+
// keep it from closing early
|
51
|
+
// have some min time before closing
|
52
|
+
hideMenu();
|
53
|
+
}
|
54
|
+
|
55
|
+
lastScroll = curScroll;
|
56
|
+
});
|
57
|
+
|
58
|
+
win.on("click", function(e) {
|
59
|
+
// Don't hide the button if user clicked a real link or the label
|
60
|
+
if (e.target.tagName === "A" || e.originalEvent.passedThroughFixedMenu) return;
|
61
|
+
|
62
|
+
if (!shown) {
|
63
|
+
showMenu();
|
64
|
+
} else if (shown) {
|
65
|
+
hideMenu();
|
66
|
+
}
|
67
|
+
});
|
68
|
+
|
69
|
+
fixedMenu.click(function(e) {
|
70
|
+
resetHideTimer();
|
71
|
+
e.originalEvent.passedThroughFixedMenu = true;
|
72
|
+
});
|
73
|
+
|
74
|
+
var toggleOOC = function(e) {
|
75
|
+
// var topPost = $("p.rp").withinViewportTop().first();
|
76
|
+
// var topPost = $("p.rp").not(":above-the-top").first();
|
77
|
+
var originalScroll = $(window).scrollTop();
|
78
|
+
var topPost = $("p.rp").filter(function(index, elem) {
|
79
|
+
return $(elem).offset().top >= originalScroll;
|
80
|
+
}).first();
|
81
|
+
|
82
|
+
var originalOffset = topPost.offset();
|
83
|
+
|
84
|
+
// checked == show; not checked == hide
|
85
|
+
var visible = $("#ooc_toggle").is(":checked");
|
86
|
+
$(".ooc").toggle(visible);
|
87
|
+
|
88
|
+
$(window).scrollTop(originalScroll + (topPost.offset().top - originalOffset.top));
|
89
|
+
};
|
90
|
+
toggleOOC();
|
91
|
+
|
92
|
+
$("#ooc_toggle").change(toggleOOC);
|
93
|
+
})();
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Andrew Rodgers-Schatz
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# Jekyll::RpLogs
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
### Bundler
|
6
|
+
Add these lines to your application's Gemfile:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
group :jekyll_plugins do
|
10
|
+
gem 'jekyll-rp_logs'
|
11
|
+
end
|
12
|
+
```
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
The Gemfile group will tell Jekyll to load the gem, and let you keep it up to date easily with Bundler.
|
18
|
+
|
19
|
+
### Manually
|
20
|
+
Alternatively, install it yourself as:
|
21
|
+
|
22
|
+
$ gem install jekyll-rp_logs
|
23
|
+
|
24
|
+
In this case you'll need to tell Jekyll to load the gem somehow, such as option 2 on the [Installing a plugin](http://jekyllrb.com/docs/plugins/#installing-a-plugin) instructions.
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
### Making a new site
|
29
|
+
Require the gem in your Rakefile to get access to its exposed tasks:
|
30
|
+
|
31
|
+
echo "require 'jekyll/rp_logs'" >> Rakefile
|
32
|
+
|
33
|
+
To set up a new site in the current directory, execute:
|
34
|
+
|
35
|
+
rake rp_logs:new
|
36
|
+
|
37
|
+
Then edit `_config.yml` and fill in the needed info for your setup.
|
38
|
+
|
39
|
+
**Warning:** Don't tell Jekyll to output to a directory that has anything useful in it -- it deletes anything in the `destination` directory whenever you build the site.
|
40
|
+
|
41
|
+
### Building the site
|
42
|
+
Run this command:
|
43
|
+
|
44
|
+
jekyll build
|
45
|
+
|
46
|
+
Optionally, add the `--watch` flag to automatically rebuild if you add more logs. Then get the output to somewhere that's served by a webserver, either by setting your `destination` to something there or by copying it manually.
|
47
|
+
|
48
|
+
**Warning again:** Destination folders are cleaned whenever Jekyll builds the site. Seriously, don't tell Jekyll to output to a directory that has anything useful in it.
|
49
|
+
|
50
|
+
### Adding RPs
|
51
|
+
Dump all of them into the `_rps/` directory of the site.
|
52
|
+
|
53
|
+
All joins, parts, and quits are stripped, so you don't have to bother pulling those out. All lines that are emotes (`/me`) are RP, and all other lines are OOC by default. Consecutive posts from the same person with timestamps less than a few seconds apart are merged together.
|
54
|
+
|
55
|
+
To flag an OOC line as RP, or vice versa, use
|
56
|
+
|
57
|
+
* `!RP ` before the timestamp to manually flag the line as RP
|
58
|
+
* `!OOC ` before the timestamp to manually flag the line as OOC
|
59
|
+
|
60
|
+
#### YAML Front Matter
|
61
|
+
In order to be picked up and parsed by Jekyll, each file needs a [YAML front matter](http://jekyllrb.com/docs/frontmatter/). One field is required:
|
62
|
+
|
63
|
+
* `title` - The name of the RP, as shown on its page and in the index
|
64
|
+
|
65
|
+
These are all optional (they have default values, configurable in `_config.yml`):
|
66
|
+
|
67
|
+
* `start_date` - Any valid YAML date, such as `YYYY-MM-DD`. - Displayed on the RP page, and used to sort in the index. If left blank, will be inferred from the first timestamp.
|
68
|
+
* `canon` - true/false - Whether the RP is considered canonical (whatever that means to you). Sorts RPs into one of two categories in the index.
|
69
|
+
* `complete` - true/false - Whether the RP is finished, or is still incomplete. Incomplete RPs are flagged as such on the index.
|
70
|
+
* `format` - YAML list - What format(s) the logs are in, e.g., `[weechat]`
|
71
|
+
* `rp_tags` - comma separated list - A list of tags that describe the contents, such as characters involved or events that occur.
|
72
|
+
* `arc_name` - YAML list - names of story arcs that the RP belongs to
|
73
|
+
|
74
|
+
There are also some more options you can toggle:
|
75
|
+
|
76
|
+
* `strict_ooc` - true/false - If true, only lines beginning with `(` are considered OOC by default.
|
77
|
+
* `merge_text_into_rp` - YAML list - A list of nicks whose clients split actions into normal text, like [IRCCloud did for a while](https://twitter.com/XiaguZ/status/590773722593763328).
|
78
|
+
* `infer_char_tags` - true/false - If false, don't infer the characters in the RP by the nicks who do emotes.
|
79
|
+
|
80
|
+
## Development
|
81
|
+
|
82
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
83
|
+
|
84
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
85
|
+
|
86
|
+
## Contributing
|
87
|
+
|
88
|
+
1. Fork it ( https://github.com/[my-github-username]/jekyll-rp_logs/fork )
|
89
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
90
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
91
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
92
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "jekyll/rp_logs"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'jekyll/rp_logs/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "jekyll-rp_logs"
|
8
|
+
spec.version = Jekyll::RpLogs::VERSION
|
9
|
+
spec.authors = ["anrodger"]
|
10
|
+
spec.email = ["me@andrew.rs"]
|
11
|
+
|
12
|
+
if spec.respond_to?(:metadata)
|
13
|
+
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
|
14
|
+
end
|
15
|
+
|
16
|
+
spec.summary = %q{Jekyll plugin to turn raw IRC RP logs into pretty pages.}
|
17
|
+
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
18
|
+
spec.homepage = "https://github.com/xiagu/jekyll-rp_logs"
|
19
|
+
spec.license = "MIT"
|
20
|
+
|
21
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
spec.bindir = "exe"
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.8"
|
27
|
+
|
28
|
+
spec.add_runtime_dependency "jekyll", "~> 2.5"
|
29
|
+
spec.add_runtime_dependency "rake", "~> 10.0"
|
30
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module RpLogs
|
3
|
+
|
4
|
+
class IrssiXChatParser < RpLogs::Parser
|
5
|
+
|
6
|
+
# Add this class to the parsing dictionary
|
7
|
+
FORMAT_STR = 'irssi-xchat'
|
8
|
+
RpLogs::RpLogGenerator.add self
|
9
|
+
|
10
|
+
# Stuff
|
11
|
+
class << self
|
12
|
+
MODE = /([+%@&~!]?)/
|
13
|
+
NICK = /([\w\-\\\[\]\{\}\^\`\|]+)/
|
14
|
+
DATE_REGEXP = /(\d\d:\d\d)/
|
15
|
+
|
16
|
+
FLAGS = /((?:![A-Z]+ )*)/
|
17
|
+
# TODO: Update to match join/part/quit format
|
18
|
+
JUNK = /#{DATE_REGEXP}\t<?-->?\t.*$/
|
19
|
+
EMOTE = /^#{FLAGS}#{DATE_REGEXP} {16}\* \| #{NICK}\s+([^\n]*)$/
|
20
|
+
TEXT = /^#{FLAGS}#{DATE_REGEXP} < *#{MODE}#{NICK}> \| ([^\n]*)$/
|
21
|
+
|
22
|
+
TIMESTAMP_FORMAT = '%H:%M'
|
23
|
+
|
24
|
+
def parse_line(line, options = {})
|
25
|
+
case line
|
26
|
+
when JUNK
|
27
|
+
return nil
|
28
|
+
when EMOTE
|
29
|
+
date = DateTime.strptime($2, TIMESTAMP_FORMAT)
|
30
|
+
return Parser::LogLine.new(date, options, sender: $3, contents: $4, \
|
31
|
+
flags: $1, type: :rp)
|
32
|
+
when TEXT
|
33
|
+
date = DateTime.strptime($2, TIMESTAMP_FORMAT)
|
34
|
+
mode = if $3 != '' then $3 else ' ' end
|
35
|
+
return Parser::LogLine.new(date, options, sender: $4, contents: $5, \
|
36
|
+
flags: $1, type: :ooc, mode: mode)
|
37
|
+
else
|
38
|
+
# Only put text and emotes in the log
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|