marked-conductor 1.0.13 → 1.0.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -103,9 +103,9 @@
103
103
  <span class="container">Conductor::Env</span>
104
104
 
105
105
  <li class="method">
106
- <a href="Conductor/Script.html#method-c-new">::new</a>
106
+ <a href="Conductor/Config.html#method-c-new">::new</a>
107
107
  &mdash;
108
- <span class="container">Conductor::Script</span>
108
+ <span class="container">Conductor::Config</span>
109
109
 
110
110
  <li class="method">
111
111
  <a href="Conductor/Command.html#method-c-new">::new</a>
@@ -118,14 +118,14 @@
118
118
  <span class="container">Conductor::Condition</span>
119
119
 
120
120
  <li class="method">
121
- <a href="Filter.html#method-c-new">::new</a>
121
+ <a href="Conductor/Script.html#method-c-new">::new</a>
122
122
  &mdash;
123
- <span class="container">Filter</span>
123
+ <span class="container">Conductor::Script</span>
124
124
 
125
125
  <li class="method">
126
- <a href="Conductor/Config.html#method-c-new">::new</a>
126
+ <a href="Filter.html#method-c-new">::new</a>
127
127
  &mdash;
128
- <span class="container">Conductor::Config</span>
128
+ <span class="container">Filter</span>
129
129
 
130
130
  <li class="method">
131
131
  <a href="Conductor.html#method-c-stdin">::stdin</a>
@@ -153,9 +153,9 @@
153
153
  <span class="container">String</span>
154
154
 
155
155
  <li class="method">
156
- <a href="Conductor/Command.html#method-i-args-3D">#args=</a>
156
+ <a href="String.html#method-i-append">#append</a>
157
157
  &mdash;
158
- <span class="container">Conductor::Command</span>
158
+ <span class="container">String</span>
159
159
 
160
160
  <li class="method">
161
161
  <a href="Conductor/Script.html#method-i-args-3D">#args=</a>
@@ -163,20 +163,25 @@
163
163
  <span class="container">Conductor::Script</span>
164
164
 
165
165
  <li class="method">
166
- <a href="String.html#method-i-bool-3F">#bool?</a>
166
+ <a href="Conductor/Command.html#method-i-args-3D">#args=</a>
167
167
  &mdash;
168
- <span class="container">String</span>
168
+ <span class="container">Conductor::Command</span>
169
169
 
170
170
  <li class="method">
171
- <a href="TrueClass.html#method-i-bool-3F">#bool?</a>
171
+ <a href="String.html#method-i-bool-3F">#bool?</a>
172
172
  &mdash;
173
- <span class="container">TrueClass</span>
173
+ <span class="container">String</span>
174
174
 
175
175
  <li class="method">
176
176
  <a href="FalseClass.html#method-i-bool-3F">#bool?</a>
177
177
  &mdash;
178
178
  <span class="container">FalseClass</span>
179
179
 
180
+ <li class="method">
181
+ <a href="TrueClass.html#method-i-bool-3F">#bool?</a>
182
+ &mdash;
183
+ <span class="container">TrueClass</span>
184
+
180
185
  <li class="method">
181
186
  <a href="String.html#method-i-bool_to_symbol">#bool_to_symbol</a>
182
187
  &mdash;
@@ -212,11 +217,26 @@
212
217
  &mdash;
213
218
  <span class="container">String</span>
214
219
 
220
+ <li class="method">
221
+ <a href="String.html#method-i-get_title">#get_title</a>
222
+ &mdash;
223
+ <span class="container">String</span>
224
+
215
225
  <li class="method">
216
226
  <a href="String.html#method-i-has_comment-3F">#has_comment?</a>
217
227
  &mdash;
218
228
  <span class="container">String</span>
219
229
 
230
+ <li class="method">
231
+ <a href="String.html#method-i-insert_script">#insert_script</a>
232
+ &mdash;
233
+ <span class="container">String</span>
234
+
235
+ <li class="method">
236
+ <a href="String.html#method-i-insert_title">#insert_title</a>
237
+ &mdash;
238
+ <span class="container">String</span>
239
+
220
240
  <li class="method">
