labrat 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](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__)
|