labrat 0.1.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.rubocop.yml +18 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +102 -0
- data/README.org +644 -0
- data/Rakefile +12 -0
- data/TODO.org +7 -0
- data/bin/console +15 -0
- data/bin/labrat +74 -0
- data/bin/labrat-install +85 -0
- data/bin/setup +8 -0
- data/img/sample.jpg +0 -0
- data/img/sample.pdf +82 -0
- data/img/sample.png +0 -0
- data/labrat.gemspec +40 -0
- data/lib/config_files/config.yml +121 -0
- data/lib/config_files/labeldb.yml +1010 -0
- data/lib/config_files/labeldb_usr.yml +24 -0
- data/lib/labrat/arg_parser.rb +481 -0
- data/lib/labrat/config.rb +188 -0
- data/lib/labrat/errors.rb +13 -0
- data/lib/labrat/hash.rb +38 -0
- data/lib/labrat/label.rb +158 -0
- data/lib/labrat/label_db.rb +49 -0
- data/lib/labrat/options.rb +184 -0
- data/lib/labrat/read_files.rb +40 -0
- data/lib/labrat/version.rb +5 -0
- data/lib/labrat.rb +20 -0
- data/lib/lisp/labrat.el +108 -0
- metadata +219 -0
data/README.org
ADDED
@@ -0,0 +1,644 @@
|
|
1
|
+
|
2
|
+
#+BEGIN_COMMENT
|
3
|
+
This is for markdown output:
|
4
|
+
|
5
|
+
[![Build Status](https://travis-ci.org/ddoherty03/labrat.svg?branch=master)](https://travis-ci.org/ddoherty03/labrat)
|
6
|
+
|
7
|
+
The following is for org.
|
8
|
+
#+END_COMMENT
|
9
|
+
|
10
|
+
[[https://travis-ci.org/ddoherty03/labrat.svg?branch=master]]
|
11
|
+
|
12
|
+
|
13
|
+
* Table of Contents :toc_3:
|
14
|
+
- [[#labrat][Labrat]]
|
15
|
+
- [[#motivation][Motivation]]
|
16
|
+
- [[#a-tip-on-buying-file-folder-labels][A Tip on Buying File Folder Labels]]
|
17
|
+
- [[#installation][Installation]]
|
18
|
+
- [[#setting-options][Setting options]]
|
19
|
+
- [[#dimensions-and-other-values-in-options][Dimensions and other values in options]]
|
20
|
+
- [[#page-setup-options][Page Setup Options]]
|
21
|
+
- [[#orientation][Orientation]]
|
22
|
+
- [[#page-dimensions][Page Dimensions]]
|
23
|
+
- [[#page-grid][Page Grid]]
|
24
|
+
- [[#label-setup-options][Label Setup Options]]
|
25
|
+
- [[#padding][Padding]]
|
26
|
+
- [[#alignment][Alignment]]
|
27
|
+
- [[#fonts-and-styling][Fonts and styling]]
|
28
|
+
- [[#position-adjustment][Position Adjustment]]
|
29
|
+
- [[#job-processing-options][Job Processing Options]]
|
30
|
+
- [[#starting-label][Starting label]]
|
31
|
+
- [[#new-line-marker][New line marker]]
|
32
|
+
- [[#label-separator][Label separator]]
|
33
|
+
- [[#number-of-copies][Number of copies]]
|
34
|
+
- [[#input-and-output-files][Input and output files]]
|
35
|
+
- [[#printing-or-viewing][Printing or viewing]]
|
36
|
+
- [[#shell-commands][Shell commands]]
|
37
|
+
- [[#aids-to-testing-label-layouts][Aids to testing label layouts]]
|
38
|
+
- [[#the-label-database-and-the-label-option][The Label Database and the label option]]
|
39
|
+
- [[#listing-labels][Listing labels]]
|
40
|
+
- [[#system-label-database][System label database]]
|
41
|
+
- [[#trying-out-a-label-definition][Trying out a label definition]]
|
42
|
+
- [[#nesting-label-definitions][Nesting label definitions]]
|
43
|
+
- [[#label-database-entries-as-configuration-sets][Label database entries as configuration sets]]
|
44
|
+
- [[#a-caution-about-option-order][A Caution about option order]]
|
45
|
+
- [[#development][Development]]
|
46
|
+
- [[#contributing][Contributing]]
|
47
|
+
|
48
|
+
* Labrat
|
49
|
+
A linux command-line program for quickly printing labels. Labrat uses the
|
50
|
+
wonderful [[https://github.com/prawnpdf/prawn][Prawn gem]] to generate PDF files with label formatting in mind. With
|
51
|
+
=labrat= properly configured, printing a label is as simple as:
|
52
|
+
|
53
|
+
#+begin_example
|
54
|
+
$ labrat 'Income Taxes 2021++Example Maker, Inc.'
|
55
|
+
#+end_example
|
56
|
+
|
57
|
+
And you will get a two-line file-folder label printed that looks like this:
|
58
|
+
|
59
|
+
[[./img/sample.png]]
|
60
|
+
|
61
|
+
Note that an outline was added to make the size of the label apparent and is
|
62
|
+
not actually printed with the label by default.
|
63
|
+
|
64
|
+
** Motivation
|
65
|
+
I need to print labels. And in my case, mostly I need file folder labels. I
|
66
|
+
typically want to print to a Dymo LabelWriter, of which I own several
|
67
|
+
variants. The problem is that I work almost entirely in Linux, but the simple
|
68
|
+
task of printing a file folder label has required opening a GUI application,
|
69
|
+
such as the very fine [[https://help.gnome.org/users/glabels/stable/][glabels]], or worse, switching to a machine running
|
70
|
+
Windows or to a Mac to run Dymo's proprietary GUI. The Dymo GUI is
|
71
|
+
particularly irksome because it takes a long time to start up and demands that
|
72
|
+
you register every time you open it.
|
73
|
+
|
74
|
+
I wanted a way to print a file label from the command line, or even better,
|
75
|
+
from within my editor, Emacs. After giving up looking for such a thing
|
76
|
+
without success, I decided to write my own. Hence labrat. With it---after
|
77
|
+
due configuration---printing a file folder label is as simple as:
|
78
|
+
|
79
|
+
#+begin_src sh
|
80
|
+
$ labrat 'First Line of Label++And the Second Line'
|
81
|
+
#+end_src
|
82
|
+
|
83
|
+
Or, you can preview the label in your previewer of choice (mine is qpdfview)
|
84
|
+
by adding the -V flag:
|
85
|
+
|
86
|
+
#+begin_src sh
|
87
|
+
$ labrat -V 'First Line of Label++And the Second Line'
|
88
|
+
#+end_src
|
89
|
+
|
90
|
+
Even better, I have included with =labrat= an elisp file (=labrat.el=) that
|
91
|
+
will invoke =labrat= to form a label with the text of the paragraph at or
|
92
|
+
before point. So within Emacs, you can bind keys to the commands,
|
93
|
+
=labrat-print= and =labrat-view= to print or view the current or prior
|
94
|
+
paragraph as your default label. Thus, in Emacs, I have ~C-z C-l C-l~ bound
|
95
|
+
to =labrat-print= and ~C-z C-l C-v~ to =labrat-view=, and I can type a label
|
96
|
+
in any buffer and get it generated with very little ceremony.
|
97
|
+
|
98
|
+
** A Tip on Buying File Folder Labels
|
99
|
+
As mentioned, one of my main motivations for writing =labrat= was the need to
|
100
|
+
easily create file-folder labels. I got into creating files after reading
|
101
|
+
/Getting Things Done/ by David Allen. One of his recommendations for keeping
|
102
|
+
organized is having a file system so that documents can be easily archived and
|
103
|
+
retrieved.
|
104
|
+
|
105
|
+
I have long used Dymo's 30327 label, which is just the right size for file
|
106
|
+
folders. But after several years of use, I started to notice something
|
107
|
+
alarming: I could no longer read the text of the labels, they had nearly faded
|
108
|
+
into oblivion. The problem is that the labels use a thermal printing
|
109
|
+
technology that is affected by light and time, and over a period of years,
|
110
|
+
they get lighter and lighter. You may have seen the same thing on old
|
111
|
+
thermal-printed store receipts.
|
112
|
+
|
113
|
+
After looking for alternative printers, I found the solution, not in a new
|
114
|
+
printer technology, but in a new label technology. DuraReady makes labels
|
115
|
+
that can be printed on a thermal printer like the Dymo LaserWriter, but print
|
116
|
+
on a "Gloss white polypropylene BOPP plastic." I'm not sure what that is, but
|
117
|
+
the labels come out with nice black lettering on a white background, and they
|
118
|
+
don't fade. Check it out here: [[https://www.duraready.com/file-folder-labels/1034d-9/16-x-3-7/16-white-bopp-plastic-label/][DuraReady]].
|
119
|
+
|
120
|
+
Thermal labels may be fine for ephemeral applications like name tags or
|
121
|
+
shipping labels, but are terrible for long-term applications like file
|
122
|
+
folders, marking cables, marking electrical breakers, or any other number of
|
123
|
+
applications where long-term readability is essential.
|
124
|
+
|
125
|
+
** Installation
|
126
|
+
Since =labrat= is distributed as a Ruby gem, you have to have a ruby
|
127
|
+
installation. Look [[https://www.ruby-lang.org/en/documentation/installation/][here]] for ruby installation instructions. You can then
|
128
|
+
install =labrat= with:
|
129
|
+
|
130
|
+
#+begin_SRC sh
|
131
|
+
$ gem install labrat
|
132
|
+
#+end_SRC
|
133
|
+
|
134
|
+
After installation, you should install the user and system configuration files
|
135
|
+
with:
|
136
|
+
|
137
|
+
#+begin_SRC sh
|
138
|
+
$ labrat-install
|
139
|
+
#+end_SRC
|
140
|
+
|
141
|
+
This will install an annotated system-wide config file in
|
142
|
+
=/etc/xdg/labrat/config.yml= and a system-wide label database in
|
143
|
+
=/etc/xdg/labrat/labeldb.yml=.
|
144
|
+
|
145
|
+
It will also install an annotated sample user config file in
|
146
|
+
=~/.config/labrat/labrat.el= and a sample user-level label database in
|
147
|
+
=~/.config/labrat/labeldb.yml=.
|
148
|
+
|
149
|
+
For the benefit of Emacs users, it also installs the =labrat.el= elisp library
|
150
|
+
in =~/.config/labrat= as well, though you may want to move it to a different
|
151
|
+
location.
|
152
|
+
|
153
|
+
If invoke =labrat-install= multiple times, it will refuse to overwrite any
|
154
|
+
existing config or database files that you may have edited. If you want to
|
155
|
+
re-install them you have to move them out of the way.
|
156
|
+
|
157
|
+
** Setting options
|
158
|
+
You can control how =labrat= composes a label completely from the
|
159
|
+
command-line, though that would be a very tedious thing to have to do.
|
160
|
+
Better, set up your preferred configuration in your user config file, so that
|
161
|
+
all you need to supply on the command line is the text of the label. Every
|
162
|
+
command-line option has an equivalent configuration option using the long form
|
163
|
+
of the option as a key in a YAML configuration format.
|
164
|
+
|
165
|
+
Labrat reads options from the following locations, with the locations listed
|
166
|
+
from lowest to highest priority. In other words, options set in the
|
167
|
+
first-listed location can be overriden by settings in later-listed locations.
|
168
|
+
|
169
|
+
1. It reads system-wide options from =/etc/xdg/labrat/config.yml=. This is a
|
170
|
+
YAML formatted file in which the long form of the option, without the
|
171
|
+
leading '--', is used as a key with the setting as the value.
|
172
|
+
2. It reads a user configuration from =~/.config/labrat/config.yml=. It also
|
173
|
+
uses the YAML format based on the long form of option names.
|
174
|
+
3. Finally, it reads options from the command-line, where, of course, the
|
175
|
+
leading hyphens are mandatory.
|
176
|
+
|
177
|
+
** Dimensions and other values in options
|
178
|
+
Many of the options deal with specifying some sort of distance. Those are
|
179
|
+
designated with the placeholder ~DIM~. A ~DIM~ is an integer or floating
|
180
|
+
point number followed by an optional unit of measurement. If no unit is
|
181
|
+
given, the unit ~pt~ for "points" are assumed. Here are the valid units that
|
182
|
+
you can use:
|
183
|
+
|
184
|
+
- ~pt~ :: Points, or Adobe points, or "big points", equal to exactly 1/72 of
|
185
|
+
an inch, the default if no unit is given
|
186
|
+
- ~mm~ :: Millimeters,
|
187
|
+
- ~cm~ :: Centimeters, equal to 10 millimeters,
|
188
|
+
- ~dm~ :: Decimeters, equal to 10 centimeters,
|
189
|
+
- ~in~ :: Inches,
|
190
|
+
- ~ft~ :: Feet, equal to 12 inches,
|
191
|
+
- ~yd~ :: Yard, equal to 3 feet.
|
192
|
+
|
193
|
+
Most other options are strings, which need to be quoted on the command-line if
|
194
|
+
they contain any spaces or other characters special to your shell. In the
|
195
|
+
configuration files, string values need not be quoted.
|
196
|
+
|
197
|
+
** Page Setup Options
|
198
|
+
Labrat can handle multi-label pages such as Avery-style label sheets. These
|
199
|
+
options deal with the page-level dimensions of the, potentially, multi-label
|
200
|
+
page. By contrast, the dimensions of individual labels are dealt with by the
|
201
|
+
label setup options described in the next section.
|
202
|
+
|
203
|
+
*** Orientation
|
204
|
+
- ~-L~, ~--[no-]landscape~ :: Orient the label grid and the printing direction
|
205
|
+
of the text of the label in landscape (default false), i.e., with the label
|
206
|
+
grid rotated 90 degrees clockwise so that the first label is printed down
|
207
|
+
the page starting at the upper right element of the grid. This setting does
|
208
|
+
not affect what is left, right, top, or bottom for purposes of specifying
|
209
|
+
the page dimensions, but does affect what is considered "horizontal rows"
|
210
|
+
and "vertical columns": those are counted in the rotated direction of
|
211
|
+
printing.
|
212
|
+
- ~-P~, ~--[no-]portrait~ :: This is simply a convenience switch meaning
|
213
|
+
~--no-landscape~ and is the default.
|
214
|
+
|
215
|
+
*** Page Dimensions
|
216
|
+
When specifying page dimensions, =labrat= regards all dimension-related
|
217
|
+
directions, left, right, top, bottom to refer to the page as is comes out of
|
218
|
+
the printer, unaffected by whether the labels are printed in landscape or
|
219
|
+
portrait. This hopefully eliminates some confusion in the use of those terms.
|
220
|
+
Even a specialty label printer, such as the Dymo LabelWriter series, in which
|
221
|
+
the long skinny labels come out of the printer sideways, regard the page
|
222
|
+
dimensions in the orientation that the labels come out: that is, the "page"
|
223
|
+
has a relatively narrow width compared to its tall height.
|
224
|
+
|
225
|
+
With that in mind, specifying the page dimensions is just a matter of getting
|
226
|
+
out a ruler and measuring.
|
227
|
+
|
228
|
+
- ~-w~, ~--page-width=DIM~ :: Horizontal dimension of a page of labels as it
|
229
|
+
comes out of the printer
|
230
|
+
- ~-h~, ~--page-height=DIM~ :: Vertical dimension of a page of labels as it
|
231
|
+
comes out of the printer
|
232
|
+
- ~--top-page-margin=DIM~ :: Distance from top side of page (in portrait) to
|
233
|
+
the print area
|
234
|
+
- ~--bottom-page-margin=DIM~ :: Distance from bottom side of page (in
|
235
|
+
portrait) to the print area
|
236
|
+
- ~--left-page-margin=DIM~ :: Distance from left side of page (in portrait) to
|
237
|
+
the print area
|
238
|
+
- ~--right-page-margin=DIM~ :: Distance from right side of page (in portrait)
|
239
|
+
to the print area
|
240
|
+
- ~--v-page-margin=DIM~ :: Distance from top and bottom sides of page (in
|
241
|
+
portrait) to the print area; short for ~--top-page-margin~ and
|
242
|
+
~--bottom-page-margin~
|
243
|
+
- ~--h-page-margin=DIM~ :: Distance from left and right sides of page (in
|
244
|
+
portrait) to the print area; short for ~--left-page-margin~ and
|
245
|
+
~--right-page-margin~
|
246
|
+
- ~--page-margin=DIM~ :: Distance from all sides of page (in portrait) to the
|
247
|
+
print area; short for ~--top-page-margin~, ~--bottom-page-margin~,
|
248
|
+
~--left-page-margin~ and ~--right-page-margin~
|
249
|
+
|
250
|
+
*** Page Grid
|
251
|
+
By default, =labrat= considers a page of labels to contain only one row and
|
252
|
+
one column, that is, a single label per page. To set up a multi-label page,
|
253
|
+
you have to describe the number of rows and columns and the amount of the gap
|
254
|
+
between them. The number of "rows" is counted as the number of "horizontal"
|
255
|
+
set of labels after taking the page orientation into account. Likewise, the
|
256
|
+
number of columns is counted as the number of "vertical" set of labels after
|
257
|
+
taking the page orientation into account
|
258
|
+
|
259
|
+
- ~-R~, ~--rows=NUM~ :: The number of horizontal rows of labels on a page, taking
|
260
|
+
into account the direction of printing via the ~--landscape~ switch.
|
261
|
+
- ~-C~, ~--columns=NUM~ :: The number of vertical columns of labels on a page,
|
262
|
+
taking into account the direction of printing via the ~--landscape~ switch.
|
263
|
+
- ~--row-gap=DIM~ :: The distance between rows of labels on a page
|
264
|
+
- ~--column-gap=DIM~ :: The distance between columns of labels on a page
|
265
|
+
|
266
|
+
** Label Setup Options
|
267
|
+
These options determine the layout of individual labels within the page rather
|
268
|
+
than the page as a whole. Note that the dimensions of individual labels is
|
269
|
+
not specified, but is implicitly determined by (1) the page width and height,
|
270
|
+
(2) the page margins, (3) the number of rows and columns per page, and (4) the
|
271
|
+
row and column gaps. The remaining space on the page is divided into a grid
|
272
|
+
of identically-sized labels, which determines the size of each label.
|
273
|
+
|
274
|
+
*** Padding
|
275
|
+
Within each label, the following options allow you to set the margins on each
|
276
|
+
side of the label:
|
277
|
+
|
278
|
+
- ~--top-pad=DIM~ :: Distance from top side of label to the printed text
|
279
|
+
- ~--bottom-pad=DIM~ :: Distance from bottom side of label to the printed text
|
280
|
+
- ~--left-pad=DIM~ :: Distance from left side of label to the printed text
|
281
|
+
- ~--right-pad=DIM~ :: Distance from right side of label to the printed text
|
282
|
+
- ~--v-pad=DIM~ :: Short for ~--top-pad=DIM~ and ~--bottom-pad~
|
283
|
+
- ~--h-pad=DIM~ :: Short for ~--left-pad=DIM~ and ~--right-pad~
|
284
|
+
- ~--pad=DIM~ :: Short for ~--top-pad=DIM~, ~--bottom-pad~, ~--left-pad=DIM~
|
285
|
+
and ~--right-pad~
|
286
|
+
|
287
|
+
*** Alignment
|
288
|
+
By default the label text is centered horizontally and vertically within the
|
289
|
+
label, but the following options allow you to alter that.
|
290
|
+
|
291
|
+
- ~--h-align=[left|center|right|justify]~ :: Horizontal alignment of text
|
292
|
+
within the label (default center);
|
293
|
+
- ~--v-align=[top|center|bottom]~ :: Vertical alignment of text within the
|
294
|
+
label (default center)
|
295
|
+
|
296
|
+
*** Fonts and styling
|
297
|
+
=labrat= provides a few simple mean for styling the label text. Note that all
|
298
|
+
of these apply to the whole label text: there is no provision yet for doing
|
299
|
+
in-line changes of font styles.
|
300
|
+
|
301
|
+
- ~--font-name=NAME~ :: Name of font to use, Times, Courier, or Helvetica
|
302
|
+
(default Helvetica);
|
303
|
+
- ~--font-size=NUM~ :: Size of font to use in points (default 12)
|
304
|
+
- ~--font-style=[normal|bold|italic|bold-italic]~ :: Style of font to use for
|
305
|
+
text (default normal)
|
306
|
+
|
307
|
+
*** Position Adjustment
|
308
|
+
Despite our best efforts, the vagaries of printer hardware, print drivers, and
|
309
|
+
cosmic rays, sometimes the text of the label is not positioned correctly
|
310
|
+
within the printable area of the label. These options allow you to nudge the
|
311
|
+
print area left or right, up or down a bit to compensate for any such
|
312
|
+
anomalies.
|
313
|
+
|
314
|
+
- ~-x, --delta-x=DIM~ :: Left-right adjustment (positive moves right, negative
|
315
|
+
left) of label text within the label print area.
|
316
|
+
- ~-y, --delta-y=DIM~ :: Up-down adjustment (positive moves up, negative
|
317
|
+
down) of label text within the label print area.
|
318
|
+
|
319
|
+
** Job Processing Options
|
320
|
+
The following options control the processing of labels by =labrat=.
|
321
|
+
|
322
|
+
*** Starting label
|
323
|
+
When printing onto a multi-label page, some of the labels may have already
|
324
|
+
been used. In that case, the ~--start-label~ option allows you to tell
|
325
|
+
=labrat= to start printing at some later label on the page. The label
|
326
|
+
positions are numbered from 1 up to the number of labels per page (i.e., rows
|
327
|
+
times columns) from left to right and down the page. If you want to print a
|
328
|
+
sheet that shows the label numbers, see the ~-T~ template option below.
|
329
|
+
|
330
|
+
- ~-S NUM~, ~--start-label=NUM~ :: Start printing at label number NUM (starting
|
331
|
+
at 1, left-to-right, top-to-bottom) within first page only. Later pages
|
332
|
+
always start at label 1.
|
333
|
+
|
334
|
+
This only affects the placement of the first label on the first page. Any
|
335
|
+
later pages always start on the first label position.
|
336
|
+
|
337
|
+
*** New line marker
|
338
|
+
You can embed a special text-sequence in the label text to indicate where a
|
339
|
+
line-break should occur. By default it is the sequence =++=. This means that
|
340
|
+
=labrat= will translate all occurrences of =++= in the text into a line-break,
|
341
|
+
even consecutive occurrences. There is no way to escape this in the text, so
|
342
|
+
if you want labels for various programming languages, you are going to have
|
343
|
+
difficulty printing a label with 'C++' in it. But you can change the marker
|
344
|
+
to something else with ~--nlsep~. This is especially helpful when you are
|
345
|
+
using the command-line to supply the label text since specifying line-breaks
|
346
|
+
on a shell command can be difficult. However note that this substitution
|
347
|
+
takes place even when reading label texts from a file or standard input.
|
348
|
+
|
349
|
+
- ~-n~, ~--nlsep=SEPARATOR~ :: Specify text to be translated into a line-break
|
350
|
+
(default '++')
|
351
|
+
|
352
|
+
*** Label separator
|
353
|
+
The only way to print more than one label from the command-line is to indicate
|
354
|
+
where one label ends and the next begins with a special marker in the
|
355
|
+
command-line arguments, by default the string ']*['. The text used for this
|
356
|
+
can be customized with this option.
|
357
|
+
|
358
|
+
- ~--label-sep=SEPARATOR~ :: Specify text that indicates the start of a new
|
359
|
+
label (default ']*[')
|
360
|
+
|
361
|
+
*** Number of copies
|
362
|
+
This option causes =labrat= to generate multiple copies of each label with all
|
363
|
+
the copies printed sequentially on the page.
|
364
|
+
|
365
|
+
- ~-c NUM~, ~--copies=NUM~ :: Number of copies of each label to generate.
|
366
|
+
|
367
|
+
*** Input and output files
|
368
|
+
**** Output file
|
369
|
+
By default, =labrat= generates all the labels into a single PDF file called
|
370
|
+
'labrat.pdf' in the current directory. You can specify a different output
|
371
|
+
file with the ~--out-file~ option.
|
372
|
+
|
373
|
+
- ~-o~, ~--out-file=FILENAME~ :: Put generated label in the given file
|
374
|
+
|
375
|
+
**** Command-line arguments
|
376
|
+
By default, =labrat= gets the text of the label from the non-option arguments
|
377
|
+
on the command-line. It combines all the non-option arguments and joins them
|
378
|
+
with a space between each argument. For example,
|
379
|
+
|
380
|
+
#+begin_example
|
381
|
+
$ labrat -c3 This is a 'single label' '++composed of all this' text --font-style=italic
|
382
|
+
#+end_example
|
383
|
+
|
384
|
+
prints three copies of a single label in italics with two lines, breaking at
|
385
|
+
the '++' marker, resulting in something like this:
|
386
|
+
|
387
|
+
#+begin_example
|
388
|
+
This is a single label
|
389
|
+
composed of all this text
|
390
|
+
#+end_example
|
391
|
+
|
392
|
+
Note that when the label text is specified on the command-line, ~labrat~ just
|
393
|
+
prints a single label. The only ways to get multiple labels is by (1) marking
|
394
|
+
a separation between labels with the ~--label-sep~ marker (']*[' by default)
|
395
|
+
or (2) using the ~-c~ (~--copies~) argument to get multiple copies of the
|
396
|
+
label text. These options can be combined as well. For example,
|
397
|
+
|
398
|
+
#+begin_example
|
399
|
+
$ labrat -c3 This is the 'first label' ']*[' 'And the rest ++ is the second' text --font-style=italic
|
400
|
+
#+end_example
|
401
|
+
|
402
|
+
will produce three copies of two separate labels:
|
403
|
+
|
404
|
+
#+begin_example
|
405
|
+
This is a the first label
|
406
|
+
|
407
|
+
This is a the first label
|
408
|
+
|
409
|
+
This is a the first label
|
410
|
+
|
411
|
+
And the rest
|
412
|
+
is the second
|
413
|
+
|
414
|
+
And the rest
|
415
|
+
is the second
|
416
|
+
|
417
|
+
And the rest
|
418
|
+
is the second
|
419
|
+
#+end_example
|
420
|
+
|
421
|
+
**** Specified input file
|
422
|
+
Rather than get the text from the non-option arguments on the command line,
|
423
|
+
you can use the ~--in-file~ option to specify that label texts are to be read
|
424
|
+
from the given file instead.
|
425
|
+
|
426
|
+
Each paragraph in the file constitutes a separate label. Line breaks within
|
427
|
+
the paragraphs are respected, though the ~--nlsep~ marker is still replaced
|
428
|
+
with additional line breaks. Any line starting with a ~#~ character is
|
429
|
+
considered a comment and is not included in the text of any label.
|
430
|
+
|
431
|
+
- ~-f~, ~--in-file=FILENAME~ :: Read labels from given file instead of
|
432
|
+
command-line
|
433
|
+
|
434
|
+
**** Standard input
|
435
|
+
Only if there are no non-option arguments and no ~in-file~ specified, =labrat=
|
436
|
+
acts as a filter and reads the label texts from standard input in same manner
|
437
|
+
as for a specified ~in-file~, treating each paragraph as a label text and
|
438
|
+
disregarding comments.
|
439
|
+
|
440
|
+
**** Template exception
|
441
|
+
Notwithstanding all of the above, if the ~-T~ (~--template~) option is given,
|
442
|
+
all label texts from the command-line, an ~in-file~, or standard input are
|
443
|
+
ignored and a template is generated.
|
444
|
+
|
445
|
+
*** Printing or viewing
|
446
|
+
By default, =labrat= prints the generated output file to the printer named
|
447
|
+
with the ~--printer~ option using the shell command specified in the
|
448
|
+
~--print-command~ option. But with the ~--view~ option, it will use the shell
|
449
|
+
command from ~--view-command~ to view the generated PDF file instead.
|
450
|
+
|
451
|
+
- ~-V~, ~--[no-]view~ :: View rather than print
|
452
|
+
|
453
|
+
*** Shell commands
|
454
|
+
By default, =labrat= uses the shell command:
|
455
|
+
#+begin_example
|
456
|
+
lpr -P %p %o
|
457
|
+
#+end_example
|
458
|
+
to print, and substitutes '%p' with the printer name and '%o' with the output
|
459
|
+
file name. But you can specify a different print command with the
|
460
|
+
~--print-command~ option. The printer name used in the substitution is by
|
461
|
+
default taken from the environment variable =LABRAT_PRINTER= if it is defined,
|
462
|
+
or from the environment variable =PRINTER= if it is defined and
|
463
|
+
=LABRAT_PRINTER= is not defined. If neither is defined, it defaults to the
|
464
|
+
name 'dymo'. But you can set the printer name with the ~--printer~ option in
|
465
|
+
any event.
|
466
|
+
|
467
|
+
- ~-p~, ~--printer=NAME~ :: Name of the label printer to print on
|
468
|
+
- ~-%~, ~--print-command=PRINTCMD~ :: Command to use for printing with %p for
|
469
|
+
printer name; %o for label file name
|
470
|
+
|
471
|
+
Likewise, =labrat= uses the shell command
|
472
|
+
#+begin_example
|
473
|
+
qpdfview --unique --instance labrat %o'
|
474
|
+
#+end_example
|
475
|
+
to launch the previewer when the ~--view~ or ~-V~ options are given. It also
|
476
|
+
'%o' with the output file name, but does not recognize '%p' as special. It is
|
477
|
+
very likely that you will want to configure this with the ~--view-command~
|
478
|
+
option to your liking.
|
479
|
+
|
480
|
+
- ~-:~, ~--view-command=VIEWCMD~ :: Command to use for viewing with %o for
|
481
|
+
label file name
|
482
|
+
|
483
|
+
*** Aids to testing label layouts
|
484
|
+
The following options are very useful if your are trying to configure the set
|
485
|
+
up for a new label type or otherwise trying to figure out a problem.
|
486
|
+
Normally, =labrat= does not print an outline for the labels, but if you are
|
487
|
+
testing things out on plain paper, it helps to know where =labrat= thinks the
|
488
|
+
boundaries of the labels are. That is what the ~--grid~ or ~-g~ options
|
489
|
+
provide.
|
490
|
+
|
491
|
+
- ~-g~, ~--[no-]grid~ :: Add grid lines to output
|
492
|
+
|
493
|
+
When trying to define a new label layout, it also helps to just see what a
|
494
|
+
single sheet of labels would look like. That is what the ~--template~ or ~-T~
|
495
|
+
option give you: it just prints an outline of where labels would be printed
|
496
|
+
but ignores any label text.
|
497
|
+
|
498
|
+
- ~-T~, ~--[no-]template~ :: Print a template of a page of labels and ignore
|
499
|
+
any content
|
500
|
+
|
501
|
+
Finally, =labrat= will print a lot of information about what it's doing with
|
502
|
+
the ~--verbose~ or ~-v~ option. The information is printed to the standard
|
503
|
+
error output stream.
|
504
|
+
|
505
|
+
- ~-v~, ~--[no-]verbose~ :: Run verbosely, that is, print out lots of
|
506
|
+
information about what =labrat= is doing as it processes the job.
|
507
|
+
|
508
|
+
** The Label Database and the label option
|
509
|
+
One of the nice things about =labrat= is that it comes with a database of
|
510
|
+
pre-defined label configurations for many standard labels, especially Avery
|
511
|
+
labels since they are kind enough to publish PDF templates for all their
|
512
|
+
products at [[https://www.avery.com/templates]].
|
513
|
+
|
514
|
+
*** Listing labels
|
515
|
+
You can get =labrat= to list all the labels it knows about with
|
516
|
+
#+begin_example
|
517
|
+
$ labrat --list-labels
|
518
|
+
#+end_example
|
519
|
+
|
520
|
+
Any users who create useful label definitions can propose them for inclusion
|
521
|
+
with =labrat's= distributed label database by filing a pull request at this
|
522
|
+
git repository.
|
523
|
+
|
524
|
+
*** System label database
|
525
|
+
Here for example is the definition for Avery 8987 labels from the system
|
526
|
+
database:
|
527
|
+
#+begin_example
|
528
|
+
avery8987:
|
529
|
+
page-width: 8.5in
|
530
|
+
page-height: 11in
|
531
|
+
rows: 10
|
532
|
+
columns: 3
|
533
|
+
top-page-margin: 15mm
|
534
|
+
bottom-page-margin: 16mm
|
535
|
+
left-page-margin: 10mm
|
536
|
+
right-page-margin: 10mm
|
537
|
+
row-gap: 6.3mm
|
538
|
+
column-gap: 13mm
|
539
|
+
landscape: false
|
540
|
+
#+end_example
|
541
|
+
|
542
|
+
Note that it restricts itself to page-level settings. It would be
|
543
|
+
inappropriate to, for example, include something like ~font-style~ in a
|
544
|
+
system-wide label definition, though such things can be useful in a user's
|
545
|
+
private label configuration.
|
546
|
+
|
547
|
+
*** Trying out a label definition
|
548
|
+
You can see the result of this definition by using =labrat's= ~--template~ and
|
549
|
+
~--view~ options, like this:
|
550
|
+
#+begin_example
|
551
|
+
$ labrat -T -V --label=avery8987
|
552
|
+
#+end_example
|
553
|
+
|
554
|
+
And if you want to see it with sample label text filled in, try the following:
|
555
|
+
#+begin_example
|
556
|
+
$ labrat -V -c30 --label=avery8987 'Four score and seven years ago++Our fathers brought forth'
|
557
|
+
#+end_example
|
558
|
+
|
559
|
+
*** Nesting label definitions
|
560
|
+
As it happens, Avery 8986 is laid out identically to Avery 8987, and the label
|
561
|
+
database makes an alias for it like this:
|
562
|
+
#+begin_example
|
563
|
+
avery8986:
|
564
|
+
label: avery8987
|
565
|
+
#+end_example
|
566
|
+
In other words, it defines the ~avery8986~ label with a nested ~--label~
|
567
|
+
option that simply refers to the ~avery8987~ entry.
|
568
|
+
|
569
|
+
*** Label database entries as configuration sets
|
570
|
+
This ability to use a label database definition as an alias for a whole set of
|
571
|
+
other configuration options allows you to add entries to your user-level label
|
572
|
+
database to collect useful sets of configuration settings under a name of your
|
573
|
+
choosing. Here for example, are entries from my user-level database at
|
574
|
+
=~/.config/labrat/labeldb.yml= file that define the configuration for file
|
575
|
+
folders and badges:
|
576
|
+
#+begin_example
|
577
|
+
ff:
|
578
|
+
label: duraready1034D
|
579
|
+
font-style: bold
|
580
|
+
font-size: 12pt
|
581
|
+
delta-x: -3mm
|
582
|
+
delta-y: 0.5mm
|
583
|
+
|
584
|
+
badge:
|
585
|
+
label: avery18662
|
586
|
+
font-style: bold
|
587
|
+
font-size: 18pt
|
588
|
+
#+end_example
|
589
|
+
|
590
|
+
With this, you can print a file folder label with:
|
591
|
+
#+begin_example
|
592
|
+
$ labrat --label=ff 'Four score and seven years ago++Our fathers brought forth'
|
593
|
+
#+end_example
|
594
|
+
|
595
|
+
And, if you want this to be your default label type, you can add to your user-level
|
596
|
+
config file, an entry like this:
|
597
|
+
#+begin_example
|
598
|
+
label:
|
599
|
+
ff
|
600
|
+
#+end_example
|
601
|
+
|
602
|
+
Now you can print the label without the ~--label~ option on the command-line:
|
603
|
+
#+begin_example
|
604
|
+
$ labrat 'Four score and seven years ago++Our fathers brought forth'
|
605
|
+
#+end_example
|
606
|
+
|
607
|
+
If you want to print badges, you have to specify the ~--label~ option explicitly on
|
608
|
+
the command-line:
|
609
|
+
#+begin_example
|
610
|
+
$ labrat -V -c14 --label=badge 'Daniel E. Doherty++(Amateur Programmer)'
|
611
|
+
#+end_example
|
612
|
+
|
613
|
+
*** A Caution about option order
|
614
|
+
Note that =labrat= processes options from the system config file, the user
|
615
|
+
config file, and the command-line strictly in order so that later settings
|
616
|
+
override earlier settings. For example, given the configuration above, where
|
617
|
+
~ff~ is your default label type, the following will not do what you expect:
|
618
|
+
|
619
|
+
#+begin_example
|
620
|
+
$ labrat --font-style=italic --label=ff 'Four score and seven years ago++Our fathers brought forth'
|
621
|
+
#+end_example
|
622
|
+
|
623
|
+
You expect the label to be printed in italic, but the ~--label=ff~ option in
|
624
|
+
effect inserts all the settings for label type ~ff~ at that point in the
|
625
|
+
command-line, and thus overrides the ~--font-style~ setting with its own,
|
626
|
+
namely ~--font-style=bold~ from the user-level label database.
|
627
|
+
|
628
|
+
To get this to work, you have to put the command-line setting after the
|
629
|
+
~--label=ff~ option in order for it to take effect:
|
630
|
+
#+begin_example
|
631
|
+
$ labrat --label=ff --font-style=italic 'Four score and seven years ago++Our fathers brought forth'
|
632
|
+
#+end_example
|
633
|
+
|
634
|
+
* Development
|
635
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then,
|
636
|
+
run `rake spec` to run the tests. You can also run `bin/console` for an
|
637
|
+
interactive prompt that will allow you to experiment.
|
638
|
+
|
639
|
+
To install this gem onto your local machine, run `bundle exec rake
|
640
|
+
install`.
|
641
|
+
|
642
|
+
* Contributing
|
643
|
+
Bug reports and pull requests are welcome on GitHub at
|
644
|
+
https://github.com/ddoherty03/labrat.
|
data/Rakefile
ADDED
data/TODO.org
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
1. Include aliases for labels in the db, or perhaps allow one label command to
|
2
|
+
include another label command, provided infinite recursion does not occur.
|
3
|
+
Perhaps check depth of reference?
|
4
|
+
2. Include a --list command to list all known label types.
|
5
|
+
3. Include verbose diagnostics for each phase of label production: read
|
6
|
+
configs (say which were found), read labeldb (say where found), read
|
7
|
+
command-line arguments (echo those found), echo non-opts argument.
|
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "labrat"
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
require "pry"
|
12
|
+
Pry.start
|
13
|
+
|
14
|
+
# require "irb"
|
15
|
+
# IRB.start(__FILE__)
|