221
241
  <a href="String.html#method-i-meta-3F">#meta?</a>
222
242
  &mdash;
@@ -278,14 +298,14 @@
278
298
  <span class="container">String</span>
279
299
 
280
300
  <li class="method">
281
- <a href="Conductor/Script.html#method-i-run">#run</a>
301
+ <a href="Conductor/Command.html#method-i-run">#run</a>
282
302
  &mdash;
283
- <span class="container">Conductor::Script</span>
303
+ <span class="container">Conductor::Command</span>
284
304
 
285
305
  <li class="method">
286
- <a href="Conductor/Command.html#method-i-run">#run</a>
306
+ <a href="Conductor/Script.html#method-i-run">#run</a>
287
307
  &mdash;
288
- <span class="container">Conductor::Command</span>
308
+ <span class="container">Conductor::Script</span>
289
309
 
290
310
  <li class="method">
291
311
  <a href="Conductor.html#method-i-sample_config">#sample_config</a>
@@ -318,14 +338,14 @@
318
338
  <span class="container">String</span>
319
339
 
320
340
  <li class="method">
321
- <a href="Hash.html#method-i-symbolize_keys">#symbolize_keys</a>
341
+ <a href="Array.html#method-i-symbolize_keys">#symbolize_keys</a>
322
342
  &mdash;
323
- <span class="container">Hash</span>
343
+ <span class="container">Array</span>
324
344
 
325
345
  <li class="method">
326
- <a href="Array.html#method-i-symbolize_keys">#symbolize_keys</a>
346
+ <a href="Hash.html#method-i-symbolize_keys">#symbolize_keys</a>
327
347
  &mdash;
328
- <span class="container">Array</span>
348
+ <span class="container">Hash</span>
329
349
 
330
350
  <li class="method">
331
351
  <a href="Array.html#method-i-symbolize_keys-21">#symbolize_keys!</a>
@@ -387,6 +407,16 @@
387
407
  &mdash;
388
408
  <span class="container">String</span>
389
409
 
410
+ <li class="method">
411
+ <a href="String.html#method-i-title_from_slug">#title_from_slug</a>
412
+ &mdash;
413
+ <span class="container">String</span>
414
+
415
+ <li class="method">
416
+ <a href="String.html#method-i-titleize">#titleize</a>
417
+ &mdash;
418
+ <span class="container">String</span>
419
+
390
420
  <li class="method">
391
421
  <a href="String.html#method-i-to_bool">#to_bool</a>
392
422
  &mdash;
@@ -47,6 +47,73 @@ class ::String
47
47
  insert_point
48
48
  end
49
49
 
50
+ def append(string)
51
+ "#{self}\n#{string}"
52
+ end
53
+
54
+ def insert_script(path)
55
+ path.strip!
56
+ path = "#{path}.js" unless path =~ /\.js$/
57
+
58
+ if path =~ %r{^[~/]}
59
+ path = File.expand_path(path)
60
+ else
61
+ new_path = if File.directory?(File.expand_path("~/.config/conductor/javascript"))
62
+ File.expand_path("~/.config/conductor/javascript/#{path}")
63
+ elsif File.directory?(File.expand_path("~/.config/conductor/javascripts"))
64
+ File.expand_path("~/.config/conductor/javascripts/#{path}")
65
+ else
66
+ File.expand_path("~/.config/conductor/scripts/#{path}")
67
+ end
68
+
69
+ path = new_path if File.exist?(new_path)
70
+ end
71
+
72
+ %(#{self}\n<script type="javascript" src="#{path}"></script>\n)
73
+ end
74
+
75
+ def title_from_slug
76
+ filename = File.basename(Conductor::Env.env[:filepath]).sub(/\.[a-z]+$/i, "")
77
+ filename.sub!(/-?\d{4}-\d{2}-\d{2}-?/, "")
78
+ filename.sub!(/\bdot\b/, ".")
79
+ filename.sub!(/ dash /, "-")
80
+ filename
81
+ end
82
+
83
+ def get_title
84
+ title = nil
85
+
86
+ case meta_type
87
+ when :yaml
88
+ m = match(/^---.*?\n(---|\.\.\.)/m)
89
+ yaml = YAML.load(m[0])
90
+ title = yaml["title"]
91
+ when :mmd
92
+ split(/\n/).each do |line|
93
+ if line =~ /^ *title: *(\S.*?)$/i
94
+ title = Regexp.last_match(1)
95
+ break
96
+ end
97
+ end
98
+ else
99
+ m = match(/title: (.*?)$/i)
100
+ title = m ? m[0] : nil
101
+ end
102
+
103
+ title ||= title_from_slug.titleize
104
+
105
+ title
106
+ end
107
+
108
+ def insert_title
109
+ title = get_title
110
+ lines = split(/\n/)
111
+ insert_point = meta_insert_point
112
+ insert_at = insert_point.positive? ? insert_point + 1 : 0
113
+ lines.insert(insert_at, "# #{title}\n")
114
+ lines.join("\n")
115
+ end
116
+
50
117
  def set_meta(key, value, style: :comment)
51
118
  case style
52
119
  when :yaml
@@ -143,7 +210,7 @@ class ::String
143
210
  end
144
211
 
145
212
  def to_pattern
146
- gsub(/\$(\d+)/, '\\\\\1').gsub(/(^["']|["']$)/, '')
213
+ gsub(/\$(\d+)/, '\\\\\1').gsub(/(^["']|["']$)/, "")
147
214
  end
148
215
  end
149
216
 
@@ -153,12 +220,21 @@ class Filter < String
153
220
 
154
221
  def initialize(filter)
155
222
  @filter, @params = filter.normalize_filter
223
+ super
156
224
  end
157
225
 
158
226
  def process
159
227
  content = Conductor.stdin
160
228
 
161
229
  case @filter
230
+ when /(insert|add|inject)title/
231
+ content.insert_title
232
+ when /(insert|add|inject)script/
233
+ content = content.append("\n\n<div>")
234
+ @params.each do |script|
235
+ content = content.insert_script(script)
236
+ end
237
+ "#{content}</div>"
162
238
  when /(add|set)meta/
163
239
  unless @params.count == 2
164
240
  warn "Invalid filter parameters: #{@filter}(#{@params.join(",")})"
@@ -2,6 +2,15 @@
2
2
 
3
3
  # String helpers
4
4
  class ::String
5
+ ##
6
+ ## Titlecase a string
7
+ ##
8
+ ## @return Titleized string
9
+ ##
10
+ def titleize
11
+ split(/(\W)/).map(&:capitalize).join
12
+ end
13
+
5
14
  ##
6
15
  ## Convert a string boolean to symbol
7
16
  ##
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Conductor
4
- VERSION = '1.0.13'
4
+ VERSION = '1.0.14'
5
5
  end
data/src/_README.md CHANGED
@@ -23,7 +23,7 @@ If you use Homebrew, you can run
23
23
 
24
24
  To use Conductor, you need to set up a configuration file in `~/.config/conductor/tracks.yaml`. Run `conductor` once to create the directory and an empty configuration. See [Configuration](#configuration) below for details on setting up your "tracks."
25
25
 
26
- Once configured, you can set up conductor as a Custom Processor in Marked. Run `which conductor | pbcopy` to get the full path to the binary and copy it, then open <b>Marked Preferences > Advanced</b> and select either Custom Processor or Custom Preprocessor (or both) and paste into the <b>Path:</b> field. You can select <i>Automatically enable for new windows</i> to have the processor enabled by default when opening documents.
26
+ Once configured, you can set up conductor as a Custom Processor in Marked. Run `which conductor | pbcopy` to get the full path to the binary and copy it, then open **Marked Preferences > Advanced** and select either Custom Processor or Custom Preprocessor (or both) and paste into the **Path:** field. You can select *Automatically enable for new windows* to have the processor enabled by default when opening documents.
27
27
 
28
28
  <!--JEKYLL {% img aligncenter /uploads/2024/04/marked-preferences-conductor.jpg 593 673 "marked-preferences-conductor.jpg" %}-->
29
29
  <!--GITHUB-->![Marked preferences](images/preferences.jpg)<!--END GITHUB-->
@@ -122,13 +122,45 @@ Conditions can be combined with AND or OR (must be uppercase) and simple parenth
122
122
 
123
123
  ### Actions
124
124
 
125
- The action can be either `script` or `command`.
125
+ The action can be `script`, `command`, or `filter`.
126
126
 
127
- Scripts are located in `~/.config/conductor/scripts/` and should be executable files that take input on STDIN (unless `$file` is specified in the `script` definition). If a script is defined starting with `~` or `/`, that will be interpreted as a full path to an alternate location.
127
+ **Scripts** are located in `~/.config/conductor/scripts/` and should be executable files that take input on STDIN (unless `$file` is specified in the `script` definition). If a script is defined starting with `~` or `/`, that will be interpreted as a full path to an alternate location.
128
128
 
129
- Commands are interpreted as shell commands. If a command exists in the `$PATH`, a full path will automatically be determined, so a command can be as simple as just `pandoc`. Add any arguments needed after the command.
129
+ > Example:
130
+ >
131
+ > script: github_pre
130
132
 
131
- Using `$file` as an argument to a script or command will bypass processing of STDIN input, and instead use the value of $MARKED_PATH to read the contents of the specified file.
133
+ **Commands** are interpreted as shell commands. If a command exists in the `$PATH`, a full path will automatically be determined, so a command can be as simple as just `pandoc`. Add any arguments needed after the command.
134
+
135
+ > Example:
136
+ >
137
+ > command: multimarkdown
138
+
139
+
140
+ > Using `$file` as an argument to a script or command will bypass processing of STDIN input, and instead use the value of $MARKED_PATH to read the contents of the specified file.
141
+
142
+ **Filters** are simple actions that can be run on the content without having to write a separate script for it. Available filters are:
143
+ | filter | description |
144
+ | :---- | :---------- |
145
+ | `setMeta(key, value)` | adds or updates a meta key, aware of YAML and MMD |
146
+ | `stripMeta` | strips all metadata (YAML or MMD) from the content |
147
+ | `stripMeta(key)` | removes a specific key (YAML or MMD) |
148
+ | `setStyle(name)` | sets the Marked preview style to a preconfigured Style name
149
+ | `replace(search, replace)` | performs a (single) search and replace on content |
150
+ | `replaceAll(search, replace)` | global version of `replaceAll`) |
151
+ | `insertTitle` | adds a title to the document, either from metadata or filename |
152
+ | `insertScript(path[,path])` | injects javascript(s) |
153
+
154
+ For `insertScript`, if path is just a filename it will look for a match in `~/.config/conductor/javascript` or `~/.config/conductor/scripts` and turn that into an absolute path if the file is found.
155
+
156
+ For `replace` and `replaceAll`: If *search* is surrounded with forward slashes followed by optional flags (*i* for case-insensitive, *m* to make dot match newlines), e.g. `/contribut(ing)?/i`, it will be interpreted as a regular expression. The *replace* value can include numeric capture groups, e.g. `Follow$2`.
157
+
158
+ > Example:
159
+ >
160
+ > filter: setStyle(github)
161
+
162
+
163
+ > Filters can be camel case (replaceAll) or snake case (replace_all), either will work, case insensitive.
132
164
 
133
165
  ## Custom Processors
134
166
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marked-conductor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-24 00:00:00.000000000 Z
11
+ date: 2024-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -212,6 +212,7 @@ files:
212
212
  - html/Conductor/Env.html
213
213
  - html/Conductor/Script.html
214
214
  - html/FalseClass.html
215
+ - html/Filter.html
215
216
  - html/Hash.html
216
217
  - html/Object.html
217
218
  - html/README_rdoc.html