Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2108e2cf15 | |||
| 8290870f06 | |||
| 9b970804fc | |||
| 2a789e30f8 | |||
| e619699660 | |||
| f7e35652a9 | |||
| d5fb872518 | |||
| 13d4047fe1 | |||
| 4f2de8a92c | |||
| 34b72ca384 | |||
| 4a0185df53 | |||
| cb2f687a6b | |||
| 0631c55c0f | |||
| caee5291ff | |||
| 9cc418c68f | |||
| 52096c0d63 | |||
| 33525a8c1d | |||
| da74709433 | |||
| d3e14c63c0 | |||
| 8e272c0bd8 | |||
| 9dc6776bb4 | |||
| d1ee78e58a | |||
| 06675f8314 | |||
| 226841fe38 | |||
| 6ad97b76dc | |||
| 1220c04f37 | |||
| e6673a0a24 | |||
| 993e1e460d | |||
| 73d90c28f8 | |||
| 6018daf56e |
@@ -0,0 +1,184 @@
|
||||
# Handoff: Packaging design spec approved — implementation plan pending
|
||||
|
||||
## Session Metadata
|
||||
- Created: 2026-04-29 09:55:34 UTC
|
||||
- Project: /home/claude/bin/sethLabels
|
||||
- Branch: main
|
||||
- Session duration: ~1 hour
|
||||
- Live URL: https://git.sethpc.xyz/Seth/sethLabels
|
||||
|
||||
### Recent Commits (for context)
|
||||
- d3e14c6 docs: refresh CLAUDE.md + IDEA.md for design-approved phase
|
||||
- 8e272c0 docs: add packaging design spec + decision log
|
||||
- 9dc6776 chore: add sethLabels deployment-fork scaffold
|
||||
- d1ee78e Fix incorrect font sizes (#321) ← upstream HEAD
|
||||
- 06675f8 Create template style guide and minor updates… ← upstream
|
||||
|
||||
The first three commits are sethLabels'; everything from `d1ee78e` back is upstream's history (preserved untouched per strict-zero policy — see Important Context below).
|
||||
|
||||
## Handoff Chain
|
||||
|
||||
- **Continues from**: [2026-04-29-125823-scaffold-only.md](./2026-04-29-125823-scaffold-only.md)
|
||||
- Previous title: sethLabels scaffolded — no code yet
|
||||
- **Supersedes**: None. The scaffold-only handoff documented an empty-dir state; this one documents the post-design-approval state.
|
||||
|
||||
> Review the previous handoff for full context before filling this one. The "scaffold-only" predecessor's "Suggested Next Steps" #1 (decide upstream-tracking strategy) and #5 (initialize git + push to Gitea) are now complete; #2 (verify upstream alive) and #3 (confirm Qt version) are also resolved during this session.
|
||||
|
||||
## Current State Summary
|
||||
|
||||
This session moved sethLabels from "scaffold-only, no upstream pulled" to "design-approved, ready for implementation plan." Three things happened in order: (1) upstream `j-evins/glabels-qt` was cloned in-place and pushed to Gitea as `main`, with all 24 upstream contributors' commit authorship preserved end-to-end; (2) the brainstorming skill ran a 6-question multiple-choice round to lock all packaging-strategy decisions; (3) the resulting design was written into a 398-line spec at `sethlabels-docs/specs/2026-04-29-packaging-design.md` and committed. No `scripts/` or `packaging/` code was written — that's the next session's job. The spec is the load-bearing artifact; everything else (CLAUDE.md, IDEA.md, DECISIONS.md) was updated to point at it.
|
||||
|
||||
The user explicitly chose option **(3) pause here** at session close, declining to invoke writing-plans this session. The spec is sufficient to resume cleanly; there are no in-progress edits or half-implemented states.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
**sethLabels is a deployment fork, not a real fork.** The discipline (locked as Invariant I1 in the spec) is **strict zero source patches** — no upstream-tracked file is ever edited. The only exception is `.gitignore` (allowlisted as a one-time scaffold-time touch). Every sethLabels addition lives in NEW files in NEW top-level directories:
|
||||
|
||||
- Already created: `CLAUDE.md`, `IDEA.md`, `DECISIONS.md`, `GITEA_API.md` (gitignored symlink), `.claude/handoffs/`, `sethlabels-docs/specs/`
|
||||
- Planned per spec: `scripts/` (build-deb, build-appimages, compute-version, check-no-upstream-edits, lib/), `packaging/` (deb-metadata.env, appimage-recipe.env, changelog.md), `README.sethlabels.md`
|
||||
|
||||
The "fork" is therefore best thought of as a **packaging repo with upstream's history embedded** — anyone can audit it instantly and confirm we changed nothing in the application itself.
|
||||
|
||||
**Upstream details discovered during the session:**
|
||||
- Qt version: **Qt6 6.2** (find_package at `CMakeLists.txt:119`)
|
||||
- CPack metadata: pre-wired at `CMakeLists.txt:84-104`; generators NOT pinned → `cpack -G DEB` and `cpack -G DragNDrop` selectable at command line with zero source change
|
||||
- Install rules: clean and FHS-compliant across all subdirs (`bin`, `share/icons/hicolor`, `share/applications`, `share/mime`, `share/metainfo`, `share/man/man1`, `share/glabels-qt/{templates,translations}`)
|
||||
- Desktop integration: `.desktop` file, AppStream metainfo, MIME XML, hicolor icon set already provided by upstream
|
||||
- Two binaries shipped: `glabels-qt` (GUI) + `glabels-batch-qt` (CLI for scripted/mail-merge use)
|
||||
- CI matrix exists for ubuntu-latest, ubuntu-22.04, windows-latest, macos-latest — but upstream doesn't publish binary releases ("Currently there are no self-hosted binary snapshot releases available" — upstream README). sethLabels exists to fill this gap.
|
||||
|
||||
## Critical Files
|
||||
|
||||
| File | Purpose | Relevance |
|
||||
|------|---------|-----------|
|
||||
| `sethlabels-docs/specs/2026-04-29-packaging-design.md` | THE design spec — 13 sections covering invariants, decisions, repo layout, build pipeline, release flow, brew tap, failure modes, smoke tests, glossary | **Must read before any implementation.** All design questions are answered here; do not re-derive. |
|
||||
| `DECISIONS.md` | Short-form decision log (6 settled choices + 13 rejected/deferred items) | Quick scan to check what's already been decided/rejected |
|
||||
| `CLAUDE.md` | Durable project instructions (refreshed this session) | Loaded on every session start; points at this handoff + the spec |
|
||||
| `IDEA.md` | Plain-language project brief (refreshed this session) | Read if scope feels unclear |
|
||||
| `CMakeLists.txt` (upstream root) | Defines Qt6 dep, CPack metadata, install rules | Read-only — strict-zero forbids edits. Reference for understanding what `cpack` and `linuxdeploy` will see. |
|
||||
| `.github/workflows/build-tests.yml` (upstream) | Upstream CI multi-platform build matrix | Reference for valid `apt install` deps + cmake invocation patterns when writing `scripts/lib/deps-debian.sh` |
|
||||
| `docs/BUILD-INSTRUCTIONS-LINUX.md` (upstream) | Upstream's manual build instructions | Reference for the `apt install` list + cmake flags; our `scripts/build-deb.sh` automates this |
|
||||
|
||||
## Key Patterns Discovered
|
||||
|
||||
- **Authorship preservation:** the gitea repo holds all 24 upstream contributors' commit authorship intact; the only Seth-authored commits are the sethLabels-specific additions (scaffold + spec + context-refresh). Verifiable via `git log --format='%an' origin/main | sort -u | wc -l` → 25 (24 upstream + Seth).
|
||||
- **Convention from sibling Seth projects** (`blind_chess`, `sethmux`, `kitty-web`, `mcp-gemma4`, `seth-orchestrator`): `GITEA_API.md` is gitignored (it's a local symlink to `~/bin/GITEA_API.md`); `.backup/` is gitignored; project-tracked files are `CLAUDE.md`, `IDEA.md`, `DECISIONS.md`, `.claude/handoffs/*.md`. sethLabels follows this convention but adds the strict-zero-policy gitignore section.
|
||||
- **Versioning convention:** `<upstream-tag>-seth<N>` (e.g., `3.99-master618-seth1`). Tag is `git describe --tags --abbrev=0 upstream/master`; `<N>` increments on re-package of the same upstream commit. See spec §D4 + §5.4.
|
||||
|
||||
## Tasks Finished
|
||||
|
||||
- [x] Cloned upstream `j-evins/glabels-qt` in-place; preserved all upstream commit authorship
|
||||
- [x] Created Gitea repo `git.sethpc.xyz/Seth/sethLabels` (default branch: `main`); pushed full history + scaffold commit
|
||||
- [x] Configured `upstream` remote → `github.com/j-evins/glabels-qt` for periodic rebases
|
||||
- [x] Added scaffold commit (`9dc6776`) with author `Seth Freiberg <seth@sethfreiberg.com>` containing CLAUDE.md, IDEA.md, DECISIONS.md, .claude/handoffs/, .gitignore additions
|
||||
- [x] Brainstormed all 6 packaging-strategy decisions: Linux format, macOS format, build infra, versioning, upstream-touch policy, package name
|
||||
- [x] Wrote design spec at `sethlabels-docs/specs/2026-04-29-packaging-design.md` (398 lines, 13 sections); self-reviewed and fixed 5 inline issues (FF/rebase wording, --peek removal, tag-fetch caller responsibility, T3 brittleness, working-tree drift in check-no-upstream-edits)
|
||||
- [x] Updated `DECISIONS.md` with 6 settled + 13 rejected/deferred decisions (all dated 2026-04-29)
|
||||
- [x] Refreshed `CLAUDE.md` "Current State" + "Conventions" sections; refreshed `IDEA.md` "Constraints / preferences"
|
||||
- [x] All 3 sethLabels commits pushed to Gitea immediately per the gitea-workflow convention
|
||||
|
||||
## Files Modified
|
||||
|
||||
| File | Changes | Rationale |
|
||||
|------|---------|-----------|
|
||||
| `.gitignore` | Appended sethLabels section (`.backup/`, `GITEA_API.md`, `.env*`, `.claude/handoffs/*.draft.md`) | Allowlisted exception to strict-zero (one-time scaffold touch) |
|
||||
| `CLAUDE.md` | NEW — project instructions | Created at scaffold time; refreshed this session for design-approved phase |
|
||||
| `IDEA.md` | NEW — project brief | Created at scaffold time; refreshed this session |
|
||||
| `DECISIONS.md` | NEW — populated with 6 settled + 13 rejected/deferred decisions | Tracks what was decided vs. explicitly rejected (per Seth's global persistence convention) |
|
||||
| `sethlabels-docs/specs/2026-04-29-packaging-design.md` | NEW — design spec | The design artifact this session produced |
|
||||
| `.claude/handoffs/2026-04-29-095534-spec-approved-pre-implementation.md` | NEW — this handoff | Session close artifact |
|
||||
|
||||
No upstream files were modified (verified by `git diff --name-only upstream/master..HEAD` — only allowlist entries appear).
|
||||
|
||||
## Decisions Made
|
||||
|
||||
| Decision | Options Considered | Rationale |
|
||||
|----------|-------------------|-----------|
|
||||
| Linux: `.deb` + AppImage | AppImage-only, .deb-only, both, Flatpak | `.deb` for Debian-family install ergonomics + AppImage for any-Linux portability. Flatpak too heavyweight for use case. See spec §D1. |
|
||||
| macOS: Homebrew tap, build-from-source | Unsigned .dmg, signed+notarized .dmg ($99/yr), brew tap, brew tap with cask | Brew tap eliminates macOS CI/signing/Apple Dev ID entirely. User's Mac builds from source on `brew install`. See spec §D2. |
|
||||
| Build infrastructure: manual local builds | Manual, Gitea Actions runner, GitHub Actions public, GitHub Actions private | Local feedback loop beats CI loop during iteration. Scripts in `scripts/` are canonical recipe; CI YAML at the public-flip will call them unmodified. See spec §D3. |
|
||||
| Versioning: `<upstream-tag>-seth<N>` | This vs. plain upstream tag, independent semver, date-based | Lineage-preserving + rebuild counter survives packaging-only fixes + sorts correctly under `dpkg --compare-versions`. See spec §D4. |
|
||||
| Upstream-touch policy: strict zero | Strict zero, permissive small patches, strict-zero-with-CMakeLists-carveout | CPack `-D` flags cover all needed metadata at build time → no edit required to package. See spec §D5. |
|
||||
| Package name: `glabels-qt` | This vs. `sethlabels` | Strict-zero forbids renaming the binary, so package name should match command name. sethLabels identity lives in repo name + version-string `-seth<N>` marker. See spec §D6. |
|
||||
| Spec/docs location: `sethlabels-docs/` (top-level new dir) | This vs. `docs/superpowers/specs/` (inside upstream's docs/) | Strict-zero spirit forbids polluting upstream namespaces, even with new files. Top-level new dir = cleanest fork boundary. |
|
||||
|
||||
## Immediate Next Steps
|
||||
|
||||
1. **Invoke `writing-plans` skill** with the spec at `sethlabels-docs/specs/2026-04-29-packaging-design.md` as input. The plan should produce an ordered, dependency-aware implementation sequence — likely something like: (a) scripts/lib/deps-debian.sh, (b) scripts/check-no-upstream-edits.sh, (c) scripts/compute-version.sh, (d) scripts/build-deb.sh + smoke test on a clean Debian 13 box, (e) scripts/build-appimages.sh + smoke tests, (f) packaging/ env files, (g) README.sethlabels.md, (h) homebrew tap repo + initial formula, (i) first end-to-end release dry run.
|
||||
2. **Address the 4 user-flagged review items** before or during plan execution:
|
||||
- §5.1 build dependency list — Seth may know Debian 13 quirks (e.g., `qt6-tools-dev-tools` vs `qt6-tools-dev` package naming)
|
||||
- §5.5 allowlist pattern — anything Seth wants to add that doesn't fit `scripts/`/`packaging/`/`sethlabels-docs/`?
|
||||
- §7.2 brew formula `:recommended` deps — `qrencode` and `zint` as recommended (default-on) vs required vs optional
|
||||
- §10 smoke test T5 — gate every release on a fresh-Debian-13-VM install test, or only on upstream-tag bumps?
|
||||
3. **Consider whether to spike Path A (Qt for WebAssembly)** later — Seth raised this as a hypothetical and we concluded it's "possible but not easy" because Qt's `QPrintSupport` doesn't work in WASM (would need to render-to-PDF and let user download). Not blocking, just flagged for future.
|
||||
|
||||
## Blockers / Open Questions
|
||||
|
||||
- None blocking. The 4 review items in step 2 above are open but optional — they can be addressed during plan execution as small fixups, not gating questions.
|
||||
|
||||
## Deferred Items
|
||||
|
||||
- **Windows packaging** — deferred per project brief. Upstream's NSIS support is intact and works for anyone who wants to build their own.
|
||||
- **Custom default templates baked into the package** — strict-zero forbids; user-specific templates can live in `~/.config/glabels-qt/templates/` or a future separate repo.
|
||||
- **Branding, icon, splash, or string changes** — strict-zero forbids. sethLabels is a packaging fork, not a rebrand.
|
||||
- **CI infrastructure (Gitea Actions / GitHub Actions runner)** — battle-test phase is manual local builds; CI is added at the eventual public-flip on GitHub.
|
||||
- **Distribution to Debian backports / PPA / Ubuntu universe** — requires Debian Developer mentorship + ongoing policy compliance work; not justified for current scope.
|
||||
- **Headless print-server CT** — mentioned in `IDEA.md` as "optional/later"; not in current spec scope.
|
||||
|
||||
## Important Context
|
||||
|
||||
**The strict-zero source-patch policy is not a guideline, it is the project's defining discipline.** Violating it means the project drifts from "deployment fork" toward "real fork," which breaks the trivial-rebase property that makes the whole approach work. The spec's Invariant I1 is enforced by `scripts/check-no-upstream-edits.sh` (to be implemented per spec §5.5). Any temptation to "just edit one upstream file to fix a packaging issue" should be resisted — the right move is either (a) pass via `cpack -D` flags or `linuxdeploy` config, or (b) upstream the fix as a PR to glabels-qt.
|
||||
|
||||
**The eventually-public-on-GitHub framing matters for build-host neutrality.** During battle-test, builds happen on steel141 (Seth's primary dev machine, Debian 13). At public-flip, builds move to GitHub Actions ubuntu-latest runners. The build scripts MUST work on a clean Debian 13 / Ubuntu LTS VM with nothing pre-installed beyond what `scripts/lib/deps-debian.sh` declares. Any steel141-specific path or tool dependency is a bug.
|
||||
|
||||
**Steel141 is a build host, NOT an install target.** Earlier session draft framed it as the deploy target — that was wrong, corrected during Q1. The artifacts ship to anyone running Debian-family Linux or macOS-with-brew.
|
||||
|
||||
**Authorship in git history is load-bearing.** All 24 upstream contributors' commits appear in `git log` with their original author/committer fields intact. Only sethLabels-specific commits (currently 3) carry Seth's authorship. This makes the fork's relationship to upstream provable end-to-end and is critical for the eventual public-fork narrative.
|
||||
|
||||
**The "scaffold commit" is the only sethLabels commit on top of upstream/master.** Currently `9dc6776 chore: add sethLabels deployment-fork scaffold`. Two more commits exist (`8e272c0` spec + `d3e14c6` CLAUDE.md/IDEA.md refresh) but they only touch sethLabels-namespaced files. The number of commits on top of upstream will grow; what matters is that all of them honor strict-zero.
|
||||
|
||||
## Assumptions Made
|
||||
|
||||
- **The user picked `glabels-qt` as the package name** (Q6 → α) intending the binary, brew formula, and `.deb` package to all share the name. If a future Debian official `glabels-qt` package emerges, the version-string `-seth<N>` marker will dominate the sort, but a name conflict could be revisited.
|
||||
- **The user has Homebrew on the macOS machines they intend to install on.** The brew-tap approach assumes a technical user; if a non-technical macOS user enters scope, signed-DMG would have to be reconsidered.
|
||||
- **The user's scaffold commit (Author: Seth Freiberg <seth@sethfreiberg.com>) was set explicitly via `git config user.email seth@sethfreiberg.com` for this repo only.** The global git identity on steel141 is `Mortdecai` (a bot identity). Future commits in this repo from Claude Code should use the same Seth identity to maintain authorship consistency. The per-repo `.git/config` is already set; new agents inherit it automatically.
|
||||
|
||||
## Potential Gotchas
|
||||
|
||||
- **Don't run a non-rebase pull from upstream.** `git pull upstream master` (without `--rebase`) would create a merge commit, breaking linear history and complicating future strict-zero enforcement. The release flow's step 2 (spec §6) says `git rebase upstream/master`, which is correct.
|
||||
- **`compute-version.sh` reads local tag database.** If invoked outside the release flow without a fresh `git fetch --all --tags`, it can produce a stale `<N>` value. Spec §5.4 calls this out, but it's easy to miss when running scripts manually during development.
|
||||
- **AppImage builds need `linuxdeploy` and `linuxdeploy-plugin-qt` from GitHub releases — neither is apt-installable.** `scripts/lib/linuxdeploy.sh` (to be written) handles bootstrap to a script-local cache. The cache directory must be added to `.gitignore`.
|
||||
- **`dpkg-shlibdeps` (CPack's `SHLIBDEPS=ON`) sometimes mis-detects runtime deps** — particularly with optional Qt6 plugins. Mitigation in spec §F8: smoke-test install on a clean Debian 13 VM (T5).
|
||||
- **`brew tap` from non-GitHub URLs requires the explicit URL form.** Initial install is `brew tap seth/tap https://git.sethpc.xyz/Seth/homebrew-tap.git`, not `brew tap seth/tap`. This is documented in spec §7.3 but easy to forget when writing the brew tap README.
|
||||
- **Don't add `superpowers/` paths under `docs/`.** The brainstorming skill's default spec location is `docs/superpowers/specs/`, but `docs/` is an upstream directory, so we use `sethlabels-docs/specs/` instead. This was caught and corrected mid-session.
|
||||
|
||||
## Environment State
|
||||
|
||||
### Tools/Services Used
|
||||
|
||||
- **gitea CLI** (`~/bin/gitea`) — used for `gitea create sethLabels`, `gitea remote sethLabels`. Token loaded from `~/.config/gitea/token`. Documented in `~/bin/GITEA_API.md` (symlinked into project but gitignored).
|
||||
- **git** — local tooling for clone, fetch, commit, push, tag. Per-repo identity set to `Seth Freiberg <seth@sethfreiberg.com>` to override the global `Mortdecai` bot identity.
|
||||
- **curl + python3** — used for Gitea API calls to verify `default_branch=main` post-push.
|
||||
|
||||
### Active Processes
|
||||
|
||||
- None. No background services were started or left running. No long-running shells.
|
||||
|
||||
### Environment Variables
|
||||
|
||||
- `HOMELAB_PASSWORD` — referenced by `~/bin/CLAUDE.md` for SSH access, NOT used in this session.
|
||||
- No other env vars set or required for the current state.
|
||||
|
||||
## Related Resources
|
||||
|
||||
- **Gitea repo:** https://git.sethpc.xyz/Seth/sethLabels (default branch `main`)
|
||||
- **Spec:** [`sethlabels-docs/specs/2026-04-29-packaging-design.md`](../../sethlabels-docs/specs/2026-04-29-packaging-design.md) — read this before any implementation
|
||||
- **Decision log:** [`DECISIONS.md`](../../DECISIONS.md) — short-form
|
||||
- **Predecessor handoff:** [`2026-04-29-125823-scaffold-only.md`](./2026-04-29-125823-scaffold-only.md) — the empty-scaffold state we resumed from
|
||||
- **Upstream:** https://github.com/j-evins/glabels-qt (j-evins is Jaye Evins of glabels.org)
|
||||
- **Upstream README packaging gap:** the line we're filling — *"Currently there are no self-hosted binary snapshot releases available… I encourage you to try building the code yourself."*
|
||||
- **Sibling Seth projects with similar conventions:** `~/bin/blind_chess/` (handoff structure reference), `~/bin/sethmux/` (gitignore convention)
|
||||
|
||||
---
|
||||
|
||||
**Security Reminder**: Validated via `validate_handoff.py` post-write. No secrets present.
|
||||
@@ -0,0 +1,73 @@
|
||||
# Handoff: sethLabels scaffolded — no code yet
|
||||
|
||||
## Session Metadata
|
||||
|
||||
- Created: 2026-04-29 12:58:23 UTC
|
||||
- Project: /home/claude/bin/sethLabels
|
||||
- Branch: n/a (no git repo yet)
|
||||
- Session duration: ~5 min
|
||||
- Live URL: n/a
|
||||
|
||||
## Handoff Chain
|
||||
|
||||
- **Continues from:** None — this is the project's first handoff.
|
||||
- **Supersedes:** None.
|
||||
|
||||
## Current State Summary
|
||||
|
||||
Project directory scaffolded per `~/bin/CREATE_PROJECT.md` as a deployment fork of upstream [glabels-qt](https://github.com/j-evins/glabels-qt). No code has been pulled, no git repo initialized, no Gitea repo created. Only the `~/bin/`-convention files exist:
|
||||
|
||||
```
|
||||
sethLabels/
|
||||
├── CLAUDE.md durable project instructions
|
||||
├── DECISIONS.md empty decision log (template-derived, header set)
|
||||
├── GITEA_API.md symlink → ~/bin/GITEA_API.md
|
||||
├── IDEA.md plain-language brief
|
||||
└── .claude/handoffs/
|
||||
└── 2026-04-29-125823-scaffold-only.md (this file)
|
||||
```
|
||||
|
||||
Phase: **ideation**. Nothing is running anywhere. No upstream commit pinned. No build attempted.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
This is a *deployment fork* — the discipline is to keep the diff against `j-evins/glabels-qt` master surgical so we can rebase periodically without pain. Anything we add should be additive (new files: deploy scripts, packaging recipes, Seth-specific templates) rather than invasive edits to upstream source. If we need to patch upstream code, prefer a thin patch series we can replay.
|
||||
|
||||
Stack is Qt + CMake + C++ (GPL-3.0). Target host is **steel141** (Debian 13). A future option is a headless print-server CT, but that's not part of this scaffold's scope.
|
||||
|
||||
## Critical Files
|
||||
|
||||
| File | Purpose | Relevance |
|
||||
|------|---------|-----------|
|
||||
| `~/bin/sethLabels/IDEA.md` | Plain-language brief — why this fork exists | Read first if upstream choice or scope feels unclear |
|
||||
| `~/bin/sethLabels/CLAUDE.md` | Durable project instructions | Loaded every session |
|
||||
| `~/bin/sethLabels/DECISIONS.md` | Empty — populate as architectural choices land | Write to when locking in upstream-pin strategy, Qt5-vs-Qt6, etc. |
|
||||
| `~/bin/CREATE_PROJECT.md` | Recipe used to scaffold this | Reference if future projects need the same shape |
|
||||
|
||||
## Suggested Next Steps (ordered)
|
||||
|
||||
The user said *just scaffold + handoff* — none of this was attempted. Pick up here next session:
|
||||
|
||||
1. **Decide upstream-tracking strategy.** Options:
|
||||
- (a) Clone `j-evins/glabels-qt` into this dir, push to Gitea as `sethLabels`, add upstream as a remote, merge from `upstream/master` periodically.
|
||||
- (b) Keep upstream as a git submodule and layer deployment glue around it.
|
||||
Record the choice in `DECISIONS.md` before pulling code.
|
||||
2. **Verify upstream is alive.** Check `j-evins/glabels-qt` for last commit date + open issues; this is a fork of mate-desktop's glabels lineage and forks-of-forks have a tendency to bitrot. If `j-evins` is stale, the real upstream might be elsewhere — re-evaluate before forking.
|
||||
3. **Confirm Qt version.** Upstream's `CMakeLists.txt` will say Qt5 or Qt6. Debian 13 ships both — pick whichever upstream targets.
|
||||
4. **Build it once on steel141** to establish the known-good build recipe. Capture exact `apt install` deps and CMake invocation in a `BUILD.md` (or in `CLAUDE.md` if short).
|
||||
5. **Initialize git + push to Gitea.** `gitea create sethLabels` → `gitea remote sethLabels` → `gitea push`. Use a descriptive commit message like `init: scaffold + import upstream glabels-qt @ <sha>`.
|
||||
6. **Only then** start any deployment-specific work (templates, packaging, install scripts).
|
||||
|
||||
## Open Questions
|
||||
|
||||
- Is `j-evins/glabels-qt` actually the right upstream, or should we be tracking a different fork? (See "verify upstream is alive" above.)
|
||||
- Does Seth want a `.deb` package, an AppImage, or just a built binary in `/usr/local/bin`?
|
||||
- Is there a printer model or label-stock library we should pre-load as default templates?
|
||||
|
||||
These don't block scaffolding — they block the *first real coding session*. Ask before implementing.
|
||||
|
||||
## Risks / Watch-outs
|
||||
|
||||
- Upstream is GPL-3.0. Any code we add that links against it must also be GPL-3.0-compatible. Don't accidentally relicense.
|
||||
- "Deployment fork" failure mode: scope creep into a real fork. If we find ourselves writing >100 lines of upstream-source patches, that's a signal to either upstream the change or rethink whether we actually want a fork.
|
||||
- glabels-qt is one of those projects with multiple competing forks (j-evins, jimevins-original, mate-desktop's glabels-3, etc.). Pin the upstream we choose explicitly in `DECISIONS.md` so we don't drift.
|
||||
+22
@@ -40,3 +40,25 @@ TEST-DATA
|
||||
SAV*
|
||||
OLD*
|
||||
|
||||
# === sethLabels (deployment fork) additions ===
|
||||
# Local backup snapshots (per ~/.claude/CLAUDE.md safety rule)
|
||||
.backup/
|
||||
|
||||
# Local-only symlink to ~/bin/GITEA_API.md (target is outside the repo)
|
||||
GITEA_API.md
|
||||
|
||||
# Secrets / env
|
||||
.env
|
||||
.env.*
|
||||
|
||||
# Handoff drafts (operator scratch — final handoffs ARE committed)
|
||||
.claude/handoffs/*.draft.md
|
||||
|
||||
# Build outputs (out-of-tree)
|
||||
build/
|
||||
|
||||
# linuxdeploy + plugin caches (downloaded by scripts/lib/linuxdeploy.sh on first AppImage build)
|
||||
scripts/.cache/
|
||||
|
||||
# Locally-produced AppImage artifacts
|
||||
*.AppImage
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# sethLabels
|
||||
|
||||
> Deployment fork of glabels-qt — Qt label designer/printer, packaged for Seth's homelab.
|
||||
|
||||
## Start Here
|
||||
|
||||
**Read the latest handoff first:** `.claude/handoffs/` (most recent file).
|
||||
It has session state, in-progress work, and ordered next steps.
|
||||
|
||||
Then check `IDEA.md` for the project brief and `DECISIONS.md` for settled choices.
|
||||
|
||||
## Project Identity
|
||||
|
||||
sethLabels is a thin deployment fork of [glabels-qt](https://github.com/j-evins/glabels-qt). Upstream is the real project — this fork's job is to keep a known-good build recipe, any deployment glue (packaging, install paths, default templates), and any local patches in one place, while staying close enough to upstream `master` that periodic rebases stay cheap.
|
||||
|
||||
## Current State
|
||||
|
||||
- **Phase:** design-approved, pre-implementation. Spec written and committed; no scripts/packaging code yet.
|
||||
- **Repo:** live at `git.sethpc.xyz/Seth/sethLabels` (default branch `main`). Upstream `j-evins/glabels-qt` configured as `upstream` remote for periodic rebases. Eventually-public on GitHub once battle-tested.
|
||||
- **Deploy target:** Debian-family Linux (`.deb` + AppImage) + macOS via Homebrew tap (build-from-source). Steel141 is a build host, not a deploy target. Windows deferred.
|
||||
- **Upstream:** https://github.com/j-evins/glabels-qt (GPL-3.0, Qt6 6.2 + CMake + C++)
|
||||
- **Design spec:** `sethlabels-docs/specs/2026-04-29-packaging-design.md` — all packaging decisions (artifacts, versioning, build pipeline, release flow, brew tap) live here. Read this before touching `scripts/` or `packaging/`.
|
||||
|
||||
## Conventions
|
||||
|
||||
- This is a **deployment fork**, not a real fork. The discipline is **strict zero source patches** — no upstream-tracked file is ever edited. All sethLabels content lives in NEW top-level dirs (`scripts/`, `packaging/`, `sethlabels-docs/`, `.claude/`). Allowlist exception: `.gitignore` (one-time scaffold-time touch).
|
||||
- Enforced by `scripts/check-no-upstream-edits.sh` (to be implemented per spec §5.5).
|
||||
- Preserve upstream license (GPL-3.0) and copyright headers — strict-zero handles this automatically by never touching upstream files.
|
||||
- Versioning: `<upstream-tag>-seth<N>` (e.g., `3.99-master618-seth1`). See spec §D4 + §5.4.
|
||||
- See `~/bin/CLAUDE.md` for global homelab conventions (gitea CLI, conventional commits, credentials handling).
|
||||
@@ -0,0 +1,40 @@
|
||||
# DECISIONS.md — sethLabels Decision Log
|
||||
|
||||
Project-specific decisions. For global/cross-cutting decisions, see `~/bin/DECISIONS.md`.
|
||||
|
||||
Format: `YYYY-MM-DD: <decision> — <why>`
|
||||
|
||||
## Architecture
|
||||
|
||||
- **2026-04-29: Strict-zero source patches.** Never edit any upstream-tracked file. All sethLabels content lives in new files in new top-level directories at the repo root. — Makes `git pull upstream master --ff-only` succeed forever; rebase friction = 0. Allowlist exception: `.gitignore` (one-time scaffold-time touch). Enforced by `scripts/check-no-upstream-edits.sh`. See spec §I1, §D5.
|
||||
- **2026-04-29: Eventual-public fork.** sethLabels stays on Gitea during battle-test, then promotes to a formally public fork on GitHub once the build/release pipeline is solid. — Drives spec invariants: build host must be a clean Debian 13 / Ubuntu LTS box (not steel141-specific); brew tap source URL must be cleanly flippable Gitea→GitHub; CI is added at the flip, not before.
|
||||
- **2026-04-29: Linux artifacts = `.deb` + AppImage; macOS via Homebrew tap (build from source).** — `.deb` for Debian-family install ergonomics, AppImage for portability to non-Debian Linux. Brew tap eliminates macOS CI/signing/$99 Apple Dev ID entirely; users' Macs build from source. See spec §D1, §D2.
|
||||
- **2026-04-29: Build infrastructure = manual local builds during battle-test.** Shell scripts under `scripts/` are the canonical build recipe; CI YAML at the public-flip will call those scripts unmodified. — Local feedback loop beats CI loop during iteration on packaging. Defers infra cost. See spec §I3, §D3.
|
||||
- **2026-04-29: Versioning = `<upstream-tag>-seth<N>`.** E.g., `3.99-master618-seth1`. — Lineage-preserving; rebuild counter survives packaging-only fixes; sorts correctly under `dpkg --compare-versions`. See spec §D4.
|
||||
- **2026-04-29: Package name = `glabels-qt`.** Same name as upstream binary, brew formula, and the command users run. — sethLabels identity lives at repo level + version-string `-seth<N>` marker, not in the package name. Avoids confusing identity-split between package name and binary name. See spec §D6.
|
||||
|
||||
## Implementation
|
||||
|
||||
- **2026-04-29: macOS = no CI required.** Homebrew tap with build-from-source means no macOS runner, no Apple Developer ID, no notarization pipeline. Tap repo (`git.sethpc.xyz/Seth/homebrew-tap`) is one ~30-line Ruby file. — Major simplification; Mac users build locally on first install (~5–10 min), all subsequent installs are version pin bumps to the tap formula.
|
||||
- **2026-04-29: Debian-family is the install target, not steel141.** Build host happens to be steel141 (or any clean Debian/Ubuntu box); install target is generic Debian-family. — No homelab paths, hostnames, or assumptions in scripts. Reproducibility on a fresh VM is the bar.
|
||||
- **2026-04-29: Spec, scripts, and packaging metadata live in NEW top-level dirs.** `sethlabels-docs/`, `scripts/`, `packaging/`. NOT in upstream's `docs/` directory. — Clear fork boundary; preserves strict-zero spirit (don't pollute upstream namespaces with our content).
|
||||
|
||||
## Deferred / Rejected
|
||||
<!-- Decisions NOT to do something are just as valuable -- prevents re-proposing rejected ideas -->
|
||||
|
||||
- **Rejected 2026-04-29: AppImage-only Linux distribution.** — Loses native Debian package manager integration (`apt remove`, dependency tracking) on the primary target distros.
|
||||
- **Rejected 2026-04-29: `.deb`-only Linux distribution.** — Loses portability to non-Debian Linux (RHEL/Fedora/Arch users couldn't install without recompiling).
|
||||
- **Rejected 2026-04-29: Flatpak.** — Sandbox runtime requirement + manifest complexity overkill for a personal-use packaging fork.
|
||||
- **Rejected 2026-04-29: Signed + notarized macOS `.dmg` (Apple Developer ID).** — $99/year recurring + notarization CI complexity not justified for a build-from-source Homebrew alternative.
|
||||
- **Rejected 2026-04-29: Unsigned macOS `.dmg`.** — Gatekeeper friction (right-click → Open) is a poor first-run experience compared to brew install.
|
||||
- **Rejected 2026-04-29: Gitea Actions self-hosted runner during battle-test.** — Homelab CT spin-up + workflow YAML setup not justified before public-flip; manual builds are faster to iterate on.
|
||||
- **Rejected 2026-04-29: Public GitHub Actions from day one.** — Skips the "battle-test in private" intent; want to validate the pipeline before going public.
|
||||
- **Rejected 2026-04-29: Plain upstream-tag versioning (no `-seth<N>` marker).** — No way to distinguish v1 of the `.deb` from v2 after a packaging fix; would have to lie about which upstream commit the package contains.
|
||||
- **Rejected 2026-04-29: Independent semver (`0.1.0`, `0.2.0`).** — Loses upstream-lineage info from the version string; users couldn't tell which glabels-qt commit they have without checking the changelog.
|
||||
- **Rejected 2026-04-29: Date-based versioning (`2026.04.29`).** — Loses both upstream-lineage and rebuild-counter information.
|
||||
- **Rejected 2026-04-29: Permissive small-patches policy on upstream files.** — Creates rebase friction on each `git pull upstream master`; even a one-file CMakeLists carve-out turned out to be unnecessary since CPack `-D` flags cover all needed metadata at build time.
|
||||
- **Rejected 2026-04-29: Package name `sethlabels`.** — Strict-zero policy forbids renaming the executable, so `apt install sethlabels` then running `glabels-qt` would split package identity from binary identity. Confusing.
|
||||
- **Deferred: Windows packaging.** — Per project brief. Upstream's NSIS support is intact; can be revisited later. Not blocking macOS+Linux delivery.
|
||||
- **Deferred: Custom default templates baked into the package.** — Strict-zero forbids; user-specific templates can live in `~/.config/glabels-qt/templates/` or a separate repo if/when needed.
|
||||
- **Deferred: Branding, icon, splash, or string changes.** — Strict-zero forbids. sethLabels is a packaging fork, not a rebrand.
|
||||
- **Deferred: Distribution to Debian backports / PPA / Ubuntu universe.** — Requires Debian Developer mentorship + ongoing policy compliance work; not justified for current scope.
|
||||
@@ -0,0 +1,21 @@
|
||||
# IDEA.md — Project Idea
|
||||
|
||||
## What is this?
|
||||
|
||||
sethLabels is a deployment fork of [glabels-qt](https://github.com/j-evins/glabels-qt) — a Qt-based desktop application for designing and printing labels, business cards, and similar small-format documents (with CSV mail-merge and barcode support).
|
||||
|
||||
The fork exists to layer Seth's deployment-specific concerns (packaging, install paths, default templates, branding, any local patches) on top of upstream without forking the whole project lifecycle. Goal is to keep the diff small enough to rebase onto upstream `master` periodically.
|
||||
|
||||
## Problem it solves
|
||||
|
||||
Need a reliable, scriptable label designer/printer for homelab + household use (shipping labels, equipment tags, drive labels for the tank pool, cable labels, etc.). Upstream glabels-qt is solid but has no published Debian 13 / current-Ubuntu binaries and the build needs some hand-holding. This fork bakes a known-good build recipe + any local templates + deployment scripts into one repo.
|
||||
|
||||
## Constraints / preferences
|
||||
|
||||
- **Upstream:** https://github.com/j-evins/glabels-qt (track this, don't drift). The glabels.org team are the real authors — strict-zero source-patch policy preserves their attribution end-to-end.
|
||||
- **Stack:** Qt6 6.2 + CMake + C++ (confirmed by reading upstream `CMakeLists.txt:119`).
|
||||
- **Target install hosts:** any Debian-family Linux (Debian 13 / Ubuntu LTS) for `.deb` + AppImage; any macOS for Homebrew tap. Steel141 is a *build host*, not a deploy target. CT for headless print serving optional/later. Windows deferred.
|
||||
- **Branding/customization:** zero — this is a packaging fork, not a rebrand. Strict-zero policy forbids icon/string/UI edits.
|
||||
- **License:** glabels-qt is GPL-3.0 — preserved automatically (we never touch upstream files).
|
||||
- **Repo:** live at `git.sethpc.xyz/Seth/sethLabels`. Eventually-public on GitHub once the build/release pipeline is battle-tested.
|
||||
- **Eventual public-flip:** when promoted to a formal public fork on GitHub, brew tap source URL flips Gitea→GitHub (one-line tap formula edit), and CI is added via GitHub Actions calling the same `scripts/` shell scripts unmodified.
|
||||
@@ -34,13 +34,14 @@ There are currently no official releases of gLabels 4.
|
||||
|
||||
Currently there are no self-hosted binary snapshot releases available. I plan to make these available again once 4.0 is more imminent. In the mean time, I encourage you to try building the code yourself.
|
||||
|
||||
Some third-party packages may be available available:
|
||||
Some third-party packages may be available:
|
||||
|
||||
|
||||
| Platform | Files | Notes |
|
||||
|:----------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------|
|
||||
| Archlinux | [Archlinux User Repository Page](https://aur.archlinux.org/packages/glabels-qt-git/) | Maintained by [Maud Spierings](https://github.com/SpieringsAE) |
|
||||
| Ubuntu | [PPA Page](https://code.launchpad.net/~krisives/+archive/ubuntu/glabels-qt) | Maintained by [Kristopher Ives](https://github.com/krisives) |
|
||||
| Fedora | [Copr Repository Page](https://copr.fedorainfracloud.org/coprs/mariobl/glabels-qt/) | Maintained by [Mario Blättermann](https://github.com/mariobl) |
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
# sethLabels
|
||||
|
||||
> Deployment fork of [glabels-qt](https://github.com/j-evins/glabels-qt) — Qt6
|
||||
> label designer / printer, packaged for Debian-family Linux and macOS.
|
||||
|
||||
This is **not** a code fork. The upstream application is unchanged; sethLabels
|
||||
exists solely to publish installable binary artifacts that upstream explicitly
|
||||
does not provide ("Currently there are no self-hosted binary snapshot releases
|
||||
available… I encourage you to try building the code yourself" — upstream README).
|
||||
|
||||
For the application itself — what it does, screenshots, full feature list — see
|
||||
the upstream [`README.md`](README.md).
|
||||
|
||||
## Install
|
||||
|
||||
### Debian / Ubuntu (`.deb`)
|
||||
|
||||
Download the latest `.deb` from the [releases page](https://git.sethpc.xyz/Seth/sethLabels/releases),
|
||||
then:
|
||||
|
||||
```
|
||||
sudo apt install ./glabels-qt_<VERSION>_amd64.deb
|
||||
glabels-qt --version
|
||||
```
|
||||
|
||||
### Any Linux (AppImage)
|
||||
|
||||
Download `sethlabels-gui-<VERSION>-x86_64.AppImage` from the [releases page](https://git.sethpc.xyz/Seth/sethLabels/releases),
|
||||
make it executable, and run it:
|
||||
|
||||
```
|
||||
chmod +x sethlabels-gui-<VERSION>-x86_64.AppImage
|
||||
./sethlabels-gui-<VERSION>-x86_64.AppImage
|
||||
```
|
||||
|
||||
A separate `sethlabels-batch-<VERSION>-x86_64.AppImage` provides the CLI for
|
||||
scripted / mail-merge use.
|
||||
|
||||
### macOS (Homebrew)
|
||||
|
||||
```
|
||||
brew tap seth/tap https://git.sethpc.xyz/Seth/homebrew-tap.git
|
||||
brew install seth/tap/glabels-qt
|
||||
```
|
||||
|
||||
The explicit URL form is needed because brew defaults to GitHub for tap names.
|
||||
First install builds Qt6 + glabels-qt from source (~5–10 min one-time cost; see
|
||||
spec §D2). Subsequent updates are a fast `brew upgrade`.
|
||||
|
||||
## Build from source
|
||||
|
||||
If you'd rather build the artifacts yourself instead of downloading a release:
|
||||
|
||||
```
|
||||
git clone https://git.sethpc.xyz/Seth/sethLabels.git
|
||||
cd sethLabels
|
||||
./scripts/lib/deps-debian.sh # check / install build deps
|
||||
./scripts/build-deb.sh # → build/deb/glabels-qt_*.deb
|
||||
./scripts/build-appimages.sh # → sethlabels-{gui,batch}-*.AppImage
|
||||
```
|
||||
|
||||
See [`scripts/README.md`](scripts/README.md) for full operator docs.
|
||||
|
||||
## How this fork works
|
||||
|
||||
sethLabels is a **deployment fork**: every sethLabels addition lives in NEW
|
||||
files in NEW top-level directories (`scripts/`, `packaging/`,
|
||||
`sethlabels-docs/`, `tests-impl/`, plus this file). Upstream files are never
|
||||
edited. The single allowlisted exception is `.gitignore`. This discipline is
|
||||
enforced by `scripts/check-no-upstream-edits.sh`.
|
||||
|
||||
The `<upstream-tag>-seth<N>` versioning preserves the upstream-lineage in every
|
||||
artifact. Periodic `git rebase upstream/master` is conflict-free by construction.
|
||||
|
||||
## Spec & decisions
|
||||
|
||||
- [Design spec](sethlabels-docs/specs/2026-04-29-packaging-design.md) — invariants, decisions, build pipeline, failure modes
|
||||
- [Decision log](DECISIONS.md) — settled choices + rejected alternatives
|
||||
- [Project brief](IDEA.md) — plain-language motivation
|
||||
|
||||
## License
|
||||
|
||||
The upstream code is licensed under [GPL-3.0](LICENSE). sethLabels-specific
|
||||
files (everything in the dirs listed above, plus this file) are licensed under
|
||||
the same terms.
|
||||
|
||||
## Upstream
|
||||
|
||||
- Upstream: https://github.com/j-evins/glabels-qt (Jaye Evins / glabels.org)
|
||||
- This fork: https://git.sethpc.xyz/Seth/sethLabels
|
||||
- Brew tap: https://git.sethpc.xyz/Seth/homebrew-tap
|
||||
@@ -26,7 +26,7 @@ How To Contribute to gLabels
|
||||
|
||||
### Would you like to submit new product templates?
|
||||
|
||||
* Before submitting, please read [PRODUCT-TEMPLATES.md](PRODUCT-TEMPLATES.md) located in this directory.
|
||||
* Before submitting, please read [PRODUCT-TEMPLATES.md](PRODUCT-TEMPLATES.md) and [TEMPLATE-STYLE.md](TEMPLATE-STYLE.md) located in this directory.
|
||||
|
||||
* [Open an issue](https://github.com/j-evins/glabels-qt/issues/new) and attach your completed product template file(s).
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
Manually Creating Product Templates
|
||||
===================================
|
||||
|
||||
This document is a reference for manually creating *gLabels* product templates.
|
||||
This document is a reference for manually creating *gLabels* product templates. See
|
||||
[TEMPLATE-STYLE.md](TEMPLATE-STYLE.md) located in this directory for style guidelines
|
||||
for product template submissions.
|
||||
|
||||
*gLabels* searches for templates in several locations as described here:</p>
|
||||
|
||||
@@ -83,7 +85,7 @@ Property | Type | Description
|
||||
*_description* | string | Translatable description of stationery product. Used in predefined labels instead of description.
|
||||
*width* | distance | Page width. Only valid if `size="other"` or `size="roll"`.
|
||||
*height* | distance | Page height. Only valid if `size="other"`. Value is ignored if `size="roll"`.
|
||||
*equiv* | string | Equivalent part number. If this property is present, the template is a clone of another template of the same brand. The template will inherit all properties, except brand and name from the other template. This equiv property must refer to a previously defined template - *gLabels* does not currently support forward references.
|
||||
*equiv* | string | Equivalent part number. If this property is present, the template is a clone of another template of the same brand. The template will inherit all properties, except *part* from the other template. This equiv property must refer to a previously defined template - *gLabels* does not currently support forward references.
|
||||
|
||||
### Guidelines for Creating Product Descriptions
|
||||
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
gLabels Product Template Style Guide
|
||||
====================================
|
||||
|
||||
This file describes the prefered style for product template submissions. See
|
||||
[PRODUCT-TEMPLATES.md](PRODUCT-TEMPLATES.md) located in this directory for detailed
|
||||
systax documentation.
|
||||
|
||||
|
||||
Organization
|
||||
------------
|
||||
|
||||
Template files are located in the [templates](../templates/) directory. The following
|
||||
is the naming convention for these files:
|
||||
|
||||
<pre><i>brand</i>-<i>class</i>-templates.xml</pre>
|
||||
|
||||
Where *brand* is the lowercase brand name, and *class* is the media size class (currently
|
||||
`iso`, `us`, and `other`).
|
||||
|
||||
Templates should be sorted in [natural order](https://en.wikipedia.org/wiki/Natural_sort_order)
|
||||
by part number within each file. An exception to this rule is to group equivalent templates
|
||||
directly below their referenced template. For example:
|
||||
|
||||
```xml
|
||||
<Template brand="Avery" part="5126" size="US-Letter" _description="Shipping labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="mail"/>
|
||||
<Label-rectangle id="0" width="8.5in" height="5.5in" round="0in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="9pt"/>
|
||||
<Layout nx="1" ny="2" x0="0in" y0="0in" dx="0in" dy="5.5in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
<Template brand="Avery" part="5526" equiv="5126"/>
|
||||
<Template brand="Avery" part="8126" equiv="5126"/>
|
||||
<Template brand="Avery" part="15516" equiv="5126"/>
|
||||
<Template brand="Avery" part="18126" equiv="5126"/>
|
||||
|
||||
|
||||
<Template brand="Avery" part="5159" size="US-Letter" _description="Address labels">...
|
||||
```
|
||||
|
||||
When creating a new template file, it must be added to the variable template_files in
|
||||
the [CMakeLists.txt](../templates/CMakeLists.txt) file in this same directory.
|
||||
|
||||
|
||||
*Template* Node Attributes
|
||||
--------------------------
|
||||
|
||||
### *brand* Attribute
|
||||
|
||||
This is the brand name or manufacturer of the product. It must match one of the vendors
|
||||
in the [vendors.xml](../templates/vendors.xml) file. Add a new vendor line if it does not
|
||||
currently exist.
|
||||
|
||||
|
||||
### *part* Attribute
|
||||
|
||||
This is the actual part number of the product. This is usually a short set of numbers and/or
|
||||
letters. This is not a description or name of the product. The following are examples
|
||||
of part numbers:
|
||||
|
||||
- `5160`
|
||||
- `WL-102`
|
||||
- `J8435B`
|
||||
|
||||
Sometimes a product includes multiple label types, either as separate sheets or different
|
||||
types of labels on the same sheet. In these cases, providing a short suffix to part number
|
||||
is acceptable. For example:
|
||||
|
||||
- `3274.1`, `3274.2`, and `3274.3`
|
||||
- `5931-Disc`, and `5931-Spine`
|
||||
|
||||
|
||||
### *_description* Attribute
|
||||
|
||||
- Descriptions should be short. They should describe what the product is in very simple terms
|
||||
without being too detailed. They should not describe details such as size, quantity, layout,
|
||||
color, or material. The description should not include brand or part number information.
|
||||
Size, quantity, layout, brand, and part number are described by other elements of the
|
||||
template - do not repeat them in the description.
|
||||
|
||||
- If at all possible, try to reuse descriptions from other templates (this keeps the
|
||||
number of unique strings that need translation to a minimum).
|
||||
|
||||
- Don't repeat the brand or part number in the description.
|
||||
|
||||
- Only capitalize the first word of the description.
|
||||
|
||||
The following are good bad descriptions:
|
||||
|
||||
| description | Good/Bad | Notes |
|
||||
|:-------------------------|:--------:|:----------------------------------------------|
|
||||
| `Address labels` | ✅ | |
|
||||
| `Address Labels` | ❌ | Capitalized second word of description. |
|
||||
| `Business cards` | ✅ | |
|
||||
| `Multipurpose labels` | ✅ | |
|
||||
| `CD/DVD labels` | ✅ | |
|
||||
| `19mm x 30mm labels` | ❌ | Don't include size information. |
|
||||
| `Labels 15 per sheet` | ❌ | Don't include layout or quantity information. |
|
||||
| `Dymo continuous labels` | ❌ | Don't include brand or part number. |
|
||||
|
||||
|
||||
|
||||
*Meta* Node Attributes
|
||||
----------------------
|
||||
|
||||
### *category* Attribute
|
||||
|
||||
- All templates should include all appropriate `<Meta category=...` nodes.
|
||||
- Categories must match one of the existing categories in the [categories.xml](../templates/categories.xml) file. Do not add new categories!
|
||||
- All templates should include either a `<Meta category="label"/>` or `<Meta category="card"/>` node.
|
||||
|
||||
|
||||
### *product_url* Attribute
|
||||
|
||||
Unfortunately, manufacturer websites are constantly being updated and rearranged, rendering such deep URLs obsolete very quickly. Therefore,
|
||||
use of this attribute is deprecated.
|
||||
|
||||
+11
-1
@@ -39,7 +39,7 @@ To Do List for gLabels 4.0 -- 2019-10-07
|
||||
|
||||
|
||||
|
||||
To Do List for post gLabels 4.0 -- 2019-03-17
|
||||
To Do List for post gLabels 4.0 -- 2026-02-18
|
||||
=============================================
|
||||
|
||||
- [ ] Create a "built-in" merge source
|
||||
@@ -71,4 +71,14 @@ To Do List for post gLabels 4.0 -- 2019-03-17
|
||||
The current built-in fixed margin seems to confuse people when dealing with
|
||||
different horizontal and vertical alignments.
|
||||
|
||||
- [ ] Add support for arbitrary DPI when defining templates. Some label
|
||||
printers use native units in their label specifications (e.g. pins, pixels, etc.)
|
||||
This would look something like this
|
||||
|
||||
`... dpi="300" ... width="525d" height="350d" ...`
|
||||
|
||||
These would be converted to model::Distance when parsing.
|
||||
|
||||
- [ ] Resurrect the evolution and vcard backends. This would be optional based
|
||||
on availability.
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
## Translation management
|
||||
# Translations
|
||||
|
||||
We manage all translations within a [transifex](https://explore.transifex.com/glabels/). Please don't send your files via Github, use only transifex.
|
||||
The translations of the user interface, the template database and the user manual (which is still under development)
|
||||
are maintained at [Fedora Weblate](https://translate.fedoraproject.org/projects/glabels-qt/). Please always use
|
||||
Weblate for translation submissions; we do not accept contributions from outside this platform. For more information about
|
||||
using Weblate, read the [documentation](https://docs.weblate.org/en/latest/).
|
||||
|
||||
To contribute to translations, you need an account in the [Fedora Account System](https://accounts.fedoraproject.org/).
|
||||
More information about the account system can be found [here](https://docs.fedoraproject.org/en-US/fedora-accounts/).
|
||||
|
||||
@@ -207,6 +207,7 @@ namespace glabels
|
||||
if ( auto* tItem = dynamic_cast<TemplatePickerItem *>( mModel->item( i, 0 ) ) )
|
||||
{
|
||||
bool nameMask = tItem->tmplate().name().contains( searchString, Qt::CaseInsensitive );
|
||||
bool descMask = tItem->tmplate().description().contains( searchString, Qt::CaseInsensitive );
|
||||
|
||||
bool sizeMask =
|
||||
(isoMask && tItem->tmplate().isSizeIso()) ||
|
||||
@@ -228,7 +229,7 @@ namespace glabels
|
||||
}
|
||||
|
||||
|
||||
if ( nameMask && sizeMask && categoryMask )
|
||||
if ( (nameMask||descMask) && sizeMask && categoryMask )
|
||||
{
|
||||
setRowHidden( i, false );
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>469</width>
|
||||
<height>297</height>
|
||||
<height>310</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -132,6 +132,14 @@
|
||||
</slots>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>typeCombo</tabstop>
|
||||
<tabstop>nameEdit</tabstop>
|
||||
<tabstop>valueEdit</tabstop>
|
||||
<tabstop>colorValueButton</tabstop>
|
||||
<tabstop>incrementCombo</tabstop>
|
||||
<tabstop>stepSizeEdit</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
|
||||
+64
-11
@@ -56,7 +56,6 @@
|
||||
<font>
|
||||
<family>Sans Serif</family>
|
||||
<pointsize>10</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
@@ -70,7 +69,7 @@
|
||||
<item row="1" column="0">
|
||||
<widget class="QTabWidget" name="notebook">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
<number>5</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="textPage">
|
||||
<attribute name="title">
|
||||
@@ -106,7 +105,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-align-text-left"/>
|
||||
<iconset theme="glabels-align-text-left">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -131,7 +131,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-align-text-center"/>
|
||||
<iconset theme="glabels-align-text-center">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -153,7 +154,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-align-text-right"/>
|
||||
<iconset theme="glabels-align-text-right">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -182,7 +184,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-valign-text-top"/>
|
||||
<iconset theme="glabels-valign-text-top">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -207,7 +210,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-valign-text-middle"/>
|
||||
<iconset theme="glabels-valign-text-middle">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -229,7 +233,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-valign-text-bottom"/>
|
||||
<iconset theme="glabels-valign-text-bottom">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -382,7 +387,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-format-text-bold"/>
|
||||
<iconset theme="glabels-format-text-bold">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -404,7 +410,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-format-text-italic"/>
|
||||
<iconset theme="glabels-format-text-italic">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -423,7 +430,8 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-format-text-underline"/>
|
||||
<iconset theme="glabels-format-text-underline">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -1537,6 +1545,51 @@
|
||||
</slots>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>notebook</tabstop>
|
||||
<tabstop>textFontFamilyCombo</tabstop>
|
||||
<tabstop>textFontSizeSpin</tabstop>
|
||||
<tabstop>textFontBoldToggle</tabstop>
|
||||
<tabstop>textFontItalicToggle</tabstop>
|
||||
<tabstop>textFontUnderlineToggle</tabstop>
|
||||
<tabstop>textColorButton</tabstop>
|
||||
<tabstop>textHAlignLeftToggle</tabstop>
|
||||
<tabstop>textHAlignCenterToggle</tabstop>
|
||||
<tabstop>textHAlignRightToggle</tabstop>
|
||||
<tabstop>textVAlignTopToggle</tabstop>
|
||||
<tabstop>textVAlignMiddleToggle</tabstop>
|
||||
<tabstop>textVAlignBottomToggle</tabstop>
|
||||
<tabstop>textWrapModeCombo</tabstop>
|
||||
<tabstop>textLineSpacingSpin</tabstop>
|
||||
<tabstop>textAutoShrinkCheck</tabstop>
|
||||
<tabstop>textEdit</tabstop>
|
||||
<tabstop>textInsertFieldButton</tabstop>
|
||||
<tabstop>barcodeStyleButton</tabstop>
|
||||
<tabstop>barcodeShowTextCheck</tabstop>
|
||||
<tabstop>barcodeChecksumCheck</tabstop>
|
||||
<tabstop>barcodeColorButton</tabstop>
|
||||
<tabstop>barcodeDataEdit</tabstop>
|
||||
<tabstop>barcodeInsertFieldButton</tabstop>
|
||||
<tabstop>imageFilenameLineEdit</tabstop>
|
||||
<tabstop>imageBrowseButton</tabstop>
|
||||
<tabstop>imageFieldButton</tabstop>
|
||||
<tabstop>lineWidthSpin</tabstop>
|
||||
<tabstop>lineColorButton</tabstop>
|
||||
<tabstop>fillColorButton</tabstop>
|
||||
<tabstop>posXSpin</tabstop>
|
||||
<tabstop>posYSpin</tabstop>
|
||||
<tabstop>sizeWSpin</tabstop>
|
||||
<tabstop>sizeHSpin</tabstop>
|
||||
<tabstop>sizeAspectCheck</tabstop>
|
||||
<tabstop>sizeResetImageButton</tabstop>
|
||||
<tabstop>sizeLineLengthSpin</tabstop>
|
||||
<tabstop>sizeLineAngleSpin</tabstop>
|
||||
<tabstop>shadowEnableCheck</tabstop>
|
||||
<tabstop>shadowXSpin</tabstop>
|
||||
<tabstop>shadowYSpin</tabstop>
|
||||
<tabstop>shadowColorButton</tabstop>
|
||||
<tabstop>shadowOpacitySpin</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<item row="0" column="0">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
@@ -195,6 +195,17 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>tabWidget</tabstop>
|
||||
<tabstop>unitsInchesRadio</tabstop>
|
||||
<tabstop>unitsMillimetersRadio</tabstop>
|
||||
<tabstop>unitsCentimetersRadio</tabstop>
|
||||
<tabstop>unitsPointsRadio</tabstop>
|
||||
<tabstop>unitsPicasRadio</tabstop>
|
||||
<tabstop>gridOriginTlRadio</tabstop>
|
||||
<tabstop>gridOriginCenterRadio</tabstop>
|
||||
<tabstop>gridSpacingSpin</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
|
||||
@@ -490,7 +490,7 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -434,6 +434,13 @@
|
||||
<header>SimplePreview.hpp</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>changeProductButton</tabstop>
|
||||
<tabstop>lengthSpin</tabstop>
|
||||
<tabstop>orientationCombo</tabstop>
|
||||
<tabstop>similarBrowser</tabstop>
|
||||
<tabstop>preview</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -218,6 +218,11 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>websiteButton</tabstop>
|
||||
<tabstop>infoText</tabstop>
|
||||
<tabstop>copyButton</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -183,6 +183,14 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>r1Spin</tabstop>
|
||||
<tabstop>r2Spin</tabstop>
|
||||
<tabstop>xClipSpin</tabstop>
|
||||
<tabstop>yClipSpin</tabstop>
|
||||
<tabstop>wasteSpin</tabstop>
|
||||
<tabstop>marginSpin</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../images.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -149,6 +149,12 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>wSpin</tabstop>
|
||||
<tabstop>hSpin</tabstop>
|
||||
<tabstop>wasteSpin</tabstop>
|
||||
<tabstop>marginSpin</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../images.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -132,7 +132,11 @@
|
||||
<item row="0" column="1" rowspan="2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="glabels::SimplePreview" name="preview"/>
|
||||
<widget class="glabels::SimplePreview" name="preview">
|
||||
<property name="interactive">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
@@ -161,7 +165,8 @@
|
||||
<string>Print test sheet</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-print"/>
|
||||
<iconset theme="glabels-print">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
|
||||
@@ -129,6 +129,12 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>pageSizeCombo</tabstop>
|
||||
<tabstop>wSpin</tabstop>
|
||||
<tabstop>hSpin</tabstop>
|
||||
<tabstop>rollWSpin</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
||||
@@ -187,6 +187,15 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>wSpin</tabstop>
|
||||
<tabstop>hSpin</tabstop>
|
||||
<tabstop>rSpin</tabstop>
|
||||
<tabstop>xWasteSpin</tabstop>
|
||||
<tabstop>yWasteSpin</tabstop>
|
||||
<tabstop>xMarginSpin</tabstop>
|
||||
<tabstop>yMarginSpin</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../images.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -132,6 +132,11 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>rSpin</tabstop>
|
||||
<tabstop>wasteSpin</tabstop>
|
||||
<tabstop>marginSpin</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../images.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -170,7 +170,11 @@
|
||||
<item row="0" column="1" rowspan="2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="glabels::SimplePreview" name="preview"/>
|
||||
<widget class="glabels::SimplePreview" name="preview">
|
||||
<property name="interactive">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
@@ -199,7 +203,8 @@
|
||||
<string>Print test sheet</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="glabels-print"/>
|
||||
<iconset theme="glabels-print">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
@@ -248,6 +253,22 @@
|
||||
<header>SimplePreview.hpp</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>nxSpin1</tabstop>
|
||||
<tabstop>nySpin1</tabstop>
|
||||
<tabstop>x0Spin1</tabstop>
|
||||
<tabstop>y0Spin1</tabstop>
|
||||
<tabstop>dxSpin1</tabstop>
|
||||
<tabstop>dySpin1</tabstop>
|
||||
<tabstop>nxSpin2</tabstop>
|
||||
<tabstop>nySpin2</tabstop>
|
||||
<tabstop>x0Spin2</tabstop>
|
||||
<tabstop>y0Spin2</tabstop>
|
||||
<tabstop>dxSpin2</tabstop>
|
||||
<tabstop>dySpin2</tabstop>
|
||||
<tabstop>preview</tabstop>
|
||||
<tabstop>printButton</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
|
||||
@@ -31,6 +31,7 @@ set (Model_sources
|
||||
FramePath.cpp
|
||||
FrameRect.cpp
|
||||
FrameRound.cpp
|
||||
GenericTemplate.cpp
|
||||
Handle.cpp
|
||||
Layout.cpp
|
||||
Markup.cpp
|
||||
|
||||
+27
-5
@@ -24,6 +24,7 @@
|
||||
#include "Config.hpp"
|
||||
#include "StrUtil.hpp"
|
||||
#include "FileUtil.hpp"
|
||||
#include "GenericTemplate.hpp"
|
||||
#include "Settings.hpp"
|
||||
#include "XmlCategoryParser.hpp"
|
||||
#include "XmlPaperParser.hpp"
|
||||
@@ -87,6 +88,7 @@ namespace glabels::model
|
||||
readCategories();
|
||||
readVendors();
|
||||
readTemplates();
|
||||
createGenericTemplates();
|
||||
}
|
||||
|
||||
|
||||
@@ -470,11 +472,12 @@ namespace glabels::model
|
||||
for ( auto& paper : mPapers )
|
||||
{
|
||||
qDebug() << "paper "
|
||||
<< "id=" << paper.id() << ", "
|
||||
<< "name=" << paper.name() << ", "
|
||||
<< "width=" << paper.width().pt() << "pts, "
|
||||
<< "height=" << paper.height().pt() << "pts, "
|
||||
<< "pwg_size=" << paper.pwgSize();
|
||||
<< "id=" << paper.id() << ", "
|
||||
<< "name=" << paper.name() << ", "
|
||||
<< "width=" << paper.width().pt() << "pts, "
|
||||
<< "height=" << paper.height().pt() << "pts, "
|
||||
<< "pwg_class=" << paper.pwgClass()
|
||||
<< "type=" << paper.type();
|
||||
}
|
||||
|
||||
qDebug();
|
||||
@@ -697,6 +700,25 @@ namespace glabels::model
|
||||
}
|
||||
|
||||
|
||||
void Db::createGenericTemplates()
|
||||
{
|
||||
for ( auto& paper : papers() )
|
||||
{
|
||||
if ( paper.type() == Paper::SHEET )
|
||||
{
|
||||
registerTemplate( GenericTemplate::fullPage( paper ) );
|
||||
registerTemplate( GenericTemplate::halfPage1x2( paper ) );
|
||||
registerTemplate( GenericTemplate::halfPage2x1( paper ) );
|
||||
registerTemplate( GenericTemplate::quarterPage2x2( paper ) );
|
||||
}
|
||||
else if ( paper.type() == Paper::ENVELOPE )
|
||||
{
|
||||
registerTemplate( GenericTemplate::envelope( paper ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Db::readUserTemplatesFromDir( const QDir& dir )
|
||||
{
|
||||
QStringList filters;
|
||||
|
||||
@@ -114,6 +114,8 @@ namespace glabels::model
|
||||
static void readTemplatesFromDir( const QDir& dir );
|
||||
static void registerTemplate( const Template& tmplate );
|
||||
|
||||
static void createGenericTemplates();
|
||||
|
||||
static void readUserTemplatesFromDir( const QDir& dir );
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
// GenericTemplate.cpp
|
||||
//
|
||||
// Copyright (C) 2026 Jaye Evins <evins@snaught.com>
|
||||
//
|
||||
// This file is part of gLabels-qt.
|
||||
//
|
||||
// gLabels-qt is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// gLabels-qt is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
|
||||
#include "GenericTemplate.hpp"
|
||||
|
||||
#include "FrameRect.hpp"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
namespace glabels::model
|
||||
{
|
||||
|
||||
|
||||
Template GenericTemplate::fullPage( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = page size. (e.g. A4)
|
||||
return sheetTemplate( paper, 1, 1, QString( tr( "%1 full-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::halfPage1x2( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = page size. (e.g. A4)
|
||||
return sheetTemplate( paper, 1, 2, QString( tr( "%1 half-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::halfPage2x1( const Paper& paper )
|
||||
{
|
||||
return sheetTemplate( paper, 2, 1, QString( tr( "%1 half-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::quarterPage2x2( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = page size. (e.g. A4)
|
||||
return sheetTemplate( paper, 2, 2, QString( tr( "%1 quarter-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::envelope( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = envelope size. (e.g. DL)
|
||||
QString description = QString( tr( "%1 envelope" ) ).arg( paper.name() );
|
||||
|
||||
Template tmplate( tr("Generic"),
|
||||
paper.id() + "-ENV",
|
||||
description,
|
||||
paper.id(),
|
||||
paper.width(),
|
||||
paper.height() );
|
||||
|
||||
FrameRect frame( paper.width(),
|
||||
paper.height(),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ) );
|
||||
|
||||
Layout layout( 1,
|
||||
1,
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ) );
|
||||
|
||||
frame.addLayout( layout );
|
||||
tmplate.addFrame( frame );
|
||||
|
||||
tmplate.addCategory( "mail" );
|
||||
|
||||
return tmplate;
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::sheetTemplate( const Paper& paper,
|
||||
int nx,
|
||||
int ny,
|
||||
const QString& description )
|
||||
{
|
||||
Template tmplate( tr("Generic"),
|
||||
QString( "%1-%2x%3" ).arg(paper.id()).arg(nx).arg(ny),
|
||||
description,
|
||||
paper.id(),
|
||||
paper.width(),
|
||||
paper.height() );
|
||||
|
||||
FrameRect frame( paper.width()/nx,
|
||||
paper.height()/ny,
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ) );
|
||||
|
||||
Layout layout( nx,
|
||||
ny,
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
paper.width()/nx,
|
||||
paper.height()/ny );
|
||||
|
||||
frame.addLayout( layout );
|
||||
tmplate.addFrame( frame );
|
||||
|
||||
tmplate.addCategory( "label" );
|
||||
tmplate.addCategory( "rectangle-label" );
|
||||
tmplate.addCategory( "card" );
|
||||
|
||||
return tmplate;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// GenericTemplate.hpp
|
||||
//
|
||||
// Copyright (C) 2026 Jaye Evins <evins@snaught.com>
|
||||
//
|
||||
// This file is part of gLabels-qt.
|
||||
//
|
||||
// gLabels-qt is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// gLabels-qt is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
#ifndef model_GenericTemplate_hpp
|
||||
#define model_GenericTemplate_hpp
|
||||
|
||||
|
||||
#include "Template.hpp"
|
||||
#include "Paper.hpp"
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
|
||||
namespace glabels::model
|
||||
{
|
||||
|
||||
class GenericTemplate
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(GenericTemplate)
|
||||
|
||||
public:
|
||||
GenericTemplate() = delete;
|
||||
|
||||
static Template fullPage( const Paper& paper );
|
||||
static Template halfPage1x2( const Paper& paper );
|
||||
static Template halfPage2x1( const Paper& paper );
|
||||
static Template quarterPage2x2( const Paper& paper );
|
||||
|
||||
static Template envelope( const Paper& paper );
|
||||
|
||||
|
||||
private:
|
||||
static Template sheetTemplate( const Paper& paper,
|
||||
int nx,
|
||||
int ny,
|
||||
const QString& description );
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif // model_GenericTemplate_hpp
|
||||
@@ -42,13 +42,16 @@ namespace
|
||||
///
|
||||
/// Calculate pixel size
|
||||
///
|
||||
/// Assume a virtual DPI of 96 pixels/inch for all QPainter contexts.
|
||||
/// Assume a virtual DPI of 72 pixels/inch for all QPainter contexts.
|
||||
/// Ideally, we should use pointSizes for device independence, but as
|
||||
/// Qt-6.4 on X11, Wayland, and MacOS this approach has better results.
|
||||
/// of Qt-6.4, the xcb (X11) and Wayland backends will render the same
|
||||
/// font differently. Currently this function is basically the unity
|
||||
/// function (i.e. 1 pt = 1 pixel) with rounding, but is a placeholder
|
||||
/// that may need to be tweaked for different backends.
|
||||
///
|
||||
int pixelSize( double pointSize )
|
||||
{
|
||||
const double virtual_dpi = 96;
|
||||
const double virtual_dpi = 72;
|
||||
return qMax( 1, qRound( pointSize * virtual_dpi/72.0 ) );
|
||||
}
|
||||
}
|
||||
|
||||
+14
-6
@@ -29,12 +29,14 @@ namespace glabels::model
|
||||
const QString& name,
|
||||
Distance width,
|
||||
Distance height,
|
||||
const QString& pwgSize )
|
||||
const QString& pwgClass,
|
||||
Type type )
|
||||
: mId(id),
|
||||
mName(name),
|
||||
mWidth(width),
|
||||
mHeight(height),
|
||||
mPwgSize(pwgSize)
|
||||
mPwgClass(pwgClass),
|
||||
mType(type)
|
||||
{
|
||||
// empty
|
||||
}
|
||||
@@ -64,21 +66,27 @@ namespace glabels::model
|
||||
}
|
||||
|
||||
|
||||
QString Paper::pwgSize() const
|
||||
QString Paper::pwgClass() const
|
||||
{
|
||||
return mPwgSize;
|
||||
return mPwgClass;
|
||||
}
|
||||
|
||||
|
||||
Paper::Type Paper::type() const
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
|
||||
bool Paper::isSizeIso() const
|
||||
{
|
||||
return mPwgSize.startsWith( "iso_" );
|
||||
return mPwgClass == "iso";
|
||||
}
|
||||
|
||||
|
||||
bool Paper::isSizeUs() const
|
||||
{
|
||||
return mPwgSize.startsWith( "na_" );
|
||||
return mPwgClass == "na";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+19
-4
@@ -32,13 +32,23 @@ namespace glabels::model
|
||||
|
||||
class Paper
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
SHEET,
|
||||
ENVELOPE,
|
||||
ROLL
|
||||
};
|
||||
|
||||
|
||||
public:
|
||||
Paper() = default;
|
||||
Paper( const QString& id,
|
||||
const QString& name,
|
||||
Distance width,
|
||||
Distance height,
|
||||
const QString& pwgSize );
|
||||
const QString& pwgClass,
|
||||
Type type = SHEET );
|
||||
~Paper() = default;
|
||||
|
||||
QString id() const;
|
||||
@@ -50,18 +60,23 @@ namespace glabels::model
|
||||
/* Height */
|
||||
Distance height() const;
|
||||
|
||||
/* PWG 5101.1-2002 size name */
|
||||
QString pwgSize() const;
|
||||
/* PWG 5101.1-2023 class */
|
||||
QString pwgClass() const;
|
||||
|
||||
Type type() const;
|
||||
|
||||
bool isSizeIso() const;
|
||||
bool isSizeUs() const;
|
||||
|
||||
|
||||
private:
|
||||
QString mId;
|
||||
QString mName;
|
||||
Distance mWidth;
|
||||
Distance mHeight;
|
||||
QString mPwgSize;
|
||||
QString mPwgClass;
|
||||
Type mType;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+36
-18
@@ -50,8 +50,10 @@
|
||||
|
||||
namespace
|
||||
{
|
||||
using namespace glabels::model;
|
||||
|
||||
const uint32_t GDK_PIXBUF_MAGIC_NUMBER {0x47646b50};
|
||||
const double FONT_SCALE_FACTOR {0.75};
|
||||
const Distance MARGIN_OFFSET { Distance::pt(3) }; // In glabels-3, margin was not accounted for in text baseline calculations
|
||||
|
||||
typedef enum
|
||||
{
|
||||
@@ -463,35 +465,35 @@ namespace glabels::model
|
||||
XmlLabelParser_3::parseObjectTextNode( const QDomElement &node )
|
||||
{
|
||||
/* position attrs */
|
||||
const Distance x0 = XmlUtil::getLengthAttr( node, "x", 0.0 );
|
||||
const Distance y0 = XmlUtil::getLengthAttr( node, "y", 0.0 );
|
||||
Distance x0 = XmlUtil::getLengthAttr( node, "x", 0.0 );
|
||||
Distance y0 = XmlUtil::getLengthAttr( node, "y", 0.0 );
|
||||
|
||||
/* size attrs */
|
||||
const Distance w = XmlUtil::getLengthAttr( node, "w", 0 );
|
||||
const Distance h = XmlUtil::getLengthAttr( node, "h", 0 );
|
||||
Distance w = XmlUtil::getLengthAttr( node, "w", 0 );
|
||||
Distance h = XmlUtil::getLengthAttr( node, "h", 0 );
|
||||
|
||||
/* justify attr */
|
||||
const Qt::Alignment textHAlign = getHAlignmentAttr( node, "justify", Qt::AlignLeft );
|
||||
Qt::Alignment textHAlign = getHAlignmentAttr( node, "justify", Qt::AlignLeft );
|
||||
|
||||
/* valign attr */
|
||||
const Qt::Alignment textVAlign = getVAlignmentAttr( node, "valign", Qt::AlignTop );
|
||||
Qt::Alignment textVAlign = getVAlignmentAttr( node, "valign", Qt::AlignTop );
|
||||
|
||||
/* auto_shrink attr */
|
||||
const bool textAutoShrink = XmlUtil::getBoolAttr( node, "auto_shrink", false );
|
||||
bool textAutoShrink = XmlUtil::getBoolAttr( node, "auto_shrink", false );
|
||||
|
||||
/* affine attrs */
|
||||
const auto affineTransformation = parseAffineTransformation(node);
|
||||
auto affineTransformation = parseAffineTransformation(node);
|
||||
|
||||
/* shadow attrs */
|
||||
const bool shadowState = XmlUtil::getBoolAttr( node, "shadow", false );
|
||||
const Distance shadowX = XmlUtil::getLengthAttr( node, "shadow_x", 0.0 );
|
||||
const Distance shadowY = XmlUtil::getLengthAttr( node, "shadow_y", 0.0 );
|
||||
const double shadowOpacity = XmlUtil::getDoubleAttr( node, "shadow_opacity", 1.0 );
|
||||
bool shadowState = XmlUtil::getBoolAttr( node, "shadow", false );
|
||||
Distance shadowX = XmlUtil::getLengthAttr( node, "shadow_x", 0.0 );
|
||||
Distance shadowY = XmlUtil::getLengthAttr( node, "shadow_y", 0.0 );
|
||||
double shadowOpacity = XmlUtil::getDoubleAttr( node, "shadow_opacity", 1.0 );
|
||||
|
||||
QString key = XmlUtil::getStringAttr( node, "shadow_color_field", "" );
|
||||
bool field_flag = !key.isEmpty();
|
||||
uint32_t color = XmlUtil::getUIntAttr( node, "shadow_color", 0 );
|
||||
const ColorNode shadowColorNode( field_flag, color, key );
|
||||
ColorNode shadowColorNode( field_flag, color, key );
|
||||
|
||||
/* font attrs */
|
||||
QString fontFamily = "Sans";
|
||||
@@ -553,7 +555,7 @@ namespace glabels::model
|
||||
|
||||
/* font attrs */
|
||||
fontFamily = XmlUtil::getStringAttr( element, "font_family", "Sans" );
|
||||
fontSize = XmlUtil::getDoubleAttr( element, "font_size", 10 ) * FONT_SCALE_FACTOR;
|
||||
fontSize = XmlUtil::getDoubleAttr( element, "font_size", 10 );
|
||||
fontWeight = getWeightAttr( element, "font_weight", QFont::Normal );
|
||||
fontItalicFlag = XmlUtil::getBoolAttr( element, "font_italic", false );
|
||||
|
||||
@@ -576,6 +578,20 @@ namespace glabels::model
|
||||
}
|
||||
const QString text = document.toPlainText();
|
||||
|
||||
// Compensate for differences in glabels-3 text baseline calculations
|
||||
switch ( textVAlign )
|
||||
{
|
||||
case Qt::AlignVCenter:
|
||||
// No adjustment should be needed
|
||||
break;
|
||||
case Qt::AlignBottom:
|
||||
y0 += MARGIN_OFFSET;
|
||||
break;
|
||||
default:
|
||||
y0 -= MARGIN_OFFSET;
|
||||
break;
|
||||
}
|
||||
|
||||
auto textNode = new ModelTextObject( x0, y0, w, h, false /*lockAspectRatio*/, text,
|
||||
fontFamily, fontSize, fontWeight, fontItalicFlag, false,
|
||||
textColorNode, textHAlign, textVAlign, textWrapMode, textLineSpacing,
|
||||
@@ -583,9 +599,11 @@ namespace glabels::model
|
||||
affineTransformation,
|
||||
shadowState, shadowX, shadowY, shadowOpacity, shadowColorNode );
|
||||
|
||||
// The size of the textnode does not fit the qt world. So it's needed to
|
||||
// recalculate the size depending on the data.
|
||||
textNode->setSize(textNode->naturalSize());
|
||||
if ( (w.pt() == 0) || (h.pt() == 0) )
|
||||
{
|
||||
// Do our best to autosize
|
||||
textNode->setSize(textNode->naturalSize());
|
||||
}
|
||||
|
||||
return textNode;
|
||||
}
|
||||
|
||||
@@ -99,9 +99,25 @@ namespace glabels::model
|
||||
Distance width = XmlUtil::getLengthAttr( node, "width", Distance(0) );
|
||||
Distance height = XmlUtil::getLengthAttr( node, "height", Distance(0) );
|
||||
|
||||
QString pwgSize = XmlUtil::getStringAttr( node, "pwg_size", "" );
|
||||
QString pwgClass = XmlUtil::getStringAttr( node, "pwg_class", "iso" );
|
||||
|
||||
return Paper( id, name, width, height, pwgSize );
|
||||
Paper::Type type;
|
||||
QString typeString = XmlUtil::getStringAttr( node, "type", "sheet" );
|
||||
if ( typeString == "sheet" )
|
||||
{
|
||||
type = Paper::SHEET;
|
||||
}
|
||||
else if ( typeString == "envelope" )
|
||||
{
|
||||
type = Paper::ENVELOPE;
|
||||
}
|
||||
else
|
||||
{
|
||||
qWarning() << "Warning: unknown paper type: " << typeString << ".";
|
||||
type = Paper::SHEET;
|
||||
}
|
||||
|
||||
return Paper( id, name, width, height, pwgClass, type );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -60,12 +60,6 @@ using namespace glabels::barcode;
|
||||
using namespace glabels::merge;
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
const double FONT_SCALE_FACTOR {0.75};
|
||||
}
|
||||
|
||||
|
||||
void TestXmlLabel::initTestCase()
|
||||
{
|
||||
QCoreApplication::setOrganizationName( glabels::model::Version::ORGANIZATION_NAME );
|
||||
@@ -491,6 +485,10 @@ void TestXmlLabel::parser_3ReadFile()
|
||||
// absolute path, an attempt should be made guess at the relative path (maybe sitting
|
||||
// in the same directory as the glabels file. For glabels-4 files, the relative path
|
||||
// should be encoded in the file.
|
||||
//
|
||||
// FIX ME: Y0 of text objects is modified to compensate for differences in the text baseline
|
||||
// calculations between glabels-3 and glabels-4. These tests are currently commented
|
||||
// out.
|
||||
|
||||
QFileInfo glabelsFileInfo( QString( "%1/data/glabels-3/crew-orientation-name-tags-7.glabels" ).arg( QString(TEST_DIR) ) );
|
||||
QVERIFY( glabelsFileInfo.isReadable() );
|
||||
@@ -537,14 +535,14 @@ void TestXmlLabel::parser_3ReadFile()
|
||||
ModelTextObject* modelTextObject0 = dynamic_cast<ModelTextObject*>( model->objectList()[0] );
|
||||
QVERIFY( modelTextObject0 );
|
||||
QCOMPARE( modelTextObject0->x0().in(), 0.150603 );
|
||||
QCOMPARE( modelTextObject0->y0().in(), 0.2625 );
|
||||
//QCOMPARE( modelTextObject0->y0().in(), 0.2625 );
|
||||
// Width and height set to naturalSize()
|
||||
QCOMPARE( modelTextObject0->lockAspectRatio(), false );
|
||||
QCOMPARE( modelTextObject0->matrix(), QTransform( 1, 0, 0, 1, 0, 0 ) );
|
||||
QCOMPARE( modelTextObject0->shadow(), false );
|
||||
QCOMPARE( modelTextObject0->text(), QString( "Hello, my name is" ) );
|
||||
QCOMPARE( modelTextObject0->fontFamily(), QString( "Sans" ) );
|
||||
QCOMPARE( modelTextObject0->fontSize(), 16 * FONT_SCALE_FACTOR );
|
||||
QCOMPARE( modelTextObject0->fontSize(), 16 );
|
||||
QCOMPARE( modelTextObject0->fontWeight(), QFont::Bold );
|
||||
QCOMPARE( modelTextObject0->fontItalicFlag(), false );
|
||||
QCOMPARE( modelTextObject0->textLineSpacing(), 1.0 );
|
||||
@@ -555,14 +553,14 @@ void TestXmlLabel::parser_3ReadFile()
|
||||
ModelTextObject* modelTextObject1 = dynamic_cast<ModelTextObject*>( model->objectList()[1] );
|
||||
QVERIFY( modelTextObject1 );
|
||||
QCOMPARE( modelTextObject1->x0().in(), 0.150603 );
|
||||
QCOMPARE( modelTextObject1->y0().in(), 0.645 );
|
||||
//QCOMPARE( modelTextObject1->y0().in(), 0.645 );
|
||||
// Width and height set to naturalSize()
|
||||
QCOMPARE( modelTextObject1->lockAspectRatio(), false );
|
||||
QCOMPARE( modelTextObject1->matrix(), QTransform( 1, 0, 0, 1, 0, 0 ) );
|
||||
QCOMPARE( modelTextObject1->shadow(), false );
|
||||
QCOMPARE( modelTextObject1->text(), QString( "${Name}" ) );
|
||||
QCOMPARE( modelTextObject1->fontFamily(), QString( "Sans" ) );
|
||||
QCOMPARE( modelTextObject1->fontSize(), 20 * FONT_SCALE_FACTOR );
|
||||
QCOMPARE( modelTextObject1->fontSize(), 20 );
|
||||
QCOMPARE( modelTextObject1->fontWeight(), QFont::Normal );
|
||||
QCOMPARE( modelTextObject1->fontItalicFlag(), false );
|
||||
QCOMPARE( modelTextObject1->textLineSpacing(), 1.0 );
|
||||
@@ -573,14 +571,14 @@ void TestXmlLabel::parser_3ReadFile()
|
||||
ModelTextObject* modelTextObject2 = dynamic_cast<ModelTextObject*>( model->objectList()[2] );
|
||||
QVERIFY( modelTextObject2 );
|
||||
QCOMPARE( modelTextObject2->x0().in(), 0.150603 );
|
||||
QCOMPARE( modelTextObject2->y0().in(), 1.14 );
|
||||
//QCOMPARE( modelTextObject2->y0().in(), 1.14 );
|
||||
// Width and height set to naturalSize()
|
||||
QCOMPARE( modelTextObject2->lockAspectRatio(), false );
|
||||
QCOMPARE( modelTextObject2->matrix(), QTransform( 1, 0, 0, 1, 0, 0 ) );
|
||||
QCOMPARE( modelTextObject2->shadow(), false );
|
||||
QCOMPARE( modelTextObject2->text(), QString( "Department: ${Department}" ) );
|
||||
QCOMPARE( modelTextObject2->fontFamily(), QString( "Sans" ) );
|
||||
QCOMPARE( modelTextObject2->fontSize(), 11 * FONT_SCALE_FACTOR );
|
||||
QCOMPARE( modelTextObject2->fontSize(), 11 );
|
||||
QCOMPARE( modelTextObject2->fontWeight(), QFont::Normal );
|
||||
QCOMPARE( modelTextObject2->fontItalicFlag(), false );
|
||||
QCOMPARE( modelTextObject2->textLineSpacing(), 1.0 );
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
# linuxdeploy / linuxdeploy-plugin-qt configuration — sourced by scripts/build-appimages.sh.
|
||||
# Documents the bundling choices for both AppImages.
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.3
|
||||
|
||||
# Qt platform plugins to include (linuxdeploy-plugin-qt picks these up automatically;
|
||||
# documenting here for posterity).
|
||||
QT_PLATFORM_PLUGINS="xcb"
|
||||
|
||||
# Image format plugins. The GUI app needs SVG/PNG support; batch CLI does not.
|
||||
QT_IMAGE_FORMAT_PLUGINS_GUI="svg"
|
||||
QT_IMAGE_FORMAT_PLUGINS_BATCH=""
|
||||
|
||||
# Files in the AppDir we don't want bundled (linuxdeploy is greedy by default).
|
||||
APPDIR_EXCLUDE_GLOBS=()
|
||||
@@ -0,0 +1,30 @@
|
||||
# sethLabels packaging changelog
|
||||
|
||||
Per-release packaging notes. Each entry covers what changed in the *packaging*,
|
||||
not what changed upstream. For application-level changes, see the upstream
|
||||
`docs/CHANGELOG.md` and `git log upstream/master`.
|
||||
|
||||
## Format
|
||||
|
||||
```
|
||||
## <version> — <ISO date>
|
||||
|
||||
- bullet describing what changed in this packaging release
|
||||
- ...
|
||||
```
|
||||
|
||||
`<version>` is `<upstream-tag>-seth<N>` (e.g., `3.99-master618-seth1`), matching
|
||||
the git tag and the artifact filename. See spec §D4.
|
||||
|
||||
---
|
||||
|
||||
## 3.99-master618-seth1 — 2026-04-29
|
||||
|
||||
- First end-to-end release of sethLabels packaging pipeline.
|
||||
- `.deb` produced via CMake CPack with strict-zero `-D` overrides (no upstream edits).
|
||||
- AppImages (GUI + batch) bundled via linuxdeploy + linuxdeploy-plugin-qt, pinned per F9.
|
||||
- Brew tap initial publish at `git.sethpc.xyz/Seth/homebrew-tap`.
|
||||
|
||||
## (unreleased)
|
||||
|
||||
- (no changes since 3.99-master618-seth1)
|
||||
@@ -0,0 +1,11 @@
|
||||
# CPack DEB metadata overrides — sourced by scripts/build-deb.sh.
|
||||
# All values are passed to cpack as -D CPACK_DEBIAN_PACKAGE_<KEY>="$VALUE".
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.2
|
||||
|
||||
MAINTAINER="Seth Freiberg <seth@sethfreiberg.com>"
|
||||
SECTION="graphics"
|
||||
HOMEPAGE="https://glabels.org"
|
||||
# CPACK_PACKAGE_NAME override — required because upstream sets
|
||||
# CPACK_PACKAGE_NAME=glabels (CMakeLists.txt:86) and decision D6 wants glabels-qt.
|
||||
PACKAGE_NAME="glabels-qt"
|
||||
@@ -0,0 +1,90 @@
|
||||
# sethLabels build scripts
|
||||
|
||||
Canonical recipe for building sethLabels artifacts. CI YAML at the public-flip
|
||||
will call these scripts unmodified — no logic moves into YAML (spec §I3).
|
||||
|
||||
## Quick reference
|
||||
|
||||
```
|
||||
./scripts/lib/deps-debian.sh # check / install build deps
|
||||
./scripts/check-no-upstream-edits.sh # enforce strict-zero (I1)
|
||||
./scripts/compute-version.sh # emit <upstream-tag>-seth<N>
|
||||
./scripts/build-deb.sh # → build/deb/glabels-qt_<VERSION>_amd64.deb
|
||||
./scripts/build-appimages.sh # → sethlabels-{gui,batch}-<VERSION>-x86_64.AppImage
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Debian 13 (Trixie) or Ubuntu 24.04 LTS. Run:
|
||||
|
||||
```
|
||||
./scripts/lib/deps-debian.sh
|
||||
```
|
||||
|
||||
If anything is missing, the script prints the exact `sudo apt install ...`
|
||||
command to run.
|
||||
|
||||
`bats` (bash test framework) is in the dep list — it's required for the
|
||||
implementation tests under `tests-impl/`.
|
||||
|
||||
`linuxdeploy` and `linuxdeploy-plugin-qt` are NOT apt-installable; they're
|
||||
downloaded automatically by `scripts/lib/linuxdeploy.sh` to `scripts/.cache/`
|
||||
on first AppImage build.
|
||||
|
||||
## Versioning
|
||||
|
||||
`<upstream-tag>-seth<N>` (e.g., `3.99-master618-seth1`). The `<N>` counter is
|
||||
computed from existing git tags matching `<upstream-tag>-seth*`. See spec §D4.
|
||||
|
||||
**Caller responsibility:** the local tag db must be fresh before running
|
||||
`compute-version.sh`. Run `git fetch origin --tags` first if you're not
|
||||
inside the release flow (which fetches tags as step 1).
|
||||
|
||||
## Release flow
|
||||
|
||||
See spec §6 for the canonical step-by-step. TL;DR:
|
||||
|
||||
```
|
||||
git fetch --all --tags
|
||||
git rebase upstream/master
|
||||
./scripts/check-no-upstream-edits.sh
|
||||
./scripts/build-deb.sh # ~2 min
|
||||
./scripts/build-appimages.sh # ~5 min
|
||||
VERSION=$(./scripts/compute-version.sh)
|
||||
git tag "$VERSION"
|
||||
git push origin main --tags
|
||||
# Create Gitea release for $VERSION; attach the three artifacts.
|
||||
# Bump ../homebrew-tap/Formula/glabels-qt.rb (tag + revision); commit; push.
|
||||
# Smoke verify on a clean Debian 13 VM (T5).
|
||||
```
|
||||
|
||||
## Layout
|
||||
|
||||
```
|
||||
scripts/
|
||||
├── README.md ← this file
|
||||
├── compute-version.sh ← pure logic; emits version string
|
||||
├── check-no-upstream-edits.sh ← guardrail enforcing I1
|
||||
├── build-deb.sh ← end-to-end .deb pipeline
|
||||
├── build-appimages.sh ← end-to-end AppImage pipeline (GUI + batch)
|
||||
├── lib/
|
||||
│ ├── deps-debian.sh ← build-dep manifest + checker
|
||||
│ └── linuxdeploy.sh ← linuxdeploy + plugin-qt bootstrapper
|
||||
└── .cache/ ← gitignored; linuxdeploy AppImages cache
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
```
|
||||
./tests-impl/run-all.sh
|
||||
```
|
||||
|
||||
Runs the bats suite for pure-logic scripts. Build-script smoke tests (T1–T4)
|
||||
are inline in `build-deb.sh` and `build-appimages.sh` — they fire automatically
|
||||
on each build.
|
||||
|
||||
## Spec
|
||||
|
||||
The design rationale, invariants, and failure modes live in
|
||||
[`../sethlabels-docs/specs/2026-04-29-packaging-design.md`](../sethlabels-docs/specs/2026-04-29-packaging-design.md).
|
||||
Read it before changing any script.
|
||||
Executable
+179
@@ -0,0 +1,179 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build sethLabels AppImages (GUI + batch).
|
||||
#
|
||||
# Pipeline (spec §5.3):
|
||||
# 1. sanity / guardrail / version-compute (same as build-deb.sh)
|
||||
# 2. out-of-tree cmake build with CMAKE_INSTALL_PREFIX=/usr
|
||||
# 3. cmake --install to staging AppDir
|
||||
# 4. linuxdeploy bundle GUI AppImage
|
||||
# 5. re-stage AppDir for batch-only, linuxdeploy bundle batch AppImage
|
||||
# 6. inline smoke tests T3, T4
|
||||
# 7. print artifact paths
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.3
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
echo "==> [1/6] Sanity check build host"
|
||||
"$REPO_ROOT/scripts/lib/deps-debian.sh"
|
||||
echo "==> [1/6] Strict-zero guardrail"
|
||||
"$REPO_ROOT/scripts/check-no-upstream-edits.sh"
|
||||
echo "==> [1/6] Compute version"
|
||||
VERSION="$("$REPO_ROOT/scripts/compute-version.sh")"
|
||||
echo " VERSION = $VERSION"
|
||||
|
||||
# Bootstrap linuxdeploy + plugin-qt; defines $LINUXDEPLOY_BIN and $LINUXDEPLOY_PLUGIN_QT_BIN.
|
||||
# shellcheck disable=SC1091
|
||||
source "$REPO_ROOT/scripts/lib/linuxdeploy.sh"
|
||||
# linuxdeploy looks for the plugin in PATH; symlink into the cache dir suffices.
|
||||
PLUGIN_DIR="$(dirname "$LINUXDEPLOY_PLUGIN_QT_BIN")"
|
||||
PATH="$PLUGIN_DIR:$PATH"
|
||||
# Plugin file must be named exactly `linuxdeploy-plugin-qt` (no version suffix).
|
||||
PLUGIN_LINK="$PLUGIN_DIR/linuxdeploy-plugin-qt"
|
||||
ln -sf "$LINUXDEPLOY_PLUGIN_QT_BIN" "$PLUGIN_LINK"
|
||||
chmod +x "$PLUGIN_LINK"
|
||||
# Debian 13 has Qt6 only; linuxdeploy-plugin-qt's default qmake lookup looks
|
||||
# for `qmake` (Qt5 era) or `/usr/lib/qt5/bin/qmake` (neither exists). Force it
|
||||
# to the Qt6 binary explicitly so plugin staging works.
|
||||
export QMAKE=/usr/bin/qmake6
|
||||
|
||||
echo "==> [2/6] Out-of-tree cmake build (install prefix /usr)"
|
||||
BUILD_DIR="$REPO_ROOT/build/appimage"
|
||||
APPDIR_GUI="$BUILD_DIR/AppDir-gui"
|
||||
APPDIR_BATCH="$BUILD_DIR/AppDir-batch"
|
||||
rm -rf "${BUILD_DIR:?BUILD_DIR must not be empty}"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
cmake -S "$REPO_ROOT" -B "$BUILD_DIR" -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr
|
||||
cmake --build "$BUILD_DIR" --parallel
|
||||
|
||||
echo "==> [3/6] Stage install tree to AppDirs"
|
||||
DESTDIR="$APPDIR_GUI" cmake --install "$BUILD_DIR"
|
||||
# Batch AppDir gets its own copy so we can prune Qt plugins that GUI needs but batch doesn't.
|
||||
DESTDIR="$APPDIR_BATCH" cmake --install "$BUILD_DIR"
|
||||
|
||||
# Sanity: both AppDirs must contain both binaries (we strip later, not here).
|
||||
test -x "$APPDIR_GUI/usr/bin/glabels-qt" || { echo "ERROR: GUI binary missing in AppDir-gui" >&2; exit 1; }
|
||||
test -x "$APPDIR_BATCH/usr/bin/glabels-batch-qt" || { echo "ERROR: batch binary missing in AppDir-batch" >&2; exit 1; }
|
||||
|
||||
# Prune the unwanted binary from each AppDir so linuxdeploy bundles only the
|
||||
# libs needed by the remaining binary (otherwise both AppImages carry both
|
||||
# binaries; spec §5.3 step 3 implies "AppDir-batch" should be batch-only).
|
||||
rm "$APPDIR_GUI/usr/bin/glabels-batch-qt"
|
||||
rm "$APPDIR_BATCH/usr/bin/glabels-qt"
|
||||
# Also prune the GUI desktop files from the batch AppDir: linuxdeploy's
|
||||
# --create-desktop-file doesn't suppress pre-existing desktop files, and
|
||||
# the upstream desktop files reference Exec=glabels-qt (now pruned).
|
||||
find "$APPDIR_BATCH/usr/share/applications" -name '*.desktop' -delete
|
||||
|
||||
echo "==> [4/6] Bundle GUI AppImage"
|
||||
DESKTOP_FILE="$APPDIR_GUI/usr/share/applications/glabels-qt.desktop"
|
||||
ICON_FILE="$APPDIR_GUI/usr/share/icons/hicolor/scalable/apps/glabels.svg"
|
||||
# Upstream's actual desktop filename may vary — list what's there if missing.
|
||||
if [ ! -f "$DESKTOP_FILE" ]; then
|
||||
ALT_DESKTOP=$(find "$APPDIR_GUI/usr/share/applications" -name '*.desktop' | head -1)
|
||||
if [ -n "$ALT_DESKTOP" ]; then
|
||||
DESKTOP_FILE="$ALT_DESKTOP"
|
||||
else
|
||||
echo "ERROR: no .desktop file found in $APPDIR_GUI/usr/share/applications" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
cd "$BUILD_DIR"
|
||||
APPIMAGE_EXTRACT_AND_RUN=1 \
|
||||
"$LINUXDEPLOY_BIN" \
|
||||
--appdir "$APPDIR_GUI" \
|
||||
--plugin qt \
|
||||
--executable "$APPDIR_GUI/usr/bin/glabels-qt" \
|
||||
--desktop-file "$DESKTOP_FILE" \
|
||||
--icon-file "$ICON_FILE" \
|
||||
--output appimage
|
||||
|
||||
# linuxdeploy names the AppImage from the desktop file's Name= field (spaces→underscores).
|
||||
# For this upstream desktop file (Name=gLabels Label Designer 4) that produces
|
||||
# gLabels_Label_Designer_4-x86_64.AppImage. Use a broad glob and exclude *batch*.
|
||||
GUI_RAW=$(ls "$BUILD_DIR"/*.AppImage 2>/dev/null | grep -v batch | head -1)
|
||||
GUI_OUT="$REPO_ROOT/sethlabels-gui-${VERSION}-x86_64.AppImage"
|
||||
mv "$GUI_RAW" "$GUI_OUT"
|
||||
chmod +x "$GUI_OUT"
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
echo "==> [5/6] Bundle batch AppImage"
|
||||
# Batch is CLI-only; reuse the upstream SVG icon so --create-desktop-file has
|
||||
# an icon to reference (linuxdeploy errors if the Icon= entry has no match).
|
||||
BATCH_ICON_FILE="$APPDIR_BATCH/usr/share/icons/hicolor/scalable/apps/glabels.svg"
|
||||
|
||||
[ -f "$BATCH_ICON_FILE" ] || { echo "ERROR: batch icon not found: $BATCH_ICON_FILE" >&2; exit 1; }
|
||||
|
||||
cd "$BUILD_DIR"
|
||||
APPIMAGE_EXTRACT_AND_RUN=1 \
|
||||
"$LINUXDEPLOY_BIN" \
|
||||
--appdir "$APPDIR_BATCH" \
|
||||
--plugin qt \
|
||||
--executable "$APPDIR_BATCH/usr/bin/glabels-batch-qt" \
|
||||
--icon-file "$BATCH_ICON_FILE" \
|
||||
--icon-filename glabels-batch-qt \
|
||||
--create-desktop-file \
|
||||
--output appimage
|
||||
|
||||
# linuxdeploy names the batch AppImage using the first desktop file it finds (the upstream
|
||||
# GUI desktop), producing the same name as the GUI build. Since we already moved the GUI
|
||||
# AppImage out, only one .AppImage remains in BUILD_DIR at this point — pick it directly.
|
||||
BATCH_RAW=$(ls "$BUILD_DIR"/*.AppImage 2>/dev/null | head -1)
|
||||
BATCH_OUT="$REPO_ROOT/sethlabels-batch-${VERSION}-x86_64.AppImage"
|
||||
mv "$BATCH_RAW" "$BATCH_OUT"
|
||||
chmod +x "$BATCH_OUT"
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
echo "==> [6/6] Smoke tests"
|
||||
|
||||
# Both AppImages bundle only the xcb Qt platform plugin (linuxdeploy-plugin-qt does not
|
||||
# include offscreen/minimal). We need a real X display. Use Xvfb if available; if not,
|
||||
# require DISPLAY to be set by the caller.
|
||||
SMOKE_XVFB_PID=""
|
||||
if ! xdpyinfo -display "${DISPLAY:-}" >/dev/null 2>&1; then
|
||||
if command -v Xvfb >/dev/null 2>&1; then
|
||||
echo " (starting Xvfb :99 for headless smoke tests)"
|
||||
Xvfb :99 -screen 0 800x600x24 &
|
||||
SMOKE_XVFB_PID=$!
|
||||
export DISPLAY=:99
|
||||
sleep 1
|
||||
else
|
||||
echo "WARNING: no DISPLAY and Xvfb not found — smoke tests may fail on xcb platform" >&2
|
||||
fi
|
||||
fi
|
||||
cleanup_xvfb() { [ -n "$SMOKE_XVFB_PID" ] && kill "$SMOKE_XVFB_PID" 2>/dev/null || true; }
|
||||
trap cleanup_xvfb EXIT
|
||||
|
||||
# T3: batch AppImage --version exits 0 with non-empty output.
|
||||
echo " T3: batch --version"
|
||||
T3_OUT=$(APPIMAGE_EXTRACT_AND_RUN=1 "$BATCH_OUT" --version 2>&1) || {
|
||||
echo "ERROR: T3 failed — batch AppImage --version exited non-zero" >&2
|
||||
echo "$T3_OUT" >&2
|
||||
exit 1
|
||||
}
|
||||
# Strip EGL/DRM warnings (libEGL warning: failed to open /dev/dri/...) which are advisory.
|
||||
T3_VERSION=$(echo "$T3_OUT" | grep -v 'libEGL warning' | head -1)
|
||||
if [ -z "$T3_VERSION" ]; then
|
||||
echo "ERROR: T3 failed — batch AppImage --version produced no version line" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo " T3: PASS ($T3_VERSION)"
|
||||
|
||||
# T4: GUI AppImage --help exits 0 under headless Xvfb display.
|
||||
echo " T4: gui --help (DISPLAY=$DISPLAY)"
|
||||
APPIMAGE_EXTRACT_AND_RUN=1 "$GUI_OUT" --help >"$BUILD_DIR/sethlabels-gui-help.txt" 2>&1 || {
|
||||
echo "ERROR: T4 failed — GUI AppImage --help exited non-zero" >&2
|
||||
cat "$BUILD_DIR/sethlabels-gui-help.txt" >&2
|
||||
exit 1
|
||||
}
|
||||
echo " T4: PASS"
|
||||
|
||||
echo ""
|
||||
echo "Artifacts:"
|
||||
echo " $GUI_OUT"
|
||||
echo " $BATCH_OUT"
|
||||
Executable
+92
@@ -0,0 +1,92 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build the sethLabels .deb package.
|
||||
#
|
||||
# Pipeline (spec §5.2):
|
||||
# 1. sanity check build host (Debian/Ubuntu, deps present)
|
||||
# 2. strict-zero guardrail
|
||||
# 3. compute version
|
||||
# 4. out-of-tree cmake build
|
||||
# 5. CPack with overrides
|
||||
# 6. inline smoke tests T1, T2
|
||||
# 7. print artifact path for the operator
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.2
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
echo "==> [1/6] Sanity check build host"
|
||||
"$REPO_ROOT/scripts/lib/deps-debian.sh"
|
||||
|
||||
echo "==> [2/6] Strict-zero guardrail"
|
||||
"$REPO_ROOT/scripts/check-no-upstream-edits.sh"
|
||||
|
||||
echo "==> [3/6] Compute version"
|
||||
VERSION="$("$REPO_ROOT/scripts/compute-version.sh")"
|
||||
echo " VERSION = $VERSION"
|
||||
|
||||
echo "==> [4/6] Out-of-tree cmake build"
|
||||
BUILD_DIR="$REPO_ROOT/build/deb"
|
||||
rm -rf "${BUILD_DIR:?BUILD_DIR must not be empty}"
|
||||
mkdir -p "$BUILD_DIR"
|
||||
cmake -S "$REPO_ROOT" -B "$BUILD_DIR" -G Ninja -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build "$BUILD_DIR" --parallel
|
||||
|
||||
echo "==> [5/6] CPack DEB generation"
|
||||
# shellcheck disable=SC1091
|
||||
source "$REPO_ROOT/packaging/deb-metadata.env"
|
||||
|
||||
cd "$BUILD_DIR"
|
||||
cpack -G DEB \
|
||||
-D CPACK_PACKAGE_NAME="$PACKAGE_NAME" \
|
||||
-D CPACK_PACKAGE_VERSION="$VERSION" \
|
||||
-D CPACK_DEBIAN_PACKAGE_NAME="$PACKAGE_NAME" \
|
||||
-D CPACK_DEBIAN_PACKAGE_MAINTAINER="$MAINTAINER" \
|
||||
-D CPACK_DEBIAN_PACKAGE_SECTION="$SECTION" \
|
||||
-D CPACK_DEBIAN_PACKAGE_HOMEPAGE="$HOMEPAGE" \
|
||||
-D CPACK_DEBIAN_PACKAGE_SHLIBDEPS=ON \
|
||||
-D CPACK_DEBIAN_FILE_NAME=DEB-DEFAULT
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
# Resolve the actual artifact filename (CPack uses DEB-DEFAULT naming convention).
|
||||
DEB_ARTIFACT=$(ls "$BUILD_DIR"/${PACKAGE_NAME}_*.deb 2>/dev/null | head -1)
|
||||
if [ -z "$DEB_ARTIFACT" ] || [ ! -f "$DEB_ARTIFACT" ]; then
|
||||
echo "ERROR: expected .deb artifact not found in $BUILD_DIR" >&2
|
||||
ls -la "$BUILD_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "==> [6/6] Smoke tests"
|
||||
|
||||
# T1: dpkg-deb --info parses, version field matches.
|
||||
echo " T1: dpkg-deb --info"
|
||||
T1_OUT=$(dpkg-deb --info "$DEB_ARTIFACT")
|
||||
if ! echo "$T1_OUT" | grep -qE "^ Version: ${VERSION}$"; then
|
||||
echo "ERROR: T1 failed — version field in .deb does not match \$VERSION=$VERSION" >&2
|
||||
echo "$T1_OUT" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo " T1: PASS"
|
||||
|
||||
# T2: dpkg-deb --contents includes both binaries.
|
||||
echo " T2: dpkg-deb --contents"
|
||||
T2_OUT=$(dpkg-deb --contents "$DEB_ARTIFACT")
|
||||
if ! echo "$T2_OUT" | grep -q '/usr/bin/glabels-qt'; then
|
||||
echo "ERROR: T2 failed — /usr/bin/glabels-qt missing from .deb" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ! echo "$T2_OUT" | grep -q '/usr/bin/glabels-batch-qt'; then
|
||||
echo "ERROR: T2 failed — /usr/bin/glabels-batch-qt missing from .deb" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo " T2: PASS"
|
||||
|
||||
# Optional: lintian (warnings-only, non-fatal during battle-test).
|
||||
if command -v lintian >/dev/null 2>&1; then
|
||||
echo " lintian (advisory):"
|
||||
lintian "$DEB_ARTIFACT" || true
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Artifact: $DEB_ARTIFACT"
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env bash
|
||||
# Enforce Invariant I1: no upstream-tracked file is ever edited.
|
||||
# Exits 0 on clean state, 1 on violation.
|
||||
#
|
||||
# Catches BOTH committed drift (commits unique to HEAD vs upstream/master)
|
||||
# AND working-tree drift (uncommitted local edits to tracked files).
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.5 (I1, F1)
|
||||
set -euo pipefail
|
||||
|
||||
# Refuse to run silently if upstream/master ref is missing (spec §F1 — the
|
||||
# guardrail's contract is "abort on drift," not "abort on drift IF the ref
|
||||
# happens to be present"). Without this check, a fresh clone or
|
||||
# broken-remote environment would silently pass the committed-drift check.
|
||||
if ! git rev-parse --verify upstream/master >/dev/null 2>&1; then
|
||||
echo "ERROR: upstream/master ref not found." >&2
|
||||
echo " Configure the upstream remote and fetch:" >&2
|
||||
echo " git remote add upstream https://github.com/j-evins/glabels-qt.git" >&2
|
||||
echo " git fetch upstream" >&2
|
||||
echo " See sethlabels-docs/specs/2026-04-29-packaging-design.md §6 (release flow step 1)." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Allowlist: files/dirs sethLabels is permitted to add or modify.
|
||||
# `.gitignore` is the one upstream-file exception (called out in spec §2).
|
||||
allowed_pattern='^\.gitignore$|^\.claude/|^scripts/|^packaging/|^sethlabels-docs/|^tests-impl/|^README\.sethlabels\.md$|^CLAUDE\.md$|^IDEA\.md$|^DECISIONS\.md$'
|
||||
|
||||
committed=$(git diff --name-only upstream/master..HEAD 2>/dev/null || true)
|
||||
working=$(git diff --name-only HEAD 2>/dev/null || true)
|
||||
|
||||
all_changes=$(printf "%s\n%s\n" "$committed" "$working" | sort -u | sed '/^$/d')
|
||||
|
||||
if [ -z "$all_changes" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
violations=$(echo "$all_changes" | grep -vE "$allowed_pattern" || true)
|
||||
|
||||
if [ -n "$violations" ]; then
|
||||
echo "ERROR: strict-zero policy violated. The following upstream files have been modified:"
|
||||
echo "$violations"
|
||||
echo ""
|
||||
echo "See sethlabels-docs/specs/2026-04-29-packaging-design.md §I1."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Executable
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Emit "<upstream-tag>-seth<N>" version string to stdout.
|
||||
# Pure logic: no side effects.
|
||||
#
|
||||
# CALLER RESPONSIBILITY (per spec §5.4): the local tag db must be fresh.
|
||||
# If invoked outside the release flow, run `git fetch origin --tags` first
|
||||
# or risk a stale <N> value.
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.4 (D4)
|
||||
set -euo pipefail
|
||||
|
||||
upstream_tag=$(git describe --tags --abbrev=0 upstream/master)
|
||||
existing_count=$(git tag --list "${upstream_tag}-seth*" | wc -l | tr -d ' ')
|
||||
next_n=$((existing_count + 1))
|
||||
echo "${upstream_tag}-seth${next_n}"
|
||||
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
# Single source of truth for sethLabels build dependencies on Debian-family Linux.
|
||||
#
|
||||
# When SOURCED: exposes SETHLABELS_DEPS array (no side effects).
|
||||
# When EXECUTED: verifies each dep is installed; prints actionable
|
||||
# `sudo apt install ...` command on missing deps; exits 1.
|
||||
# On clean state, prints "All build dependencies present." and exits 0.
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §5.1
|
||||
set -euo pipefail
|
||||
|
||||
SETHLABELS_DEPS=(
|
||||
build-essential cmake ninja-build pkg-config
|
||||
qt6-base-dev qt6-base-dev-tools
|
||||
qt6-svg-dev
|
||||
qt6-tools-dev qt6-tools-dev-tools
|
||||
qt6-l10n-tools
|
||||
libqt6printsupport6 libqt6svg6 libqt6widgets6 libqt6xml6 libqt6gui6
|
||||
libqt6concurrent6 libqt6core6t64 libqt6test6
|
||||
zlib1g-dev libqrencode-dev libzint-dev
|
||||
file dpkg-dev fakeroot
|
||||
wget
|
||||
bats
|
||||
xvfb
|
||||
)
|
||||
|
||||
# Detect sourced vs. executed.
|
||||
# When sourced: BASH_SOURCE[0] != $0
|
||||
# When executed: BASH_SOURCE[0] == $0
|
||||
if [ "${BASH_SOURCE[0]}" != "${0}" ]; then
|
||||
return 0 2>/dev/null || exit 0
|
||||
fi
|
||||
|
||||
# --- Executed path ---
|
||||
|
||||
# Sanity check the build host
|
||||
if [ ! -f /etc/os-release ]; then
|
||||
echo "WARNING: /etc/os-release missing; not Debian-family. This script is designed for Debian 13 / Ubuntu LTS." >&2
|
||||
fi
|
||||
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
if [[ "${ID:-}" != "debian" && "${ID:-}" != "ubuntu" ]] && [[ "${ID_LIKE:-}" != *debian* && "${ID_LIKE:-}" != *ubuntu* ]]; then
|
||||
echo "WARNING: not running on Debian or Ubuntu (detected ID='${ID:-unknown}'). Build deps may differ." >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
missing=()
|
||||
for pkg in "${SETHLABELS_DEPS[@]}"; do
|
||||
if ! dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -q "install ok installed"; then
|
||||
missing+=("$pkg")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "${#missing[@]}" -gt 0 ]; then
|
||||
echo "Missing build dependencies (${#missing[@]}):"
|
||||
for p in "${missing[@]}"; do
|
||||
echo " - $p"
|
||||
done
|
||||
echo ""
|
||||
echo "Install with:"
|
||||
echo " sudo apt install -y ${missing[*]}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "All build dependencies present (${#SETHLABELS_DEPS[@]} packages verified)."
|
||||
Executable
+50
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
# Bootstrap linuxdeploy + linuxdeploy-plugin-qt to a script-local cache.
|
||||
#
|
||||
# When SOURCED: exposes $LINUXDEPLOY_BIN and $LINUXDEPLOY_PLUGIN_QT_BIN paths
|
||||
# (downloads on first run if missing).
|
||||
# When EXECUTED: ensures both binaries are present and prints their paths.
|
||||
#
|
||||
# Pinned per spec §F9 — version bumps are deliberate, not transparent.
|
||||
# To bump: re-run discovery (Task 5 Step 1 of the implementation plan), update
|
||||
# the two TAG variables below, and verify a fresh AppImage build.
|
||||
#
|
||||
# Spec: sethlabels-docs/specs/2026-04-29-packaging-design.md §F9
|
||||
set -euo pipefail
|
||||
|
||||
# === PINNED VERSIONS (update deliberately per F9) ===
|
||||
LINUXDEPLOY_TAG="1-alpha-20251107-1"
|
||||
LINUXDEPLOY_PLUGIN_QT_TAG="1-alpha-20250213-1"
|
||||
# ====================================================
|
||||
|
||||
CACHE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/.cache"
|
||||
LINUXDEPLOY_BIN="$CACHE_DIR/linuxdeploy-${LINUXDEPLOY_TAG}-x86_64.AppImage"
|
||||
LINUXDEPLOY_PLUGIN_QT_BIN="$CACHE_DIR/linuxdeploy-plugin-qt-${LINUXDEPLOY_PLUGIN_QT_TAG}-x86_64.AppImage"
|
||||
|
||||
LINUXDEPLOY_URL="https://github.com/linuxdeploy/linuxdeploy/releases/download/${LINUXDEPLOY_TAG}/linuxdeploy-x86_64.AppImage"
|
||||
LINUXDEPLOY_PLUGIN_QT_URL="https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/${LINUXDEPLOY_PLUGIN_QT_TAG}/linuxdeploy-plugin-qt-x86_64.AppImage"
|
||||
|
||||
ensure_tool() {
|
||||
local url="$1" out="$2" label="$3"
|
||||
if [ -x "$out" ]; then
|
||||
return 0
|
||||
fi
|
||||
mkdir -p "$(dirname "$out")"
|
||||
echo "Downloading $label from $url ..." >&2
|
||||
if ! wget -q --show-progress -O "$out" "$url"; then
|
||||
echo "ERROR: download failed for $label ($url)" >&2
|
||||
rm -f "$out"
|
||||
return 1
|
||||
fi
|
||||
chmod +x "$out"
|
||||
}
|
||||
|
||||
ensure_tool "$LINUXDEPLOY_URL" "$LINUXDEPLOY_BIN" "linuxdeploy"
|
||||
ensure_tool "$LINUXDEPLOY_PLUGIN_QT_URL" "$LINUXDEPLOY_PLUGIN_QT_BIN" "linuxdeploy-plugin-qt"
|
||||
|
||||
export LINUXDEPLOY_BIN LINUXDEPLOY_PLUGIN_QT_BIN
|
||||
|
||||
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
||||
echo "linuxdeploy: $LINUXDEPLOY_BIN"
|
||||
echo "linuxdeploy-plugin-qt: $LINUXDEPLOY_PLUGIN_QT_BIN"
|
||||
fi
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,398 @@
|
||||
# sethLabels Packaging — Design Spec
|
||||
|
||||
- **Status:** approved (brainstormed 2026-04-29, awaiting user review of this document before plan-writing)
|
||||
- **Author:** Seth Freiberg, with assistance from Claude Code
|
||||
- **Audience:** anyone implementing or maintaining sethLabels' packaging/release pipeline
|
||||
- **Project:** [git.sethpc.xyz/Seth/sethLabels](https://git.sethpc.xyz/Seth/sethLabels)
|
||||
- **Upstream:** [github.com/j-evins/glabels-qt](https://github.com/j-evins/glabels-qt) (the glabels.org team)
|
||||
|
||||
## 1. Problem & purpose
|
||||
|
||||
The upstream glabels-qt project explicitly does not publish self-hosted binary releases ("Currently there are no self-hosted binary snapshot releases available… I encourage you to try building the code yourself" — upstream README). sethLabels exists to fill exactly that gap: produce installable binary artifacts for Debian-family Linux and macOS without changing the upstream application itself.
|
||||
|
||||
The eventual goal is to publish sethLabels as a formally public packaging-fork on GitHub once the build/release pipeline is battle-tested. This spec describes the pipeline and discipline that make that possible.
|
||||
|
||||
## 2. Invariants (load-bearing)
|
||||
|
||||
These are not guidelines — they define the project's shape. Violating any of them moves sethLabels toward "real fork" territory and out of "deployment fork."
|
||||
|
||||
| # | Invariant | Why |
|
||||
|---|-----------|-----|
|
||||
| I1 | **Strict zero source patches.** No upstream file is ever edited. Every sethLabels addition lives in NEW files in NEW top-level directories at the repo root. | Makes `git pull --rebase upstream master` always succeed without conflicts (our scaffold commit re-applies cleanly on each new upstream base). Rebase friction = 0. |
|
||||
| I2 | **Debian-family + macOS-via-brew target only.** No homelab-specific paths, hostnames, or assumptions anywhere in scripts. | Build must be reproducible on a clean Debian 13 / Ubuntu LTS VM. Public-fork future depends on this. |
|
||||
| I3 | **Shell scripts under `scripts/` are the canonical build recipe.** CI YAML (when added later at the public-flip) calls these scripts verbatim — no logic in YAML. | Prevents recipe drift between manual builds and CI. The script is the truth. |
|
||||
| I4 | **Manual local builds during battle-test phase.** No CI infrastructure (Gitea Actions, GitHub Actions, self-hosted runner) until the public-flip on GitHub. | Defers infra cost. Iteration speed > automation during exploration. |
|
||||
| I5 | **No branding, icon, splash, or string changes.** sethLabels is a packaging fork, not a rebrand. Artifacts identify as `glabels-qt`. | Per IDEA.md ("branding/customization: minimal — this is for personal use, not a product") and strict-zero. |
|
||||
|
||||
The one exception to I1: `.gitignore` carries an appended sethLabels section. This was a one-time touch made at scaffold time and is treated as a known allowlisted exception throughout this spec.
|
||||
|
||||
## 3. Decisions (settled, with rationale)
|
||||
|
||||
Each decision below was the conclusion of a multiple-choice round during brainstorming. Recorded here so future maintainers can see what alternatives were considered and why the current choice won. See `DECISIONS.md` for the same list in shorter form.
|
||||
|
||||
### D1 — Linux distribution formats: `.deb` AND AppImage
|
||||
|
||||
- **Why:** `.deb` for Debian-family targets (clean apt-managed install/upgrade/uninstall); AppImage as portable fallback for any-Linux-anywhere. AppImage is essentially free once `.deb` works since linuxdeploy reuses upstream's `install()` rules.
|
||||
- **Rejected:** AppImage-only (loses native package manager integration), `.deb`-only (loses portability to non-Debian Linux), Flatpak (heavyweight runtime requirement, overkill for this use case).
|
||||
- **Cost:** AppImage bundling can be finicky around Qt6 plugin discovery — see §8.2 mitigation.
|
||||
|
||||
### D2 — macOS distribution: Homebrew tap, build-from-source
|
||||
|
||||
- **Why:** zero macOS CI requirement (brew runs the build on the user's machine), no $99/yr Apple Developer ID, no notarization pipeline complexity, brew handles Qt6 dependency resolution automatically (`depends_on "qt@6"`).
|
||||
- **Rejected:** unsigned `.dmg` (Gatekeeper friction), signed+notarized `.dmg` (annual cost + CI complexity), tap-with-pre-built-cask (still requires building somewhere, defeats the simplification).
|
||||
- **Constraint accepted:** first-time install on a Mac takes ~5–10 min (cmake build of Qt app from source). Acceptable for a technical user, which is the audience.
|
||||
- **Tap repo:** lives separately at `git.sethpc.xyz/Seth/homebrew-tap`. Not in the sethLabels repo.
|
||||
|
||||
### D3 — Build infrastructure: manual local builds during battle-test
|
||||
|
||||
- **Why:** local feedback loop (~2 min) beats CI feedback loop (push + wait); during iteration on packaging recipes the local loop is essential. Scripts written for manual use translate to CI workflow YAML mechanically when needed.
|
||||
- **Rejected:** Gitea Actions self-hosted runner (homelab CT spin-up cost not justified pre-public), public GitHub Actions from day one (skips the "battle-test in private" intent).
|
||||
- **Forward path:** at public-flip on GitHub, scripts get wrapped in a `.github/workflows/release.yml` that calls them — no logic moves into YAML.
|
||||
- **Build host expectation:** scripts must run on a clean Debian 13 / Ubuntu LTS box. Steel141 is acceptable as a build host but is not the target audience for resulting binaries.
|
||||
|
||||
### D4 — Versioning: `<upstream-tag>-seth<N>`
|
||||
|
||||
- **Why:** lineage in the version answers "which upstream am I running?" without changelog spelunking. Rebuild counter (`seth1` → `seth2`) lets us ship a packaging-only fix without lying about which upstream code is inside. Sorts correctly under `dpkg --compare-versions`.
|
||||
- **Format:** `<upstream-tag>` = output of `git describe --tags --abbrev=0 upstream/master` (e.g., `3.99-master618`). `<N>` = count of existing `<upstream-tag>-seth*` tags + 1.
|
||||
- **Rejected:** plain upstream tag (no way to distinguish v1 of the .deb from v2 after a packaging fix), independent semver (loses upstream-lineage info), date-based (loses both lineage and rebuild-counter info).
|
||||
|
||||
### D5 — Upstream-touch policy: strict zero
|
||||
|
||||
- **Why:** the IDEA brief explicitly calls for "diff small enough to rebase periodically." Strict zero takes that to its limit. CPack metadata is overridable via `cpack -D KEY=VALUE` flags at build time — no source edit required to package. Any future need for a CMake gap should be upstreamed as a PR to glabels-qt rather than carried as a local patch.
|
||||
- **Rejected:** permissive small-patches (creates rebase friction), strict-zero with a CMakeLists carve-out (the carve-out is not actually needed, since CPack `-D` covers everything we want).
|
||||
- **Enforcement:** `scripts/check-no-upstream-edits.sh` runs as a guardrail; allowlist = `.gitignore` only.
|
||||
|
||||
### D6 — Package name: `glabels-qt`
|
||||
|
||||
- **Why:** consistent muscle memory across `.deb`, AppImage, brew formula, and the binary the user runs. The "sethLabels" identity lives at the repo level + in the version string's `-seth<N>` marker, not in the package name. Future-proofs the public-fork narrative as "yet another packaging fork of glabels-qt."
|
||||
- **Rejected:** `sethlabels` (would split identity from binary name, since strict-zero means we can't rename the executable; `apt install sethlabels` then `glabels-qt` is confusing).
|
||||
- **Risk acknowledged:** if Debian later ships an official `glabels-qt` package, our sethLabels-versioned variant would still dominate by version-sort (`3.99-master618-seth1` > `3.99`-something-debian). Re-evaluate at that time.
|
||||
|
||||
## 4. Repo layout
|
||||
|
||||
The post-spec layout. Existing entries reflect what's already in the repo at `2026-04-29`. NEW entries are introduced by the spec implementation.
|
||||
|
||||
```
|
||||
sethLabels/
|
||||
├── (all upstream files — strict zero, never touched)
|
||||
│ ├── glabels/, glabels-batch/, model/, backends/, ...
|
||||
│ ├── CMakeLists.txt, README.md, LICENSE, ...
|
||||
│ ├── data/, templates/, translations/, user-docs/
|
||||
│ └── docs/ ← upstream's docs dir, never written into
|
||||
│
|
||||
├── .gitignore ← I1 exception: sethLabels section appended
|
||||
│
|
||||
├── CLAUDE.md ← already present (project instructions)
|
||||
├── IDEA.md ← already present (plain-language brief)
|
||||
├── DECISIONS.md ← already present (decision log)
|
||||
├── GITEA_API.md ← already present (gitignored symlink)
|
||||
├── README.sethlabels.md ← NEW: fork purpose, install/build entry
|
||||
│
|
||||
├── scripts/ ← NEW: canonical build recipe (I3)
|
||||
│ ├── README.md ← human-readable run instructions
|
||||
│ ├── build-deb.sh ← entry: builds the .deb
|
||||
│ ├── build-appimages.sh ← entry: builds the 2 AppImages
|
||||
│ ├── compute-version.sh ← emits "<upstream-tag>-seth<N>"
|
||||
│ ├── check-no-upstream-edits.sh ← guardrail enforcing I1
|
||||
│ └── lib/
|
||||
│ ├── deps-debian.sh ← apt-installable build deps
|
||||
│ └── linuxdeploy.sh ← downloads/caches linuxdeploy + qt plugin
|
||||
│
|
||||
├── packaging/ ← NEW: data files consumed by scripts
|
||||
│ ├── deb-metadata.env ← maintainer, section, depends fallback
|
||||
│ ├── appimage-recipe.env ← linuxdeploy plugin allowlist, exclude list
|
||||
│ └── changelog.md ← human-readable per-release notes
|
||||
│
|
||||
├── sethlabels-docs/ ← NEW: sethLabels' own docs (this spec lives here)
|
||||
│ └── specs/
|
||||
│ └── 2026-04-29-packaging-design.md ← THIS file
|
||||
│
|
||||
└── .claude/ ← already present
|
||||
└── handoffs/
|
||||
└── 2026-04-29-125823-scaffold-only.md
|
||||
```
|
||||
|
||||
Companion repository (separate Gitea repo, not part of sethLabels):
|
||||
|
||||
```
|
||||
homebrew-tap/ ← git.sethpc.xyz/Seth/homebrew-tap
|
||||
├── README.md
|
||||
└── Formula/
|
||||
└── glabels-qt.rb ← brew formula
|
||||
```
|
||||
|
||||
## 5. Build pipeline
|
||||
|
||||
### 5.1 Build host requirements
|
||||
|
||||
Either a clean Debian 13 (Trixie) or Ubuntu 24.04 LTS box. The build host produces both the `.deb` and the AppImage artifacts; one machine, two scripts.
|
||||
|
||||
`scripts/lib/deps-debian.sh` is the single source of truth for build dependencies and prints an actionable `apt install …` command when something is missing. Expected dependency set:
|
||||
|
||||
```
|
||||
build-essential cmake ninja-build pkg-config
|
||||
qt6-base-dev qt6-base-dev-tools qt6-svg-dev qt6-tools-dev qt6-tools-dev-tools
|
||||
qt6-l10n-tools libqt6printsupport6 libqt6svg6 libqt6widgets6 libqt6xml6 libqt6gui6
|
||||
libqt6concurrent6 libqt6core6 libqt6test6
|
||||
zlib1g-dev libqrencode-dev libzint-dev libgnubarcode-dev
|
||||
file dpkg-dev fakeroot
|
||||
wget # for downloading linuxdeploy on first AppImage build
|
||||
```
|
||||
|
||||
`linuxdeploy` and `linuxdeploy-plugin-qt` are downloaded by `scripts/lib/linuxdeploy.sh` to a script-local cache (e.g., `scripts/.cache/linuxdeploy-x86_64.AppImage`) on first run. They are not apt-installable on Debian/Ubuntu, hence the bootstrap step. Cache is gitignored.
|
||||
|
||||
### 5.2 `scripts/build-deb.sh`
|
||||
|
||||
Sequential steps. Any non-zero exit aborts the build with a clear error message.
|
||||
|
||||
1. **Sanity check the build host:** confirm Debian-family (`/etc/os-release` ID is `debian` or `ubuntu`), confirm all `deps-debian.sh` packages are installed.
|
||||
2. **Strict-zero guardrail:** call `check-no-upstream-edits.sh`. If any tracked-upstream file diverges from `upstream/master` (allowlist: `.gitignore`), abort.
|
||||
3. **Compute version:** `VERSION=$(./scripts/compute-version.sh)`.
|
||||
4. **Out-of-tree build:**
|
||||
```
|
||||
cmake -S . -B build/deb -G Ninja -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build build/deb --parallel
|
||||
```
|
||||
5. **Run CPack with overrides:**
|
||||
```
|
||||
cd build/deb && cpack -G DEB \
|
||||
-D CPACK_PACKAGE_VERSION="$VERSION" \
|
||||
-D CPACK_DEBIAN_PACKAGE_MAINTAINER="$(. ../../packaging/deb-metadata.env && echo "$MAINTAINER")" \
|
||||
-D CPACK_DEBIAN_PACKAGE_SECTION="graphics" \
|
||||
-D CPACK_DEBIAN_PACKAGE_SHLIBDEPS=ON \
|
||||
-D CPACK_DEBIAN_PACKAGE_HOMEPAGE="https://glabels.org" \
|
||||
-D CPACK_DEBIAN_FILE_NAME=DEB-DEFAULT
|
||||
```
|
||||
`CPACK_DEBIAN_PACKAGE_SHLIBDEPS=ON` runs `dpkg-shlibdeps` against built binaries to compute exact runtime library deps automatically. This avoids hand-maintaining a Depends list.
|
||||
6. **Smoke test the artifact:**
|
||||
- `dpkg-deb --info build/deb/glabels-qt_${VERSION}_amd64.deb` — verifies parse-ability.
|
||||
- `dpkg-deb --contents …` checked for both `/usr/bin/glabels-qt` and `/usr/bin/glabels-batch-qt`.
|
||||
- `lintian build/deb/glabels-qt_${VERSION}_amd64.deb` if available — warnings noted but not fatal during battle-test.
|
||||
7. **Artifact path printed for the operator** to upload: `build/deb/glabels-qt_${VERSION}_amd64.deb`.
|
||||
|
||||
### 5.3 `scripts/build-appimages.sh`
|
||||
|
||||
1. Same sanity / guardrail / version-compute steps as 5.2.
|
||||
2. **Out-of-tree build into `build/appimage`:**
|
||||
```
|
||||
cmake -S . -B build/appimage -G Ninja -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr
|
||||
cmake --build build/appimage --parallel
|
||||
```
|
||||
3. **Stage install tree to `AppDir`:**
|
||||
```
|
||||
DESTDIR=$(pwd)/build/appimage/AppDir cmake --install build/appimage
|
||||
```
|
||||
`AppDir/usr/bin/glabels-qt` and `AppDir/usr/bin/glabels-batch-qt` exist after this step (driven by upstream's existing `install()` rules).
|
||||
4. **Bundle GUI AppImage:**
|
||||
```
|
||||
linuxdeploy --appdir build/appimage/AppDir --plugin qt \
|
||||
--executable build/appimage/AppDir/usr/bin/glabels-qt \
|
||||
--desktop-file build/appimage/AppDir/usr/share/applications/org.glabels.glabels-qt.desktop \
|
||||
--icon-file build/appimage/AppDir/usr/share/icons/hicolor/scalable/apps/glabels.svg \
|
||||
--output appimage
|
||||
mv glabels-qt-x86_64.AppImage sethlabels-gui-${VERSION}-x86_64.AppImage
|
||||
```
|
||||
5. **Bundle Batch AppImage** — re-stage AppDir (or use a separate `AppDir-batch`) to avoid pulling GUI-only Qt plugins into the batch bundle:
|
||||
```
|
||||
linuxdeploy --appdir build/appimage/AppDir-batch --plugin qt \
|
||||
--executable build/appimage/AppDir-batch/usr/bin/glabels-batch-qt \
|
||||
--output appimage
|
||||
mv glabels-batch-qt-x86_64.AppImage sethlabels-batch-${VERSION}-x86_64.AppImage
|
||||
```
|
||||
Note: the batch CLI doesn't need a desktop file or icon (no GUI launcher).
|
||||
6. **Smoke tests:**
|
||||
- `./sethlabels-batch-${VERSION}-x86_64.AppImage --version` — must exit 0 and print a version string.
|
||||
- `QT_QPA_PLATFORM=minimal ./sethlabels-gui-${VERSION}-x86_64.AppImage --help` — must exit 0 (validates that the Qt plugin set is complete enough to start a headless Qt event loop).
|
||||
7. **Artifact paths printed for the operator** to upload.
|
||||
|
||||
### 5.4 `scripts/compute-version.sh`
|
||||
|
||||
Pure logic, no side effects. Emits version string to stdout.
|
||||
|
||||
```
|
||||
upstream_tag=$(git describe --tags --abbrev=0 upstream/master)
|
||||
existing_count=$(git tag --list "${upstream_tag}-seth*" | wc -l)
|
||||
next_n=$((existing_count + 1))
|
||||
echo "${upstream_tag}-seth${next_n}"
|
||||
```
|
||||
|
||||
**Caller responsibility:** the local tag db must be fresh before running this script — `git tag --list` reads local refs only. The release flow (§6 step 1) does `git fetch --all --tags` to satisfy this. If invoked outside the release flow, the caller must run `git fetch origin --tags` first or risk a stale `<N>` value.
|
||||
|
||||
The script is idempotent: running it multiple times before a new tag is created always returns the same value. Both `build-deb.sh` and `build-appimages.sh` call this internally to embed the version into their artifacts. Step 6 of the release flow re-invokes it to obtain `$VERSION` for the `git tag` command — values agree by purity.
|
||||
|
||||
### 5.5 `scripts/check-no-upstream-edits.sh`
|
||||
|
||||
The script must catch BOTH committed and uncommitted edits to upstream files. Two checks:
|
||||
|
||||
1. **Committed drift** — files changed in commits unique to `HEAD` vs. `upstream/master`:
|
||||
```
|
||||
committed=$(git diff --name-only upstream/master..HEAD)
|
||||
```
|
||||
2. **Working-tree drift** — uncommitted local edits to tracked files:
|
||||
```
|
||||
working=$(git diff --name-only HEAD)
|
||||
```
|
||||
|
||||
Both lists are filtered against the same allowlist. Any path NOT matching is a violation.
|
||||
|
||||
```
|
||||
allowed_pattern='^\.gitignore$|^\.claude/|^scripts/|^packaging/|^sethlabels-docs/|^README\.sethlabels\.md$|^CLAUDE\.md$|^IDEA\.md$|^DECISIONS\.md$'
|
||||
all_changes=$(printf "%s\n%s\n" "$committed" "$working" | sort -u | sed '/^$/d')
|
||||
violations=$(echo "$all_changes" | grep -vE "$allowed_pattern" || true)
|
||||
if [ -n "$violations" ]; then
|
||||
echo "ERROR: strict-zero policy violated. The following upstream files have been modified:"
|
||||
echo "$violations"
|
||||
echo "See sethlabels-docs/specs/2026-04-29-packaging-design.md §I1."
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
Exit 0 silently on clean state.
|
||||
|
||||
Allowlist note: `GITEA_API.md` is intentionally NOT in the allowlist because it is `.gitignore`-excluded and will never appear in any git diff. Including it would be dead code.
|
||||
|
||||
## 6. Release flow
|
||||
|
||||
```
|
||||
1. git fetch --all --tags (refreshes upstream commits AND local tag db, which compute-version.sh reads)
|
||||
2. git rebase upstream/master (strict-zero ⇒ always succeeds without conflicts; scaffold commit re-applies on new base)
|
||||
3. ./scripts/check-no-upstream-edits.sh (guardrail; aborts on drift)
|
||||
4. ./scripts/build-deb.sh (~2 min)
|
||||
5. ./scripts/build-appimages.sh (~5 min, two AppImages)
|
||||
6. VERSION=$(./scripts/compute-version.sh)
|
||||
7. git tag "$VERSION"
|
||||
8. git push origin main --tags
|
||||
9. Create Gitea release for tag $VERSION via gitea CLI / API; attach:
|
||||
- build/deb/glabels-qt_${VERSION}_amd64.deb
|
||||
- sethlabels-gui-${VERSION}-x86_64.AppImage
|
||||
- sethlabels-batch-${VERSION}-x86_64.AppImage
|
||||
10. Edit ../homebrew-tap/Formula/glabels-qt.rb:
|
||||
- bump tag pin to $VERSION
|
||||
- update sha256 of the source tarball
|
||||
- commit "bump glabels-qt to $VERSION", push
|
||||
11. Smoke verify: download .deb on a fresh Debian 13 VM, install with `apt install ./...`, run `glabels-qt --version`.
|
||||
```
|
||||
|
||||
The release flow is human-driven during the battle-test phase. Each step's output is visible; failures are immediately diagnosable. When the public-flip happens, steps 4, 5, 9, 10 move into a GitHub Actions `.github/workflows/release.yml` that triggers on tag push and runs the same scripts unmodified.
|
||||
|
||||
## 7. Homebrew tap
|
||||
|
||||
### 7.1 Tap repo layout
|
||||
|
||||
```
|
||||
homebrew-tap/ (separate Gitea repo: git.sethpc.xyz/Seth/homebrew-tap)
|
||||
├── README.md (instructions: how to tap, how to install)
|
||||
└── Formula/
|
||||
└── glabels-qt.rb (the formula)
|
||||
```
|
||||
|
||||
### 7.2 Initial formula (starting point — finalized during plan execution)
|
||||
|
||||
```ruby
|
||||
class GlabelsQt < Formula
|
||||
desc "gLabels Label Designer (Qt/C++) — Seth's packaging fork"
|
||||
homepage "https://glabels.org"
|
||||
url "https://git.sethpc.xyz/Seth/sethLabels.git",
|
||||
tag: "3.99-master618-seth1",
|
||||
revision: "<placeholder, filled at first release>"
|
||||
license "GPL-3.0-only"
|
||||
head "https://git.sethpc.xyz/Seth/sethLabels.git", branch: "main"
|
||||
|
||||
depends_on "cmake" => :build
|
||||
depends_on "ninja" => :build
|
||||
depends_on "pkgconf" => :build
|
||||
depends_on "qt"
|
||||
depends_on "zlib"
|
||||
depends_on "qrencode" => :recommended # optional barcode backend
|
||||
depends_on "zint" => :recommended # optional barcode backend
|
||||
|
||||
def install
|
||||
system "cmake", "-S", ".", "-B", "build",
|
||||
"-G", "Ninja",
|
||||
"-DCMAKE_BUILD_TYPE=Release",
|
||||
*std_cmake_args
|
||||
system "cmake", "--build", "build"
|
||||
system "cmake", "--install", "build"
|
||||
end
|
||||
|
||||
test do
|
||||
assert_match "gLabels", shell_output("#{bin}/glabels-batch-qt --version")
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
### 7.3 User install path (macOS)
|
||||
|
||||
```
|
||||
brew tap seth/tap https://git.sethpc.xyz/Seth/homebrew-tap.git
|
||||
brew install seth/tap/glabels-qt
|
||||
```
|
||||
|
||||
The explicit URL form is required because brew defaults to GitHub for tap names. Documented in the tap's README. When the public-flip moves sethLabels (and the tap) to GitHub, the URL becomes the implicit GitHub default and the tap command shortens to `brew tap seth/tap`.
|
||||
|
||||
### 7.4 Tap maintenance per release
|
||||
|
||||
Single commit per release on the tap repo: bump `tag:` and `revision:` fields in `glabels-qt.rb`. No other edits expected.
|
||||
|
||||
## 8. Failure modes & guardrails
|
||||
|
||||
| # | Risk | Guardrail |
|
||||
|---|------|-----------|
|
||||
| F1 | Strict-zero policy creep | `check-no-upstream-edits.sh` runs at the start of each build script; allowlist explicit (see §5.5) |
|
||||
| F2 | AppImage Qt plugin omissions (image formats, platform plugin) | linuxdeploy-plugin-qt covers most cases; smoke test (§5.3 step 6) launches each AppImage with `QT_QPA_PLATFORM=minimal` and verifies exit code |
|
||||
| F3 | Build env drift (worked on steel141, fails on clean Debian 13 VM) | `deps-debian.sh` is the single source of truth for build deps; scripts fail fast on missing pkg with actionable apt-install command. Recommend re-validating on a fresh VM before each release. |
|
||||
| F4 | Brew formula source URL changes (Gitea → GitHub on public flip) | Single-line edit in `glabels-qt.rb`; tap repo has its own commit history so the flip is one commit. Document the URL-flip in tap repo's README. |
|
||||
| F5 | Re-package counter (`seth<N>`) collisions | Computed from existing tags via `git tag --list`, not from a state file; race-free under serial single-author releases. |
|
||||
| F6 | Manual-build script rot | `scripts/README.md` documents required commands; future CI workflow YAML calls scripts directly — preventing recipe drift. Each release flow re-exercises the scripts. |
|
||||
| F7 | Upstream rebase fails with conflicts (strict-zero broken without `check-no-upstream-edits.sh` having caught it) | Recover from a clean state in worst case: `git reset --hard upstream/master` then re-apply our scaffold commit by cherry-picking from `origin/main`. The single scaffold commit is the only thing to preserve. |
|
||||
| F8 | dpkg-shlibdeps mis-detects a runtime dep, producing a `.deb` that won't install on a target system | Mitigation: smoke-test install on a clean Debian 13 VM as part of release flow (§6 step 11). If a false positive surfaces, override via `CPACK_DEBIAN_PACKAGE_DEPENDS` flag in `build-deb.sh`. |
|
||||
| F9 | linuxdeploy or linuxdeploy-plugin-qt version drift breaks AppImage builds | `lib/linuxdeploy.sh` pins specific GitHub release versions; version bumps are deliberate, not transparent. |
|
||||
|
||||
## 9. Out of scope (explicit)
|
||||
|
||||
- **Windows packaging** — deferred per project brief. Upstream's NSIS support remains untouched and works for anyone who wants to build their own.
|
||||
- **macOS `.dmg`, signed binaries, notarization** — replaced by Homebrew tap building from source.
|
||||
- **Flatpak, Snap** — heavier infrastructure than warranted for the audience.
|
||||
- **Arch AUR package** — already exists per upstream README (community-maintained `glabels-qt-git`).
|
||||
- **Distribution to Debian official repos / backports / PPA / Ubuntu universe** — would require Debian Developer mentorship + ongoing policy compliance work; not the current goal.
|
||||
- **Custom default templates baked into the package** — strict-zero forbids this. User-specific templates live in `~/.config/glabels-qt/templates/` outside the package, or in a future separate repo.
|
||||
- **Branding, icon, splash, or string changes** — strict-zero forbids this.
|
||||
- **Automated CI infrastructure (Gitea Actions runner, GitHub Actions, etc.) during the battle-test phase** — manual local builds. Reconsider at public-flip on GitHub.
|
||||
- **GUI source changes of any kind** — strict-zero forbids this.
|
||||
- **Repackaging upstream's existing tag-snapshot binaries** — we always build from source, never relabel upstream artifacts.
|
||||
|
||||
## 10. Smoke test definitions
|
||||
|
||||
The acceptance test for any release. All four must pass before a tag is pushed.
|
||||
|
||||
| # | Test | Pass condition |
|
||||
|---|------|----------------|
|
||||
| T1 | `dpkg-deb --info <deb>` parses and shows the correct version field | exit 0; version line matches `$VERSION` |
|
||||
| T2 | `dpkg-deb --contents <deb>` includes both binaries | both `/usr/bin/glabels-qt` and `/usr/bin/glabels-batch-qt` present |
|
||||
| T3 | `<batch-appimage> --version` runs | exit 0; output is non-empty |
|
||||
| T4 | `QT_QPA_PLATFORM=minimal <gui-appimage> --help` runs | exit 0 |
|
||||
| T5 (release-flow) | Install `.deb` on a clean Debian 13 VM, run `glabels-qt --version` | exit 0; version line matches `$VERSION` |
|
||||
|
||||
T5 is the strongest signal — it validates that `dpkg-shlibdeps` produced a correct depends list and that Qt6 from the system package manager satisfies runtime needs. Run T5 at least once per upstream-tag bump (i.e., on every `seth1` release; can be skipped on `seth2`+ if only packaging metadata changed).
|
||||
|
||||
## 11. Glossary
|
||||
|
||||
- **Deployment fork** — a fork whose only purpose is to ship binaries / install packages. No source-code intent. Diff against upstream is trivial; rebases are fast-forwards.
|
||||
- **Strict zero (I1)** — the discipline that no upstream-tracked file is ever edited. All sethLabels content lives in NEW files in NEW top-level directories.
|
||||
- **Battle-test phase** — the period before sethLabels is published as a formal public fork on GitHub. During this phase: manual builds, no CI, hosted at Gitea.
|
||||
- **Public-flip** — the future event when sethLabels is moved (or dual-hosted) on GitHub as a public packaging fork. Triggers: GitHub Actions added as CI, brew tap source URL flips Gitea→GitHub, README updates.
|
||||
- **Upstream-tag** — output of `git describe --tags --abbrev=0 upstream/master` against the j-evins/glabels-qt master branch. Currently of the form `3.99-master<N>` until upstream tags 4.0.
|
||||
|
||||
## 12. Open questions
|
||||
|
||||
None at spec time. All design questions raised during brainstorming were resolved before writing this document. Future open questions can be added here with their resolution moving to §3 once decided.
|
||||
|
||||
## 13. References
|
||||
|
||||
- [j-evins/glabels-qt README](https://github.com/j-evins/glabels-qt/blob/master/README.md) — the upstream "no binary releases" notice this fork addresses
|
||||
- [`docs/BUILD-INSTRUCTIONS-LINUX.md`](../../docs/BUILD-INSTRUCTIONS-LINUX.md) — upstream's manual build instructions (the manual procedure our scripts automate)
|
||||
- [CMake CPack DEB generator docs](https://cmake.org/cmake/help/latest/cpack_gen/deb.html)
|
||||
- [linuxdeploy + qt plugin](https://github.com/linuxdeploy/linuxdeploy-plugin-qt)
|
||||
- [Homebrew Formula Cookbook](https://docs.brew.sh/Formula-Cookbook)
|
||||
- [Debian version comparison rules](https://www.debian.org/doc/debian-policy/ch-controlfields.html#version)
|
||||
@@ -61,7 +61,6 @@
|
||||
<Template brand="Avery" part="L4785" size="A4" _description="Name badge labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.avery.co.uk/avery/en_gb/Products/Naming/Self-Adhesive-Name-Badges/White-self-adhesive-name-badges_L4785_20.htm"/>
|
||||
<Label-rectangle id="0" width="80mm" height="50mm" round="4mm" x_waste="7.5mm" y_waste="2.5mm">
|
||||
<Markup-margin size="1mm"/>
|
||||
<Layout nx="2" ny="5" x0="18mm" y0="13mm" dx="95mm" dy="55mm"/>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<Template brand="Begalabel" part="RC-50" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-1-2-x-1-Rounded-Corner-Label-p15.html"/>
|
||||
<Label-rectangle id="0" width="1.5in" height="1in" round="0.1in" x_waste="0.05in">
|
||||
<Layout nx="5" ny="10" x0="0.25in" y0="0.5in" dx="1.625in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -13,7 +12,6 @@
|
||||
<Template brand="Begalabel" part="RC-150" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-1-4-x-2-3-8-Address-Labels-Media-Labels-p17.html"/>
|
||||
<Label-rectangle id="0" width="2.375in" height="1.25in" round="0.125in" x_waste="0.05in" y_waste="0.05in">
|
||||
<Layout nx="3" ny="6" x0="0.375in" y0="1.125in" dx="2.66in" dy="1.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -22,7 +20,6 @@
|
||||
<Template brand="Begalabel" part="RC-200" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-3-4-x-1-1-4-Barcode-Labels-Media-Labels-p18.html"/>
|
||||
<Label-rectangle id="0" width="1.75in" height="1.25in" round="0.125in" x_waste="0.05in">
|
||||
<Layout nx="4" ny="8" x0="0.4687in" y0="0.5in" dx="1.9375in" dy="1.25in"/>
|
||||
</Label-rectangle>
|
||||
@@ -31,7 +28,6 @@
|
||||
<Template brand="Begalabel" part="RC-250" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-3-4-x-1-2-Return-Address-Labels-Mailing-Labels-p19.html"/>
|
||||
<Label-rectangle id="0" width="1.75in" height="0.5in" round="0.05in" x_waste="0.05in">
|
||||
<Layout nx="4" ny="20" x0="0.25in" y0="0.5in" dx="2.0625in" dy="0.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -40,7 +36,6 @@
|
||||
<Template brand="Begalabel" part="RC-300" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-1-4-x-3-4-Address-Labels-Mailing-Labels-p20.html"/>
|
||||
<Label-rectangle id="0" width="2.25in" height="0.75in" round="0.095in" waste="0.05in">
|
||||
<Layout nx="3" ny="10" x0="0.375in" y0="0.625in" dx="2.75in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -49,7 +44,6 @@
|
||||
<Template brand="Begalabel" part="RC-350" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-5-8-x-1-Address-Labels-Mailing-Labels-p7.html"/>
|
||||
<Label-rectangle id="0" width="2.625in" height="1in" round="0.125in" x_waste="0.05in">
|
||||
<Layout nx="3" ny="10" x0="0.1875in" y0="0.5in" dx="2.75in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -58,7 +52,6 @@
|
||||
<Template brand="Begalabel" part="RC-400" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-5-8-x-1-1-16-Rounded-Corner-Label-p21.html"/>
|
||||
<Label-rectangle id="0" width="2.625in" height="1.0625in" round="0.07in" x_waste="0.05in">
|
||||
<Layout nx="3" ny="10" x0="0.125in" y0="0.1875in" dx="2.8125in" dy="1.0625in"/>
|
||||
</Label-rectangle>
|
||||
@@ -67,7 +60,6 @@
|
||||
<Template brand="Begalabel" part="RC-450" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-1-2-x-5-Shipping-Labels-Address-Labels-p22.html"/>
|
||||
<Label-rectangle id="0" width="3.5in" height="5in" round="0.1in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="2" x0="0.5in" y0="0.5in" dx="4in" dy="5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -76,7 +68,6 @@
|
||||
<Template brand="Begalabel" part="RC-500" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-3-4-x-1-1-4-Address-Labels-Shipping-Labels-p23.html"/>
|
||||
<Label-rectangle id="0" width="3.75in" height="1.25in" round="0.125in" waste="0.05in">
|
||||
<Layout nx="2" ny="6" x0="0.375in" y0="1.125in" dx="4in" dy="1.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -85,7 +76,6 @@
|
||||
<Template brand="Begalabel" part="RC-550" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-3-4-x-2-Shipping-Labels-Address-Labels-p24.html"/>
|
||||
<Label-rectangle id="0" width="3.75in" height="2in" round="0.125in" waste="0.05in">
|
||||
<Layout nx="2" ny="4" x0="0.375in" y0="1.125in" dx="4in" dy="2.25in"/>
|
||||
</Label-rectangle>
|
||||
@@ -94,7 +84,6 @@
|
||||
<Template brand="Begalabel" part="RC-600" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-3-4-x-3-Shipping-Labels-Address-Labels-p25.html"/>
|
||||
<Label-rectangle id="0" width="3.75in" height="3in" round="0.095in" waste="0.05in">
|
||||
<Layout nx="2" ny="3" x0="0.375in" y0="0.625in" dx="4in" dy="3.375in"/>
|
||||
</Label-rectangle>
|
||||
@@ -103,7 +92,6 @@
|
||||
<Template brand="Begalabel" part="RC-650" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-3-4-x-4-3-4-Shipping-Labels-Address-Labels-p26.html"/>
|
||||
<Label-rectangle id="0" width="3.75in" height="4.75in" round="0.095in" waste="0.05in">
|
||||
<Layout nx="2" ny="2" x0="0.375in" y0="0.625in" dx="4in" dy="5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -112,7 +100,6 @@
|
||||
<Template brand="Begalabel" part="RC-700" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-3-8-x-2-1-3-Name-Badge-Labels-Name-Tag-Labels-p27.html"/>
|
||||
<Label-rectangle id="0" width="3.375in" height="2.3333in" round="0.188in" waste="0.05in">
|
||||
<Layout nx="2" ny="4" x0="0.6875in" y0="0.594in" dx="3.75in" dy="2.52083in"/>
|
||||
</Label-rectangle>
|
||||
@@ -121,7 +108,6 @@
|
||||
<Template brand="Begalabel" part="RC-750" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-7-16-x-15-16-Filing-Labels-File-Folder-Labels-p28.html"/>
|
||||
<Label-rectangle id="0" width="3.4375in" height="0.9375in" round="0.095in" waste="0.05in">
|
||||
<Layout nx="2" ny="9" x0="0.5in" y0="0.5in" dx="4.0625in" dy="1.1328in"/>
|
||||
</Label-rectangle>
|
||||
@@ -130,7 +116,6 @@
|
||||
<Template brand="Begalabel" part="RC-800" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-7-16-x-2-3-Filing-Labels-File-Folder-Labels-p29.html"/>
|
||||
<Label-rectangle id="0" width="3.4375in" height="0.66667in" round="0.095in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="15" x0="0.5in" y0="0.5in" dx="4.0625in" dy="0.66667in"/>
|
||||
</Label-rectangle>
|
||||
@@ -139,7 +124,6 @@
|
||||
<Template brand="Begalabel" part="RC-850" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/-3-x-5-8-Filing-Labels-File-Folder-Labels-p30.html"/>
|
||||
<Label-rectangle id="0" width="3in" height="0.625in" round="0.095in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="16" x0="0.8437in" y0="0.5in" dx="3.8125in" dy="0.625in"/>
|
||||
</Label-rectangle>
|
||||
@@ -148,7 +132,6 @@
|
||||
<Template brand="Begalabel" part="RC-900" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-4-x-2-Rounded-Corner-Label-p31.html"/>
|
||||
<Label-rectangle id="0" width="0.75in" height="2in" round="0.132in" x_waste="0.04in" y_waste="0.05in">
|
||||
<Layout nx="8" ny="5" x0="0.921875in" y0="0.25in" dx="0.8437in" dy="2.1562in"/>
|
||||
</Label-rectangle>
|
||||
@@ -157,7 +140,6 @@
|
||||
<Template brand="Begalabel" part="RC-950" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-1-Shipping-Labels-Address-Labels-p9.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="1in" round="0.064in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="10" x0="0.1875in" y0="0.5in" dx="4.125in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -166,7 +148,6 @@
|
||||
<Template brand="Begalabel" part="RC-1000" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-1-1-2-Shipping-Labels-Address-Labels-p32.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="1.5in" round="0.095in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="6" x0="0.1875in" y0="1in" dx="4.125in" dy="1.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -175,7 +156,6 @@
|
||||
<Template brand="Begalabel" part="RC-1050" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-1-1-3-Shipping-Labels-Address-Labels-p33.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="1.33333in" round="0.095in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="7" x0="0.1875in" y0="0.83333in" dx="4.125in" dy="1.33333in"/>
|
||||
</Label-rectangle>
|
||||
@@ -184,7 +164,6 @@
|
||||
<Template brand="Begalabel" part="RC-1100" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-2-Shipping-Labels-Address-Labels-p10.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="2in" round="0.19in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="5" x0="0.1875in" y0="0.5in" dx="4.125in" dy="2in"/>
|
||||
</Label-rectangle>
|
||||
@@ -193,7 +172,6 @@
|
||||
<Template brand="Begalabel" part="RC-1200" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-3-1-3-Shipping-Labels-Address-Labels-p35.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="3.33333in" round="0.16in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="3" x0="0.1875in" y0="0.5in" dx="4.125in" dy="3.33333in"/>
|
||||
</Label-rectangle>
|
||||
@@ -202,7 +180,6 @@
|
||||
<Template brand="Begalabel" part="RC-1225" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-3-9-16-Label-Rounded-Corner-Label-p72.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="3.5625in" round="0.07in" x_waste="0.04in">
|
||||
<Layout nx="2" ny="3" x0="0.20315in" y0="0.15625in" dx="4.0937in" dy="3.5625in"/>
|
||||
</Label-rectangle>
|
||||
@@ -211,7 +188,6 @@
|
||||
<Template brand="Begalabel" part="RC-1240" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-x-5-Shipping-Labels-Mailing-Labels-p265.html"/>
|
||||
<Label-rectangle id="0" width="4in" height="5in" round="0.11in" x_waste="0.05in">
|
||||
<Layout nx="2" ny="2" x0="0.16667in" y0="0.5in" dx="4.16667in" dy="5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -220,18 +196,14 @@
|
||||
<Template brand="Begalabel" part="RC-1250" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/8-1-8-x-5-Shipping-Labels-p36.html"/>
|
||||
<Label-rectangle id="0" width="8.125in" height="5in" round="0.09in" x_waste="0.05in">
|
||||
<Layout nx="1" ny="2" x0="0.1875in" y0="0.5in" dx="8.125in" dy="5in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
|
||||
<Template brand="Begalabel" part="AC-50" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-1-2-x-1-Label-Angled-Corner-p37.html"/>
|
||||
<Label-rectangle id="0" width="1.5in" height="1in">
|
||||
<Layout nx="5" ny="10" x0="0.5in" y0="0.5in" dx="1.5in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -240,7 +212,6 @@
|
||||
<Template brand="Begalabel" part="AC-100" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-1-2-x-1-2-Label-Angled-Corner-p38.html"/>
|
||||
<Label-rectangle id="0" width="1.5in" height="0.5in">
|
||||
<Layout nx="5" ny="20" x0="0.5in" y0="0.5in" dx="1.5in" dy="0.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -249,7 +220,6 @@
|
||||
<Template brand="Begalabel" part="AC-150" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/17-20-x-11-15-Label-Angled-Corner-p39.html"/>
|
||||
<Label-rectangle id="0" width="0.85in" height="0.7333in">
|
||||
<Layout nx="10" ny="15" x0="0in" y0="0in" dx="0.85in" dy="0.7333in"/>
|
||||
</Label-rectangle>
|
||||
@@ -258,7 +228,6 @@
|
||||
<Template brand="Begalabel" part="AC-200" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-x-1-Label-Angled-Corner-p40.html"/>
|
||||
<Label-rectangle id="0" width="2in" height="1in">
|
||||
<Layout nx="4" ny="10" x0="0.25in" y0="0.5in" dx="2in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -267,7 +236,6 @@
|
||||
<Template brand="Begalabel" part="AC-250" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-5-6-x-1-Label-Angled-Corner-p41.html"/>
|
||||
<Label-rectangle id="0" width="2.8333in" height="1in">
|
||||
<Layout nx="3" ny="11" x0="0in" y0="0in" dx="2.8333in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -276,7 +244,6 @@
|
||||
<Template brand="Begalabel" part="AC-450" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-4-x-1-2-Label-Angled-Corner-p45.html"/>
|
||||
<Label-rectangle id="0" width="0.75in" height="0.5in">
|
||||
<Layout nx="10" ny="20" x0="0.5in" y0="0.5in" dx="0.75in" dy="0.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -285,7 +252,6 @@
|
||||
<Template brand="Begalabel" part="AC-550" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-4--x-1-4-7-Label-Angled-Corner-p47.html"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="1.5714in">
|
||||
<Layout nx="2" ny="7" x0="0in" y0="0in" dx="4.25in" dy="1.5714in"/>
|
||||
</Label-rectangle>
|
||||
@@ -294,7 +260,6 @@
|
||||
<Template brand="Begalabel" part="AC-600" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-4-x-2-Shipping-Labels-Address-Labels-p48.html"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="2in">
|
||||
<Layout nx="2" ny="5" x0="0in" y0="0.5in" dx="4.25in" dy="2in"/>
|
||||
</Label-rectangle>
|
||||
@@ -303,7 +268,6 @@
|
||||
<Template brand="Begalabel" part="AC-500" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-4-x-1-Label-Angled-Corner-p46.html"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="1in">
|
||||
<Layout nx="2" ny="11" x0="0in" y0="0in" dx="4.25in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -312,7 +276,6 @@
|
||||
<Template brand="Begalabel" part="AC-700" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-4-x-3-2-3-Label-Angled-Corner-p50.html"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="3.6667in">
|
||||
<Layout nx="2" ny="3" x0="0in" y0="0in" dx="4.25in" dy="3.6667in"/>
|
||||
</Label-rectangle>
|
||||
@@ -321,7 +284,6 @@
|
||||
<Template brand="Begalabel" part="AC-750" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-4-x-5-1-2-Quarter-Sheet-Shipping-Labels-p51.html"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="5.5in">
|
||||
<Layout nx="2" ny="2" x0="0in" y0="0in" dx="4.25in" dy="5.5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -330,7 +292,6 @@
|
||||
<Template brand="Begalabel" part="AC-800" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/8-1-2-x-1-Label-Angled-Corner-p52.html"/>
|
||||
<Label-rectangle id="0" width="8.5in" height="1in">
|
||||
<Layout nx="1" ny="11" x0="0in" y0="0in" dx="8.5in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
@@ -339,7 +300,6 @@
|
||||
<Template brand="Begalabel" part="AC-850" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/8-1-2-x-1-4-7-Label-Angled-Corner-p53.html"/>
|
||||
<Label-rectangle id="0" width="8.5in" height="1.5714in">
|
||||
<Layout nx="1" ny="7" x0="0in" y0="0in" dx="8.5in" dy="1.5714in"/>
|
||||
</Label-rectangle>
|
||||
@@ -348,7 +308,6 @@
|
||||
<Template brand="Begalabel" part="AC-1000" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/8-1-2-x-3-2-3-Label-Angled-Corner-p56.html"/>
|
||||
<Label-rectangle id="0" width="8.5in" height="3.6667in">
|
||||
<Layout nx="1" ny="3" x0="0in" y0="0in" dx="8.5in" dy="3.6667in"/>
|
||||
</Label-rectangle>
|
||||
@@ -357,18 +316,14 @@
|
||||
<Template brand="Begalabel" part="AC-1050" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/8-1-2-x-5-1-2-Half-Sheet-Shipping-Labels-p57.html"/>
|
||||
<Label-rectangle id="0" width="8.5in" height="5.5in">
|
||||
<Layout nx="1" ny="2" x0="0in" y0="0in" dx="8.5in" dy="5.5in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
|
||||
<Template brand="Begalabel" part="O-100" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-inch-Circle-Label-p61.html"/>
|
||||
<Label-round id="0" radius="0.5in" waste="0.05in">
|
||||
<Layout nx="7" ny="9" x0="0.5in" y0="0.4375in" dx="1.125in" dy="1.125in"/>
|
||||
</Label-round>
|
||||
@@ -377,7 +332,6 @@
|
||||
<Template brand="Begalabel" part="O-200" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-1-2-Round-Labels-Circle-Identification-Labels-p62.html"/>
|
||||
<Label-round id="0" radius="0.75in" waste="0.05in">
|
||||
<Layout nx="4" ny="5" x0="0.5in" y0="0.75in" dx="2in" dy="2in"/>
|
||||
</Label-round>
|
||||
@@ -386,7 +340,6 @@
|
||||
<Template brand="Begalabel" part="O-300" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-5-8-Round-Labels-Circle-Identification-Labels-p63.html"/>
|
||||
<Label-round id="0" radius="0.8125in" waste="0.02in">
|
||||
<Layout nx="4" ny="6" x0="0.4375in" y0="0.5in" dx="2in" dy="1.675in"/>
|
||||
</Label-round>
|
||||
@@ -395,7 +348,6 @@
|
||||
<Template brand="Begalabel" part="O-400" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-Inch-Circle-Label-p64.html"/>
|
||||
<Label-round id="0" radius="1in" waste="0.03in">
|
||||
<Layout nx="4" ny="5" x0="0.1562in" y0="0.375in" dx="2.0625in" dy="2.0625in"/>
|
||||
</Label-round>
|
||||
@@ -404,7 +356,6 @@
|
||||
<Template brand="Begalabel" part="O-500" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-1-2-Round-Labels-Circle-Identification-Labels-p65.html"/>
|
||||
<Label-round id="0" radius="1.25in" waste="0.03in">
|
||||
<Layout nx="3" ny="4" x0="0.25in" y0="0.4062in" dx="2.75in" dy="2.5625in"/>
|
||||
</Label-round>
|
||||
@@ -413,7 +364,6 @@
|
||||
<Template brand="Begalabel" part="O-600" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-Inch-Circle-Label-p66.html"/>
|
||||
<Label-round id="0" radius="1.5in" waste="0.05in">
|
||||
<Layout nx="2" ny="3" x0="1.1875in" y0="0.875in" dx="3.125in" dy="3.125in"/>
|
||||
</Label-round>
|
||||
@@ -422,18 +372,14 @@
|
||||
<Template brand="Begalabel" part="O-700" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-5-16-Circle-Label-p67.html"/>
|
||||
<Label-round id="0" radius="1.65625in" waste="0.02in">
|
||||
<Layout nx="2" ny="3" x0="0.625in" y0="0.4843in" dx="3.9375in" dy="3.3594in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
|
||||
<Template brand="Begalabel" part="V-100" size="US-Letter" _description="Elliptical labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="elliptical-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/1-1-2-x-2-3-Oval-Label-p262.html"/>
|
||||
<Label-ellipse id="0" width="1.5in" height="0.75in" waste="0.03in">
|
||||
<Layout nx="5" ny="11" x0="0.375in" y0="0.5in" dx="1.5625in" dy="0.925in"/>
|
||||
</Label-ellipse>
|
||||
@@ -442,7 +388,6 @@
|
||||
<Template brand="Begalabel" part="V-200" size="US-Letter" _description="Elliptical labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="elliptical-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-x-1-Oval-Label-p263.html"/>
|
||||
<Label-ellipse id="0" width="2in" height="1in" waste="0.05in">
|
||||
<Layout nx="3" ny="9" x0="1in" y0="0.5in" dx="2.25in" dy="1.125in"/>
|
||||
</Label-ellipse>
|
||||
@@ -451,7 +396,6 @@
|
||||
<Template brand="Begalabel" part="V-400" size="US-Letter" _description="Elliptical labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="elliptical-label"/>
|
||||
<Meta product_url="http://www.begalabel.com/2-1-2-x-1-3-4-Oval-Label-p264.html"/>
|
||||
<Label-ellipse id="0" width="2.5in" height="1.75in" waste="0.05in">
|
||||
<Layout nx="3" ny="5" x0="0.375in" y0="0.875in" dx="2.625in" dy="1.875in"/>
|
||||
</Label-ellipse>
|
||||
@@ -461,15 +405,14 @@
|
||||
<Template brand="Begalabel" part="M-200 (medium)" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-5-8-CD-&-DVD-Label-2-per-sheet-p68.html"/>
|
||||
<Label-cd id="0" radius="2.3125in" hole="0.814in" waste="0.05in">
|
||||
<Layout nx="1" ny="2" x0="1.9375in" y0="0.6875in" dx="5in" dy="5in"/>
|
||||
</Label-cd>
|
||||
</Template>
|
||||
|
||||
<Template brand="Begalabel" part="M-200 (box)" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-5-8-CD-&-DVD-Label-2-per-sheet-p68.html"/>
|
||||
<Label-rectangle id="0" width="0.222in" height="4.69in" round="0.064in" x_waste="0.05in" y_waste="0.05in">
|
||||
<Layout nx="2" ny="2" x0="0.5in" y0="0.585in" dx="0.47in" dy="4.87in"/>
|
||||
</Label-rectangle>
|
||||
@@ -478,7 +421,6 @@
|
||||
<Template brand="Begalabel" part="M-400" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-2-CD-&-DVD-Label-2-per-sheet-p69.html"/>
|
||||
<Label-cd id="0" radius="2.25in" hole="0.814in" waste="0.05in">
|
||||
<Layout nx="1" ny="2" x0="2in" y0="0.5in" dx="5.5in" dy="5.5in"/>
|
||||
</Label-cd>
|
||||
@@ -487,24 +429,23 @@
|
||||
<Template brand="Begalabel" part="M-600 (medium)" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/Neato-Compatible-4.52-CD-&-DVD-Label--3-per-sheet-p70.html"/>
|
||||
<Label-cd id="0" radius="2.26in" hole="0.814in" waste="0.025in">
|
||||
<Layout nx="1" ny="2" x0="0.25in" y0="0.25in" dy="5.98in"/>
|
||||
<Layout nx="1" ny="1" x0="3.729in" y0="3.24in"/>
|
||||
</Label-cd>
|
||||
</Template>
|
||||
|
||||
<Template brand="Begalabel" part="M-600 (box1)" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/Neato-Compatible-4.52-CD-&-DVD-Label--3-per-sheet-p70.html"/>
|
||||
<Label-rectangle id="0" width="2.753in" height="1.973in" round="0.16in" waste="0.025in">
|
||||
<Layout nx="1" ny="2" x0="5.185in" y0="0.748in" dy="7.78in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
<Template brand="Begalabel" part="M-600 (box2)" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/Neato-Compatible-4.52-CD-amp;&-DVD-Label--3-per-sheet-p70.html"/>
|
||||
<Label-rectangle id="0" width="3.128in" height="1in" round="0.16in" waste="0.025in">
|
||||
<Layout nx="1" ny="1" x0="0.373in" y0="5in"/>
|
||||
</Label-rectangle>
|
||||
@@ -513,15 +454,14 @@
|
||||
<Template brand="Begalabel" part="M-800 (medium)" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-2-Inch-CD-&-DVD-Label-2-per-sheet-p71.html"/>
|
||||
<Label-cd id="0" radius="2.25in" hole="0.814in" waste="0.05in">
|
||||
<Layout nx="1" ny="2" x0="2in" y0="0.5in" dx="5.5in" dy="5.5in"/>
|
||||
</Label-cd>
|
||||
</Template>
|
||||
|
||||
<Template brand="Begalabel" part="M-800 (box)" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/4-1-2-Inch-CD-&-DVD-Label-2-per-sheet-p71.html"/>
|
||||
<Label-rectangle id="0" width="4.757in" height="0.258in" x_waste="0.05in">
|
||||
<Layout nx="1" ny="2" x0="1.872in" y0="5.242in" dx="4.757in" dy="0.258in"/>
|
||||
</Label-rectangle>
|
||||
@@ -530,7 +470,6 @@
|
||||
<Template brand="Begalabel" part="M-1000" size="US-Letter" _description="Cassette labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.begalabel.com/3-1-2-x-1-2-3-Inch-Cassette-Tape-Face-Label-12-per-sheet-p76.html"/>
|
||||
<Label-rectangle id="0" width="3.5in" height="1.66667in">
|
||||
<Markup-line x1="0in" y1="0.16in" x2="0.16in" y2="0"/>
|
||||
<Markup-line x1="3.5in" y1="0.16in" x2="3.34in" y2="0"/>
|
||||
|
||||
@@ -18,14 +18,10 @@
|
||||
<Template brand="Desmat" part="A4ST-3CD" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.desmat.com/product.php?id=34"/>
|
||||
<Label-cd id="0" radius="55mm" hole="15.5mm" waste="2mm">
|
||||
<Markup-margin size="9mm"/>
|
||||
<!-- <Layout nx="1" ny="2" x0="9mm" y0="9.5mm" dx="120mm" dy="166.5mm"/>
|
||||
<Layout nx="1" ny="1" x0="91mm" y0="93mm" dx="120mm" dy="120mm"/> -->
|
||||
|
||||
<Layout nx="1" ny="2" x0="91.5mm" y0="9mm" dx="119.5mm" dy="166mm"/>
|
||||
<Layout nx="1" ny="1" x0="9mm" y0="92mm" dx="120mm" dy="120mm"/>
|
||||
<Markup-margin size="9mm"/>
|
||||
<Layout nx="1" ny="2" x0="91.5mm" y0="9mm" dx="119.5mm" dy="166mm"/>
|
||||
<Layout nx="1" ny="1" x0="9mm" y0="92mm" dx="120mm" dy="120mm"/>
|
||||
</Label-cd>
|
||||
</Template>
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Dymo" part="30252" _description="Address labels"
|
||||
size="roll" roll_width="31mm" width="28mm" height="89mm" >
|
||||
<Meta category="label" />
|
||||
<Meta category="mail" />
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Label-rectangle id="0" width="28mm" height="89mm" round="1mm" x_waste="0mm" y_waste="0mm" >
|
||||
<Markup-rect x1="1mm" y1="6mm" w="26mm" h="77mm" />
|
||||
<Layout nx="1" ny="1" x0="0" y0="0" dx="0" dy="0" />
|
||||
@@ -39,8 +39,8 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Dymo" part="30915" _description="Postage stamp labels"
|
||||
size="roll" roll_width="51mm" width="41mm" height="31mm" >
|
||||
<Meta category="label" />
|
||||
<Meta category="mail" />
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Label-path id="0" x_waste="0mm" y_waste="0mm" d_units="mm"
|
||||
d="M 0 1
|
||||
l 1 -1 l 1 1 l 1 -1 l 1 1 l 1 -1 l 1 1 l 1 -1 l 1 1 l 1 -1 l 1 1
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
<Template brand="Endisch" part="6500012x" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/round12_e.html"/>
|
||||
<Label-round id="0" radius="6mm" waste="0.6mm">
|
||||
<Layout nx="13" ny="18" x0="9mm" y0="15mm" dx="15mm" dy="15mm"/>
|
||||
</Label-round>
|
||||
@@ -13,7 +12,6 @@
|
||||
<Template brand="Endisch" part="6500020x" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/round20_e.html"/>
|
||||
<Label-round id="0" radius="10mm" waste="0.5mm">
|
||||
<Layout nx="8" ny="12" x0="16.25mm" y0="14.75mm" dx="22.5mm" dy="22.5mm"/>
|
||||
</Label-round>
|
||||
@@ -30,7 +28,6 @@
|
||||
<Template brand="Endisch" part="6500030x" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/round30_e.html"/>
|
||||
<Label-round id="0" radius="15mm" waste="0.5mm">
|
||||
<Layout nx="6" ny="8" x0="8.75mm" y0="19.75mm" dx="32.5mm" dy="32.5mm"/>
|
||||
</Label-round>
|
||||
@@ -39,7 +36,6 @@
|
||||
<Template brand="Endisch" part="6500040x" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/round40_e.html"/>
|
||||
<Label-round id="0" radius="20mm" waste="1.5mm">
|
||||
<Layout nx="4" ny="6" x0="16mm" y0="13.5mm" dx="46mm" dy="46mm"/>
|
||||
</Label-round>
|
||||
@@ -56,7 +52,6 @@
|
||||
<Template brand="Endisch" part="6500060x" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/round60_e.html"/>
|
||||
<Label-round id="0" radius="30mm" waste="1mm">
|
||||
<Layout nx="3" ny="4" x0="8mm" y0="18mm" dx="67mm" dy="67mm"/>
|
||||
</Label-round>
|
||||
@@ -89,7 +84,6 @@
|
||||
<Template brand="Endisch" part="6500085x" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/round85_e.html"/>
|
||||
<Label-round id="0" radius="42.5mm" waste="1.5mm">
|
||||
<Layout nx="2" ny="3" x0="15mm" y0="11mm" dx="95mm" dy="95mm"/>
|
||||
</Label-round>
|
||||
@@ -106,15 +100,11 @@
|
||||
<Template brand="Endisch" part="6400080x" size="A4" _description="Elliptical labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="elliptical-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/oval80_e.html"/>
|
||||
<Label-ellipse id="0" width="80mm" height="47mm" waste="1.5mm">
|
||||
<Layout nx="2" ny="5" x0="15mm" y0="11mm" dx="100mm" dy="57mm"/>
|
||||
</Label-ellipse>
|
||||
</Template>
|
||||
|
||||
|
||||
|
||||
|
||||
<Template brand="Endisch" part="6502015x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
@@ -126,7 +116,6 @@
|
||||
<Template brand="Endisch" part="6502020x" size="A4" _description="Square labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="square-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/20x20_e.html"/>
|
||||
<Label-rectangle id="0" width="20mm" height="20mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="9" ny="14" x0="15mm" y0="8.5mm" dx="20mm" dy="20mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -143,7 +132,6 @@
|
||||
<Template brand="Endisch" part="6502719x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/27x19_e.html"/>
|
||||
<Label-rectangle id="0" width="27.5mm" height="19.05mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="7" ny="14" x0="8.75mm" y0="15.15mm" dx="27.5mm" dy="19.05mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -160,7 +148,6 @@
|
||||
<Template brand="Endisch" part="6503821x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/38x212_e.html"/>
|
||||
<Label-rectangle id="0" width="38mm" height="21.2mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="5" ny="13" x0="10mm" y0="10.7mm" dx="38mm" dy="21.2mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -177,7 +164,6 @@
|
||||
<Template brand="Endisch" part="6504816x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/485x169_e.html"/>
|
||||
<Label-rectangle id="0" width="48.5mm" height="16.9mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="4" ny="16" x0="8mm" y0="13.3mm" dx="48.5mm" dy="16.9mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -186,7 +172,6 @@
|
||||
<Template brand="Endisch" part="6504825x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/485x254_e.html"/>
|
||||
<Label-rectangle id="0" width="48.5mm" height="25.4mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="4" ny="11" x0="8mm" y0="8.8mm" dx="48.5mm" dy="25.4mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -203,7 +188,6 @@
|
||||
<Template brand="Endisch" part="6505221x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/525x212_e.html"/>
|
||||
<Label-rectangle id="0" width="52.5mm" height="21.2mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="4" ny="14" x0="0mm" y0="0mm" dx="52.5mm" dy="21.214mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -212,7 +196,6 @@
|
||||
<Template brand="Endisch" part="6505225x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/525x254_e.html"/>
|
||||
<Label-rectangle id="0" width="52.5mm" height="25.4mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="4" ny="11" x0="0mm" y0="8.8mm" dx="52.5mm" dy="25.4mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -221,7 +204,6 @@
|
||||
<Template brand="Endisch" part="6505229x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/525x2967_e.html"/>
|
||||
<Label-rectangle id="0" width="52.5mm" height="29.7mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="4" ny="10" x0="0mm" y0="0mm" dx="52.5mm" dy="29.7mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -230,7 +212,6 @@
|
||||
<Template brand="Endisch" part="6405334x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/53x34_e.html"/>
|
||||
<Label-rectangle id="0" width="53mm" height="34mm" round="2mm" x_waste="1mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="13mm" y0="12.5mm" dx="65.5mm" dy="34mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -239,7 +220,6 @@
|
||||
<Template brand="Endisch" part="640638x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/63x85_e.html"/>
|
||||
<Label-rectangle id="0" width="63.5mm" height="8.5mm" round="2mm" x_waste="0.8mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="32" x0="7.21mm" y0="12.5mm" dx="66.04mm" dy="8.5mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -280,7 +260,6 @@
|
||||
<Template brand="Endisch" part="6506433x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/646x338_e.html"/>
|
||||
<Label-rectangle id="0" width="64.6mm" height="33.8mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="8.1mm" y0="13.3mm" dx="64.6mm" dy="33.8mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -289,7 +268,6 @@
|
||||
<Template brand="Endisch" part="6406634x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/66x34_e.html"/>
|
||||
<Label-rectangle id="0" width="66mm" height="34mm" round="2mm" x_waste="0.5mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="4mm" y0="12.5mm" dx="68mm" dy="34mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -298,7 +276,6 @@
|
||||
<Template brand="Endisch" part="6507016x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x169_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="16.9mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="17" x0="0mm" y0="4.85mm" dx="70mm" dy="16.9mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -307,7 +284,6 @@
|
||||
<Template brand="Endisch" part="6507025x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x254_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="25.4mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="11" x0="0mm" y0="8.8mm" dx="70mm" dy="25.4mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -316,7 +292,6 @@
|
||||
<Template brand="Endisch" part="6507029x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x2967_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="29.7mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="10" x0="0mm" y0="0mm" dx="70mm" dy="29.7mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -325,7 +300,6 @@
|
||||
<Template brand="Endisch" part="6507032x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x32_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="32mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="9" x0="0mm" y0="4.5mm" dx="70mm" dy="32mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -334,7 +308,6 @@
|
||||
<Template brand="Endisch" part="6507033x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x338_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="33.8mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="0mm" y0="13.3mm" dx="70mm" dy="33.8mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -343,7 +316,6 @@
|
||||
<Template brand="Endisch" part="6507035x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x35_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="35mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="0mm" y0="8.5mm" dx="70mm" dy="35mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -352,7 +324,6 @@
|
||||
<Template brand="Endisch" part="6507036x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x36_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="36mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="0mm" y0="4.5mm" dx="70mm" dy="36mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -361,7 +332,6 @@
|
||||
<Template brand="Endisch" part="6507037x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x3708_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="37mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="8" x0="0mm" y0="0mm" dx="70mm" dy="37.125mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -370,7 +340,6 @@
|
||||
<Template brand="Endisch" part="6507041x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x41_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="41mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="7" x0="0mm" y0="5mm" dx="70mm" dy="41mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -379,7 +348,6 @@
|
||||
<Template brand="Endisch" part="6507042x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x423_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="42.3mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="7" x0="0mm" y0="0mm" dx="70mm" dy="42.428mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -388,7 +356,6 @@
|
||||
<Template brand="Endisch" part="6507050x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x508_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="50.8mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="5" x0="0mm" y0="21.5mm" dx="70mm" dy="50.8mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -397,7 +364,6 @@
|
||||
<Template brand="Endisch" part="6507067x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/70x677_e.html"/>
|
||||
<Label-rectangle id="0" width="70mm" height="67.7mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="3" ny="4" x0="0mm" y0="13.1mm" dx="70mm" dy="67.7mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -406,7 +372,6 @@
|
||||
<Template brand="Endisch" part="6408232x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/82x32_e.html"/>
|
||||
<Label-rectangle id="0" width="82mm" height="32mm" round="2mm" x_waste="2mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="8" x0="16mm" y0="20.5mm" dx="96mm" dy="32mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -415,7 +380,6 @@
|
||||
<Template brand="Endisch" part="6408252x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/82x52_e.html"/>
|
||||
<Label-rectangle id="0" width="82mm" height="52mm" round="2mm" x_waste="2mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="5" x0="16mm" y0="18.5mm" dx="96mm" dy="52mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -440,7 +404,6 @@
|
||||
<Template brand="Endisch" part="6409616x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/96x169_e.html"/>
|
||||
<Label-rectangle id="0" width="96mm" height="16.9mm" round="2mm" x_waste="0.7mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="16" x0="7.75mm" y0="13.3mm" dx="98.5mm" dy="16.9mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -457,7 +420,6 @@
|
||||
<Template brand="Endisch" part="6509742x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/97x423_e.html"/>
|
||||
<Label-rectangle id="0" width="97mm" height="42.3mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="6" x0="8mm" y0="21.6mm" dx="97mm" dy="42.3mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -466,7 +428,6 @@
|
||||
<Template brand="Endisch" part="6509767x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/97x677_e.html"/>
|
||||
<Label-rectangle id="0" width="97mm" height="67.7mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="4" x0="8mm" y0="13.1mm" dx="97mm" dy="67.7mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -475,7 +436,6 @@
|
||||
<Template brand="Endisch" part="6409852x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/98x52_e.html"/>
|
||||
<Label-rectangle id="0" width="98mm" height="52mm" round="2mm" x_waste="1mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="5" x0="5mm" y0="18.5mm" dx="102mm" dy="52mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -532,7 +492,6 @@
|
||||
<Template brand="Endisch" part="6510150x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/1016x508_e.html"/>
|
||||
<Label-rectangle id="0" width="101.6mm" height="50.8mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="5" x0="3.4mm" y0="21.5mm" dx="101.6mm" dy="50.8mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -541,7 +500,6 @@
|
||||
<Template brand="Endisch" part="6510533x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x338_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="33.8mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="8" x0="0mm" y0="13.3mm" dx="105mm" dy="33.8mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -550,7 +508,6 @@
|
||||
<Template brand="Endisch" part="6510537x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x3708_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="37mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="8" x0="0mm" y0="0mm" dx="105mm" dy="37.125mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -559,7 +516,6 @@
|
||||
<Template brand="Endisch" part="6510541x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x41_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="41mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="7" x0="0mm" y0="5mm" dx="105mm" dy="41mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -568,7 +524,6 @@
|
||||
<Template brand="Endisch" part="6510542x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x423_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="42.3mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="7" x0="0mm" y0="0mm" dx="105mm" dy="42.428mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -577,7 +532,6 @@
|
||||
<Template brand="Endisch" part="6510548x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x48_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="48mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="6" x0="0mm" y0="4.5mm" dx="105mm" dy="48mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -586,7 +540,6 @@
|
||||
<Template brand="Endisch" part="6510557x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x57_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="57mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="5" x0="0mm" y0="6mm" dx="105mm" dy="57mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -595,7 +548,6 @@
|
||||
<Template brand="Endisch" part="6510570x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x70_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="70mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="4" x0="0mm" y0="8.5mm" dx="105mm" dy="70mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -604,7 +556,6 @@
|
||||
<Template brand="Endisch" part="6510572x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x72_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="72mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="4" x0="0mm" y0="9mm" dx="105mm" dy="72mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -613,7 +564,6 @@
|
||||
<Template brand="Endisch" part="6510574x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x74_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="74.25mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="4" x0="0mm" y0="0mm" dx="105mm" dy="74.25mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -622,7 +572,6 @@
|
||||
<Template brand="Endisch" part="6510514x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x144_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="144mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="2" x0="0mm" y0="9mm" dx="105mm" dy="144mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -631,7 +580,6 @@
|
||||
<Template brand="Endisch" part="6510518x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/105x148_e.html"/>
|
||||
<Label-rectangle id="0" width="105mm" height="148.5mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="2" x0="0mm" y0="0mm" dx="105mm" dy="148.5mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -640,7 +588,6 @@
|
||||
<Template brand="Endisch" part="6414498x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/144x98_e.html"/>
|
||||
<Label-rectangle id="0" width="98mm" height="144mm" round="2mm" x_waste="1mm" y_waste="0mm">
|
||||
<Layout nx="2" ny="2" x0="5mm" y0="4.5mm" dx="102mm" dy="144mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -649,7 +596,6 @@
|
||||
<Template brand="Endisch" part="6414720x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/147x20_e.html"/>
|
||||
<Label-rectangle id="0" width="147.3mm" height="20mm" round="2mm" x_waste="1mm" y_waste="0mm">
|
||||
<Layout nx="1" ny="13" x0="31.35mm" y0="18.5mm" dx="147.3mm" dy="20mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -658,7 +604,6 @@
|
||||
<Template brand="Endisch" part="6519038x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/190x38_e.html"/>
|
||||
<Label-rectangle id="0" width="192mm" height="38mm" round="2mm" x_waste="1mm" y_waste="0mm">
|
||||
<Layout nx="1" ny="7" x0="9mm" y0="15.5mm" dx="192mm" dy="38mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -667,7 +612,6 @@
|
||||
<Template brand="Endisch" part="6519061x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/190x61_e.html"/>
|
||||
<Label-rectangle id="0" width="192mm" height="61mm" round="2mm" x_waste="1mm" y_waste="0mm">
|
||||
<Layout nx="1" ny="4" x0="9mm" y0="26.5mm" dx="192mm" dy="61mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -676,7 +620,6 @@
|
||||
<Template brand="Endisch" part="6520029x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/200x297_e.html"/>
|
||||
<Label-rectangle id="0" width="200mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="1" ny="1" x0="10mm" y0="0mm" dx="200mm" dy="297mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -701,7 +644,6 @@
|
||||
<Template brand="Endisch" part="6521018x" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/210x148_e.html"/>
|
||||
<Label-rectangle id="0" width="210mm" height="148.5mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="1" ny="2" x0="0mm" y0="0mm" dx="210mm" dy="148.5mm"/>
|
||||
</Label-rectangle>
|
||||
@@ -710,14 +652,11 @@
|
||||
<Template brand="Endisch" part="6521029x" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.endihaft.de/en/endisch_labels/laser/210x297_e.html"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
|
||||
<Template brand="Endisch" part="65420297" size="A3" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
@@ -734,8 +673,6 @@
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
|
||||
<Template brand="Endisch" part="B104147A5" size="A5" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
<!-- =================================================================== -->
|
||||
|
||||
<Template brand="Felga" part="EP1220" size="other" width="210mm" height="261mm" description="Plant labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Label-rectangle id="0" width="20mm" height="100mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="10" ny="2" x0="5mm" y0="5mm" dx="20mm" dy="130mm"/>
|
||||
@@ -15,7 +17,8 @@
|
||||
</Template>
|
||||
|
||||
<Template brand="Felga" part="ES210" size="other" width="595.276pt" height="793.701pt" description="Plant labels">
|
||||
<Meta category="user-defined"/>
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Label-rectangle id="0" width="595.276pt" height="36pt" round="0pt" x_waste="0pt" y_waste="0pt">
|
||||
<Markup-margin size="0pt"/>
|
||||
<Layout nx="1" ny="22" x0="0pt" y0="0pt" dx="595.276pt" dy="36pt"/>
|
||||
@@ -23,6 +26,8 @@
|
||||
</Template>
|
||||
|
||||
<Template brand="Felga" part="EY210" size="A4" description="Plant labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Label-rectangle id="0" width="210mm" height="19mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="1" ny="14" x0="0mm" y0="0mm" dx="210mm" dy="19mm"/>
|
||||
@@ -30,6 +35,8 @@
|
||||
</Template>
|
||||
|
||||
<Template brand="Felga" part="PETFO-A5" size="A4" description="Plant labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Label-rectangle id="0" width="210mm" height="148.5mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="1" ny="2" x0="0mm" y0="0mm" dx="210mm" dy="148.5mm"/>
|
||||
@@ -37,6 +44,8 @@
|
||||
</Template>
|
||||
|
||||
<Template brand="Felga" part="R1074" size="A4" description="Plant labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Label-rectangle id="0" width="105mm" height="74.25mm" round="2mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="2" ny="4" x0="0mm" y0="0mm" dx="105mm" dy="74.25mm"/>
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
<Template brand="Geha" part="P10" size="A4" _description="Flyer paper">
|
||||
<Meta category="card"/>
|
||||
<Meta category="foldable"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=90594"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Markup-line x1="0mm" y1="99mm" x2="210mm" y2="99mm"/>
|
||||
@@ -34,7 +33,6 @@
|
||||
<Template brand="Geha" part="P68" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1057&pid=91058"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54mm" round="0mm" x_waste="5mm" y_waste="9mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="2" ny="4" x0="15mm" y0="13mm" dx="95mm" dy="72mm"/>
|
||||
@@ -49,7 +47,6 @@
|
||||
<Template brand="Geha" part="P70" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1057&pid=90679"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54mm" round="0mm" x_waste="5mm" y_waste="0mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="2" ny="5" x0="15mm" y0="13.5mm" dx="95mm" dy="54mm"/>
|
||||
@@ -66,7 +63,6 @@
|
||||
<Template brand="Geha" part="P76" size="A4" _description="Greeting cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="foldable"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1057&pid=90815"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Markup-line x1="0mm" y1="148.5mm" x2="210mm" y2="148.5mm"/>
|
||||
@@ -82,7 +78,6 @@
|
||||
<Template brand="Geha" part="P78" size="A4" _description="Greeting cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="foldable"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1057&pid=90835"/>
|
||||
<Label-rectangle id="0" width="165mm" height="121mm" round="0mm" x_waste="23mm" y_waste="2.5mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Markup-line x1="82.5mm" y1="0mm" x2="82.5mm" y2="121mm"/>
|
||||
@@ -97,7 +92,6 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Geha" part="P80" size="A4" _description="Arch file inserts">
|
||||
<Meta category="card"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=837&pid=90891"/>
|
||||
<Label-rectangle id="0" width="188mm" height="48mm" round="0mm" x_waste="11mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="5" x0="11mm" y0="28.5mm" dx="210mm" dy="48mm"/>
|
||||
@@ -109,7 +103,6 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Geha" part="P81" size="A4" _description="Arch file inserts">
|
||||
<Meta category="card"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=837&pid=90914"/>
|
||||
<Label-rectangle id="0" width="188mm" height="26mm" round="0mm" x_waste="11mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="1" ny="9" x0="11mm" y0="31.5mm" dx="210mm" dy="26mm"/>
|
||||
@@ -122,7 +115,6 @@
|
||||
<Template brand="Geha" part="Z20-1" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30200"/>
|
||||
<Label-cd id="0" radius="58.5mm" hole="8.5mm" waste="10mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="1" x0="46.5mm" y0="21.5mm" dx="137mm" dy="137mm"/>
|
||||
@@ -135,7 +127,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30200"/>
|
||||
<Label-rectangle id="0" width="121.5mm" height="117.5mm" round="0mm" x_waste="15mm" y_waste="0mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="1" x0="44.25mm" y0="164mm" dx="151.5mm" dy="117.5mm"/>
|
||||
@@ -150,7 +141,6 @@
|
||||
<Template brand="Geha" part="Z22" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30101"/>
|
||||
<Label-cd id="0" radius="58.5mm" hole="8.5mm" waste="3.175mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="2" x0="46.5mm" y0="21.5mm" dx="123.35mm" dy="137mm"/>
|
||||
@@ -165,7 +155,6 @@
|
||||
<Template brand="Geha" part="Z24" size="A4" _description="DVD insert">
|
||||
<Meta category="card"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30248"/>
|
||||
<Label-rectangle id="0" width="183mm" height="270mm" round="0mm" x_waste="13.5mm" y_waste="13.5mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="1" x0="13.5mm" y0="13.5mm" dx="210mm" dy="297mm"/>
|
||||
@@ -180,7 +169,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30262"/>
|
||||
<Label-rectangle id="0" width="147.32mm" height="20mm" round="2.8mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="1" ny="13" x0="31.38mm" y0="18.4mm" dx="147.32mm" dy="20mm"/>
|
||||
@@ -195,7 +183,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30262"/>
|
||||
<Label-rectangle id="0" width="78.74mm" height="46.6mm" round="2mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="2" ny="6" x0="25mm" y0="8.7mm" dx="81.38mm" dy="46.6mm"/>
|
||||
@@ -209,7 +196,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30569"/>
|
||||
<Label-rectangle id="0" width="88.9mm" height="127mm" round="0mm" x_waste="2.5mm" y_waste="2mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="2" ny="2" x0="13.6mm" y0="19.3mm" dx="94mm" dy="131.23mm"/>
|
||||
@@ -226,7 +212,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30545"/>
|
||||
<Label-rectangle id="0" width="150mm" height="100mm" round="0mm" x_waste="30mm" y_waste="24mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="1" ny="2" x0="30mm" y0="24.2mm" dx="210mm" dy="148mm"/>
|
||||
@@ -243,7 +228,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30521"/>
|
||||
<Label-rectangle id="0" width="178mm" height="127mm" round="0mm" x_waste="16mm" y_waste="3mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="1" ny="2" x0="16mm" y0="18.4mm" dx="210mm" dy="145.4mm"/>
|
||||
@@ -260,7 +244,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30538"/>
|
||||
<Label-rectangle id="0" width="35mm" height="45mm" round="0mm" x_waste="5mm" y_waste="4mm">
|
||||
<Markup-margin size="0mm"/>
|
||||
<Layout nx="4" ny="5" x0="20mm" y0="20mm" dx="45mm" dy="53mm"/>
|
||||
@@ -275,7 +258,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30705"/>
|
||||
<Label-rectangle id="0" width="199.6mm" height="289.05mm" round="2mm" x_waste="5.2mm" y_waste="4.7mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="1" x0="5.2mm" y0="4.7mm" dx="210mm" dy="298.45mm"/>
|
||||
@@ -289,7 +271,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30729"/>
|
||||
<Label-rectangle id="0" width="99.1mm" height="139mm" round="2mm" x_waste="1.2mm" y_waste="0mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="2" ny="2" x0="4.7mm" y0="10mm" dx="101.64mm" dy="139mm"/>
|
||||
@@ -303,7 +284,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30743"/>
|
||||
<Label-rectangle id="0" width="99.06mm" height="67.7mm" round="2mm" x_waste="1.2mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="2" ny="4" x0="4.7mm" y0="13.8mm" dx="101.6mm" dy="67.73mm"/>
|
||||
@@ -317,7 +297,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30767"/>
|
||||
<Label-rectangle id="0" width="99.1mm" height="38.1mm" round="0.2mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="7" x0="3mm" y0="15.9mm" dx="101.6mm" dy="38.1mm"/>
|
||||
@@ -331,21 +310,18 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30781"/>
|
||||
<Label-rectangle id="0" width="63.5mm" height="38.1mm" round="2mm" x_waste="1.2mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="3" ny="7" x0="7.2mm" y0="15.9mm" dx="66.04mm" dy="38.1mm"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- Geha Z80. Arch file labels. -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Geha" part="Z80" size="A4" _description="Arch file labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30002"/>
|
||||
<Label-rectangle id="0" width="192mm" height="61mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Markup-line x1="172mm" y1="0mm" x2="172mm" y2="61mm"/>
|
||||
@@ -355,14 +331,12 @@
|
||||
|
||||
<Template brand="Geha" part="Z88" equiv="Z80"/>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- Geha Z81. Arch file labels. -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Geha" part="Z81" size="A4" _description="Arch file labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30026"/>
|
||||
<Label-rectangle id="0" width="192mm" height="38mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Markup-line x1="172mm" y1="0mm" x2="172mm" y2="38mm"/>
|
||||
@@ -378,7 +352,6 @@
|
||||
<Template brand="Geha" part="Z90" size="A4" _description="Multipurpose labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30804"/>
|
||||
<Label-rectangle id="0" width="63.5mm" height="29.63mm" round="2mm" x_waste="1.2mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="3" ny="9" x0="7.2mm" y0="15.1mm" dx="66.04mm" dy="29.63mm"/>
|
||||
@@ -391,7 +364,6 @@
|
||||
<Template brand="Geha" part="Z91" size="A4" _description="Multipurpose labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30828"/>
|
||||
<Label-rectangle id="0" width="45.72mm" height="21.16mm" round="2mm" x_waste="1.2mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="4" ny="12" x0="9.8mm" y0="21.4mm" dx="48.26mm" dy="21.2mm"/>
|
||||
@@ -404,7 +376,6 @@
|
||||
<Template brand="Geha" part="Z92" size="A4" _description="Multipurpose labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.geha.de/index.php?id=1047&pid=30842"/>
|
||||
<Label-rectangle id="0" width="25.4mm" height="10mm" round="2mm" x_waste="1.2mm" y_waste="0mm">
|
||||
<Markup-margin size="1mm"/>
|
||||
<Layout nx="7" ny="27" x0="8.5mm" y0="13.4mm" dx="27.94mm" dy="10mm"/>
|
||||
|
||||
@@ -157,9 +157,10 @@
|
||||
id %STRING_TYPE; #REQUIRED
|
||||
name %STRING_TYPE; #IMPLIED
|
||||
_name %STRING_TYPE; #IMPLIED
|
||||
pwg_size %STRING_TYPE; #REQUIRED
|
||||
pwg_class %STRING_TYPE; #IMPLIED
|
||||
width %LENGTH_TYPE; #REQUIRED
|
||||
height %LENGTH_TYPE; #REQUIRED
|
||||
type %STRING_TYPE; #IMPLIED
|
||||
>
|
||||
|
||||
<!-- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,6 @@
|
||||
<Template brand="Mayspies" part="090352" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.mayspies.com/index.php?menu_ID=43"/>
|
||||
<Label-cd id="0" radius="58.5mm" hole="8.5mm" waste="3.2mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="2" x0="46.5mm" y0="21.43mm" dx="123.4mm" dy="137mm"/>
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
<Template brand="Micro Application" part="5057" size="A4" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.microapp.com/papier_etiquettes_standard_5057.html"/>
|
||||
<Label-rectangle id="0" width="60.5mm" height="29.6mm" round="0mm" x_waste="1mm" y_waste="1mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="3" ny="8" x0="12mm" y0="23mm" dx="62.5mm" dy="31.6mm"/>
|
||||
|
||||
@@ -244,7 +244,7 @@
|
||||
<Meta category="business-card"/>
|
||||
<Label-rectangle id="0" width="243.78" height="153.07">
|
||||
<Markup-margin size="5"/>
|
||||
<Layout nx="2" ny="5" x0="48.19" y0="42.50" dx="255.12" dy="157.32"/>
|
||||
<Layout nx="2" ny="5" x0="48.19" y0="42.50" dx="255.12" dy="157.32"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
@@ -397,7 +397,7 @@
|
||||
<Meta category="media"/>
|
||||
<Label-cd id="0" radius="166.5" hole="58.5" waste="5">
|
||||
<Markup-margin size="5"/>
|
||||
<Layout nx="1" ny="2" x0="125" y0="68.890" dx="0" dy="360"/>
|
||||
<Layout nx="1" ny="2" x0="125" y0="68.890" dx="0" dy="360"/>
|
||||
</Label-cd>
|
||||
</Template>
|
||||
|
||||
@@ -570,7 +570,7 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="Sigel" part="LA 505" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta category="media"/>
|
||||
<Label-cd id="0" radius="58.5mm" hole="8.5mm" waste="2mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="1" x0="45mm" y0="20mm" dx="123.4mm" dy="123.4mm"/>
|
||||
@@ -625,7 +625,6 @@
|
||||
<Template brand="Sigel" part="DE 160" size="A4" _description="Bottle/jar labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sigel.de/en_gb/Workflow/Labels/118/1406-Labels+for+bottles%2C+to+design+and+customize"/>
|
||||
<Label-rectangle id="0" width="80mm" height="120mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="2" x0="15mm" y0="19.5mm" dx="100mm" dy="138mm"/>
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
<Template brand="Merax" part="CD labels" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.merax.com/products/Labels/cddvd.html"/>
|
||||
<Label-cd id="0" radius="166.5" hole="58.5" waste="5">
|
||||
<Markup-margin size="5"/>
|
||||
<Layout nx="1" ny="1" x0="33.75" y0="45" dx="0" dy="0"/>
|
||||
|
||||
@@ -230,7 +230,6 @@
|
||||
<Template brand="Southworth" part="BC554" size="US-Letter" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://shop.southworth.com/groups.php?cat=1&group=6"/>
|
||||
<Label-rectangle id="0" width="252" height="144" round="0">
|
||||
<Markup-margin size="5"/>
|
||||
<Layout nx="2" ny="5" x0="36" y0="36" dx="288" dy="144"/>
|
||||
|
||||
+19
-207
File diff suppressed because it is too large
Load Diff
+47
-40
@@ -3,55 +3,62 @@
|
||||
<Glabels-paper-sizes>
|
||||
|
||||
<!-- Most popular (at top of list) -->
|
||||
<Paper-size id="A4" name="A4" pwg_size="iso_a4" width="210mm" height="297mm"/>
|
||||
<Paper-size id="US-Letter" name="US Letter" pwg_size="na_letter" width="8.5in" height="11in"/>
|
||||
<Paper-size id="A4" name="A4" pwg_class="iso" width="210mm" height="297mm" />
|
||||
<Paper-size id="US-Letter" name="US Letter" pwg_class="na" width="8.5in" height="11in" />
|
||||
|
||||
<!-- Other US paper sizes -->
|
||||
<Paper-size id="US-Legal" name="US Legal" pwg_size="na_legal" width="8.5in" height="14in"/>
|
||||
<Paper-size id="US-Executive" name="US Executive" pwg_size="na_executive" width="7.25in" height="10.5in"/>
|
||||
<Paper-size id="US-Legal" name="US Legal" pwg_class="na" width="8.5in" height="14in" />
|
||||
<Paper-size id="US-Executive" name="US Executive" pwg_class="na" width="7.25in" height="10.5in" />
|
||||
|
||||
<!-- Other ISO A series sizes -->
|
||||
<Paper-size id="A0" name="A0" pwg_size="iso_a0" width="841mm" height="1189mm"/>
|
||||
<Paper-size id="A1" name="A1" pwg_size="iso_a1" width="594mm" height="841mm"/>
|
||||
<Paper-size id="A2" name="A2" pwg_size="iso_a2" width="420mm" height="594mm"/>
|
||||
<Paper-size id="A3" name="A3" pwg_size="iso_a3" width="297mm" height="420mm"/>
|
||||
<Paper-size id="A5" name="A5" pwg_size="iso_a5" width="148mm" height="210mm"/>
|
||||
<Paper-size id="A6" name="A6" pwg_size="iso_a6" width="105mm" height="148mm"/>
|
||||
<Paper-size id="A7" name="A7" pwg_size="iso_a7" width="74mm" height="105mm"/>
|
||||
<Paper-size id="A8" name="A8" pwg_size="iso_a8" width="52mm" height="74mm"/>
|
||||
<Paper-size id="A9" name="A9" pwg_size="iso_a9" width="37mm" height="52mm"/>
|
||||
<Paper-size id="A10" name="A10" pwg_size="iso_a10" width="26mm" height="37mm"/>
|
||||
<Paper-size id="A0" name="A0" pwg_class="iso" width="841mm" height="1189mm" />
|
||||
<Paper-size id="A1" name="A1" pwg_class="iso" width="594mm" height="841mm" />
|
||||
<Paper-size id="A2" name="A2" pwg_class="iso" width="420mm" height="594mm" />
|
||||
<Paper-size id="A3" name="A3" pwg_class="iso" width="297mm" height="420mm" />
|
||||
<Paper-size id="A5" name="A5" pwg_class="iso" width="148mm" height="210mm" />
|
||||
<Paper-size id="A6" name="A6" pwg_class="iso" width="105mm" height="148mm" />
|
||||
<Paper-size id="A7" name="A7" pwg_class="iso" width="74mm" height="105mm" />
|
||||
<Paper-size id="A8" name="A8" pwg_class="iso" width="52mm" height="74mm" />
|
||||
<Paper-size id="A9" name="A9" pwg_class="iso" width="37mm" height="52mm" />
|
||||
<Paper-size id="A10" name="A10" pwg_class="iso" width="26mm" height="37mm" />
|
||||
|
||||
<!-- ISO B series sizes -->
|
||||
<Paper-size id="B0" name="B0" pwg_size="iso_b0" width="1000mm" height="1414mm"/>
|
||||
<Paper-size id="B1" name="B1" pwg_size="iso_b1" width="707mm" height="1000mm"/>
|
||||
<Paper-size id="B2" name="B2" pwg_size="iso_b2" width="500mm" height="707mm"/>
|
||||
<Paper-size id="B3" name="B3" pwg_size="iso_b3" width="353mm" height="500mm"/>
|
||||
<Paper-size id="B4" name="B4" pwg_size="iso_b4" width="250mm" height="353mm"/>
|
||||
<Paper-size id="B5" name="B5" pwg_size="iso_b5" width="176mm" height="250mm"/>
|
||||
<Paper-size id="B6" name="B6" pwg_size="iso_b6" width="125mm" height="176mm"/>
|
||||
<Paper-size id="B7" name="B7" pwg_size="iso_b7" width="88mm" height="125mm"/>
|
||||
<Paper-size id="B8" name="B8" pwg_size="iso_b8" width="62mm" height="88mm"/>
|
||||
<Paper-size id="B9" name="B9" pwg_size="iso_b9" width="44mm" height="62mm"/>
|
||||
<Paper-size id="B10" name="B10" pwg_size="iso_b10" width="31mm" height="44mm"/>
|
||||
<Paper-size id="B0" name="B0" pwg_class="iso" width="1000mm" height="1414mm" />
|
||||
<Paper-size id="B1" name="B1" pwg_class="iso" width="707mm" height="1000mm" />
|
||||
<Paper-size id="B2" name="B2" pwg_class="iso" width="500mm" height="707mm" />
|
||||
<Paper-size id="B3" name="B3" pwg_class="iso" width="353mm" height="500mm" />
|
||||
<Paper-size id="B4" name="B4" pwg_class="iso" width="250mm" height="353mm" />
|
||||
<Paper-size id="B5" name="B5" pwg_class="iso" width="176mm" height="250mm" />
|
||||
<Paper-size id="B6" name="B6" pwg_class="iso" width="125mm" height="176mm" />
|
||||
<Paper-size id="B7" name="B7" pwg_class="iso" width="88mm" height="125mm" />
|
||||
<Paper-size id="B8" name="B8" pwg_class="iso" width="62mm" height="88mm" />
|
||||
<Paper-size id="B9" name="B9" pwg_class="iso" width="44mm" height="62mm" />
|
||||
<Paper-size id="B10" name="B10" pwg_class="iso" width="31mm" height="44mm" />
|
||||
|
||||
<!-- Envelopes -->
|
||||
<Paper-size id="number10" name="#10 Envelope" pwg_size="na_number-10" width="4.125in" height="9.5in"/>
|
||||
<Paper-size id="monarch" name="Monarch Envelope" pwg_size="na_monarch" width="3.875in" height="7.5in"/>
|
||||
<Paper-size id="c5" name="C5" pwg_size="iso_c5" width="162mm" height="229mm"/>
|
||||
<Paper-size id="c6" name="C6" pwg_size="iso_c6" width="114mm" height="162mm"/>
|
||||
<Paper-size id="dl" name="DL" pwg_size="iso_dl" width="110mm" height="220mm"/>
|
||||
<Paper-size id="personal" name="Personal" pwg_class="na" width="3.625in" height="6.5in" type="envelope" />
|
||||
<Paper-size id="monarch" name="Monarch" pwg_class="na" width="3.875in" height="7.5in" type="envelope" />
|
||||
<Paper-size id="no9" name="#9" pwg_class="na" width="3.875in" height="8.875in" type="envelope" />
|
||||
<Paper-size id="no10" name="#10" pwg_class="na" width="4.125in" height="9.5in" type="envelope" />
|
||||
<Paper-size id="no11" name="#11" pwg_class="na" width="4.5in" height="10.375in" type="envelope" />
|
||||
<Paper-size id="no12" name="#12" pwg_class="na" width="4.75in" height="11in" type="envelope" />
|
||||
<Paper-size id="no14" name="#14" pwg_class="na" width="5in" height="11.5in" type="envelope" />
|
||||
<Paper-size id="dl" name="DL" pwg_class="iso" width="110mm" height="220mm" type="envelope" />
|
||||
<Paper-size id="c4" name="C4" pwg_class="iso" width="229mm" height="324mm" type="envelope" />
|
||||
<Paper-size id="c5" name="C5" pwg_class="iso" width="162mm" height="229mm" type="envelope" />
|
||||
<Paper-size id="c6" name="C6" pwg_class="iso" width="114mm" height="162mm" type="envelope" />
|
||||
<Paper-size id="b6" name="B6" pwg_class="iso" width="125mm" height="176mm" type="envelope" />
|
||||
|
||||
<!-- ISO 217 -->
|
||||
<Paper-size id="RA0" name="RA0" pwg_size="iso_ra0" width="860mm" height="1220mm"/>
|
||||
<Paper-size id="RA1" name="RA1" pwg_size="iso_ra1" width="610mm" height="860mm"/>
|
||||
<Paper-size id="RA2" name="RA2" pwg_size="iso_ra2" width="430mm" height="610mm"/>
|
||||
<Paper-size id="RA3" name="RA3" pwg_size="iso_ra3" width="305mm" height="430mm"/>
|
||||
<Paper-size id="RA4" name="RA4" pwg_size="iso_ra4" width="215mm" height="305mm"/>
|
||||
<Paper-size id="SRA0" name="SRA0" pwg_size="iso_sra0" width="900mm" height="1280mm"/>
|
||||
<Paper-size id="SRA1" name="SRA1" pwg_size="iso_sra1" width="640mm" height="900mm"/>
|
||||
<Paper-size id="SRA2" name="SRA2" pwg_size="iso_sra2" width="450mm" height="640mm"/>
|
||||
<Paper-size id="SRA3" name="SRA3" pwg_size="iso_sra3" width="320mm" height="450mm"/>
|
||||
<Paper-size id="SRA4" name="SRA4" pwg_size="iso_sra4" width="225mm" height="320mm"/>
|
||||
<Paper-size id="RA0" name="RA0" pwg_class="iso" width="860mm" height="1220mm" />
|
||||
<Paper-size id="RA1" name="RA1" pwg_class="iso" width="610mm" height="860mm" />
|
||||
<Paper-size id="RA2" name="RA2" pwg_class="iso" width="430mm" height="610mm" />
|
||||
<Paper-size id="RA3" name="RA3" pwg_class="iso" width="305mm" height="430mm" />
|
||||
<Paper-size id="RA4" name="RA4" pwg_class="iso" width="215mm" height="305mm" />
|
||||
<Paper-size id="SRA0" name="SRA0" pwg_class="iso" width="900mm" height="1280mm" />
|
||||
<Paper-size id="SRA1" name="SRA1" pwg_class="iso" width="640mm" height="900mm" />
|
||||
<Paper-size id="SRA2" name="SRA2" pwg_class="iso" width="450mm" height="640mm" />
|
||||
<Paper-size id="SRA3" name="SRA3" pwg_class="iso" width="320mm" height="450mm" />
|
||||
<Paper-size id="SRA4" name="SRA4" pwg_class="iso" width="225mm" height="320mm" />
|
||||
|
||||
</Glabels-paper-sizes>
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
<Template brand="PEARL" part="PE-8004" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-PE8004-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="70mm" height="36mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="3" ny="8" x0="0mm" y0="4.8mm" dx="70mm" dy="36mm"/>
|
||||
@@ -27,7 +26,6 @@
|
||||
<Template brand="PEARL" part="VM-6085" size="A4" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6085-2204.shtml"/>
|
||||
<Label-round id="0" radius="20mm" waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="4" ny="6" x0="16mm" y0="13.5mm" dx="46mm" dy="46mm"/>
|
||||
@@ -42,7 +40,6 @@
|
||||
<Template brand="PEARL" part="PE-8008" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-PE8008-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="48.4mm" height="25.4mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="4" ny="10" x0="8mm" y0="21.5mm" dx="48.4mm" dy="25.4mm"/>
|
||||
@@ -57,7 +54,6 @@
|
||||
<Template brand="PEARL" part="PE-8007" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-PE8007-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
@@ -72,7 +68,6 @@
|
||||
<Template brand="PEARL" part="PE-8350" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-PE8350-2010.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
@@ -87,7 +82,6 @@
|
||||
<Template brand="PEARL" part="PE-8351" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-PE8351-2200.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
@@ -103,8 +97,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
|
||||
<Meta product_url="http://www.pearl.de/a-VM5040-2002.shtml"/>
|
||||
<Label-rectangle id="0" width="45mm" height="55mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="3" ny="4" x0="27mm" y0="22.5mm" dx="55mm" dy="65mm"/>
|
||||
@@ -119,7 +111,6 @@
|
||||
<Template brand="PEARL" part="VM-5081" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5081-2200.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
@@ -134,7 +125,6 @@
|
||||
<Template brand="PEARL" part="VM-5217" size="A4" _description="Bottle/jar labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5217-2200.shtml"/>
|
||||
<Label-rectangle id="0" width="100mm" height="130mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="2" x0="4.5mm" y0="14mm" dx="107mm" dy="130mm"/>
|
||||
@@ -149,7 +139,6 @@
|
||||
<Template brand="PEARL" part="VM-5220" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5220-2200.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
@@ -164,7 +153,6 @@
|
||||
<Template brand="PEARL" part="VM-5221" size="A4" _description="Floppy disk labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5221-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="70mm" height="70mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="3" ny="4" x0="0mm" y0="8.5mm" dx="70mm" dy="70mm"/>
|
||||
@@ -179,7 +167,6 @@
|
||||
<Template brand="PEARL" part="VM-6083" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6083-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="25.4mm" height="16.9mm" round="1.5mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="7" ny="16" x0="9mm" y0="13mm" dx="27.9mm" dy="16.9mm"/>
|
||||
@@ -194,7 +181,6 @@
|
||||
<Template brand="PEARL" part="VM-6096" size="A6" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6096-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="105mm" height="148mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="105mm" dy="148mm"/>
|
||||
@@ -209,7 +195,6 @@
|
||||
<Template brand="PEARL" part="VM-6097" size="A5" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6097-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="148mm" height="210mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="148mm" dy="210mm"/>
|
||||
@@ -225,7 +210,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6102-2202.shtml"/>
|
||||
<Label-rectangle id="0" width="45mm" height="55mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="3" ny="4" x0="27mm" y0="23.5mm" dx="55mm" dy="65mm"/>
|
||||
@@ -241,7 +225,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6206-2202.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="210mm" dy="297mm"/>
|
||||
@@ -256,7 +239,6 @@
|
||||
<Template brand="PEARL" part="VM-6232" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6232-2201.shtml"/>
|
||||
<Label-rectangle id="0" width="96.5mm" height="42.1mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="2" ny="6" x0="8.5mm" y0="21mm" dx="96.5mm" dy="42.1mm"/>
|
||||
@@ -271,7 +253,6 @@
|
||||
<Template brand="PEARL" part="VM-6233" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6233-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="105mm" height="74mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="4" x0="0mm" y0="0.5mm" dx="105mm" dy="74mm"/>
|
||||
@@ -286,7 +267,6 @@
|
||||
<Template brand="PEARL" part="VM-6234" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6234-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="99.1mm" height="57mm" round="2.5mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="5" x0="5mm" y0="6mm" dx="102.1mm" dy="57mm"/>
|
||||
@@ -301,7 +281,6 @@
|
||||
<Template brand="PEARL" part="VM-6252" size="A4" _description="Full-page labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6252-2202.shtml"/>
|
||||
<Label-rectangle id="0" width="210mm" height="297mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="0mm" y0="0mm" dx="0mm" dy="297mm"/>
|
||||
@@ -316,7 +295,6 @@
|
||||
<Template brand="PEARL" part="VM-6398" size="A4" _description="SD card labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6398-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="19.6mm" height="25mm" round="1.2mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="1.5mm"/>
|
||||
<Layout nx="9" ny="10" x0="4.5mm" y0="10mm" dx="22.6mm" dy="28mm"/>
|
||||
@@ -329,7 +307,6 @@
|
||||
<Template brand="PEARL" part="VM-8005" size="A4" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-PE8005-2204.shtml"/>
|
||||
<Label-rectangle id="0" width="105mm" height="41mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="7" x0="0mm" y0="5mm" dx="105mm" dy="41mm"/>
|
||||
@@ -345,7 +322,6 @@
|
||||
<Template brand="PEARL" part="VM-6630" size="A4" _description="DVD insert">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6630-2211.shtml"/>
|
||||
<Label-rectangle id="0" width="182mm" height="276mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-rect x1="2mm" y1="2mm" w="178mm" h="128mm"/>
|
||||
<Markup-rect x1="2mm" y1="146mm" w="178mm" h="128mm"/>
|
||||
@@ -362,7 +338,6 @@
|
||||
<Template brand="PEARL" part="VM-5513-1" size="A4" _description="CD/DVD insert (front)">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5513-2214.shtml"/>
|
||||
<Label-rectangle id="0" width="120mm" height="120mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="1" x0="61mm" y0="24mm" dx="130mm" dy="130mm"/>
|
||||
@@ -376,7 +351,6 @@
|
||||
<Template brand="PEARL" part="VM-5513-2" size="A4" _description="CD/DVD insert (back)">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5513-2214.shtml"/>
|
||||
<Label-rectangle id="0" width="150mm" height="117.5mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-rect x1="8mm" y1="2mm" w="134mm" h="113.5mm"/>
|
||||
<Markup-line x1="6mm" y1="0mm" x2="6mm" y2="117.5mm"/>
|
||||
@@ -395,7 +369,6 @@
|
||||
<Template brand="Sattleford" part="VM-5019" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5019-2014.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54.2mm" round="0mm" x_waste="5mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="5" x0="13.5mm" y0="13.5mm" dx="95mm" dy="54.2mm"/>
|
||||
@@ -411,7 +384,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5040-2002.shtml"/>
|
||||
<Label-rectangle id="0" width="45mm" height="54.5mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="3" ny="4" x0="28mm" y0="24.5mm" dx="55mm" dy="64.5mm"/>
|
||||
@@ -426,7 +398,6 @@
|
||||
<Template brand="Sattleford" part="VM-5061" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5061-2014.shtml"/>
|
||||
<Label-rectangle id="0" width="86mm" height="53.8mm" round="0mm" x_waste="2.5mm" y_waste="1mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="5" x0="16.5mm" y0="10mm" dx="91mm" dy="55.8mm"/>
|
||||
@@ -441,7 +412,6 @@
|
||||
<Template brand="Sattleford" part="VM-6059" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6059-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54mm" round="0mm" x_waste="5mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="5" x0="16mm" y0="14mm" dx="95mm" dy="54mm"/>
|
||||
@@ -456,7 +426,6 @@
|
||||
<Template brand="Sattleford" part="VM-6066" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6066-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54mm" round="0mm" x_waste="5mm" y_waste="0mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="2" ny="5" x0="14mm" y0="13mm" dx="95mm" dy="54mm"/>
|
||||
@@ -471,7 +440,6 @@
|
||||
<Template brand="Sattleford" part="VM-6067" size="A4" _description="Name plates">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6067-5026.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54mm" round="0mm" x_waste="5mm" y_waste="0mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="5" x0="15mm" y0="13mm" dx="95mm" dy="54mm"/>
|
||||
@@ -487,7 +455,6 @@
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta category="photo"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6102-2202.shtml"/>
|
||||
<Label-rectangle id="0" width="45mm" height="55mm" round="0mm" x_waste="5mm" y_waste="5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="3" ny="4" x0="27mm" y0="23.5mm" dx="55mm" dy="65mm"/>
|
||||
@@ -503,7 +470,6 @@
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta category="foldable"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6200-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="180mm" height="50mm" round="3mm" x_waste="0mm" y_waste="2.5mm">
|
||||
<Markup-rect x1="3.2mm" y1="3.2mm" w="83.6mm" h="43.6mm"/>
|
||||
<Markup-rect x1="93.2mm" y1="3.2mm" w="83.6mm" h="43.6mm"/>
|
||||
@@ -518,7 +484,6 @@
|
||||
<Template brand="Sattleford" part="VM-6253" size="A4" _description="Business cards">
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6253-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54mm" round="0mm" x_waste="1mm" y_waste="2.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="5" x0="16.5mm" y0="6mm" dx="90mm" dy="55.5mm"/>
|
||||
@@ -534,7 +499,6 @@
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta category="foldable"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6356-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="170mm" height="54mm" round="0mm" x_waste="0mm" y_waste="0mm">
|
||||
<Markup-rect x1="3.2mm" y1="3.2mm" w="78.6mm" h="47.6mm"/>
|
||||
<Markup-rect x1="88.2mm" y1="3.2mm" w="78.6mm" h="47.6mm"/>
|
||||
@@ -553,7 +517,6 @@
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta category="foldable"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6700-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="180mm" height="50mm" round="0mm" x_waste="0mm" y_waste="2.5mm">
|
||||
<Markup-rect x1="3.2mm" y1="3.2mm" w="83.6mm" h="43.6mm"/>
|
||||
<Markup-rect x1="93.2mm" y1="3.2mm" w="83.6mm" h="43.6mm"/>
|
||||
@@ -570,7 +533,6 @@
|
||||
<Template brand="Sattleford" part="VM-6084" size="A4" _description="Elliptical labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="elliptical-label"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6084-2204.shtml"/>
|
||||
<Label-ellipse id="0" width="63.5mm" height="42.3mm" waste="0mm">
|
||||
<Markup-margin size="2mm"/>
|
||||
<Layout nx="3" ny="6" x0="7.25mm" y0="11.6mm" dx="66mm" dy="46.3mm"/>
|
||||
@@ -588,7 +550,6 @@
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta print="mirrored"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM5112-2411.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="54.25mm" round="3.5mm" x_waste="7mm" y_waste="7.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="4" x0="12mm" y0="21mm" dx="100mm" dy="68.75mm"/>
|
||||
@@ -604,7 +565,6 @@
|
||||
<Meta category="card"/>
|
||||
<Meta category="business-card"/>
|
||||
<Meta print="mirrored"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6310-2013.shtml"/>
|
||||
<Label-rectangle id="0" width="85mm" height="53.5mm" round="2.5mm" x_waste="7.5mm" y_waste="7.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="2" ny="4" x0="12mm" y0="18mm" dx="100mm" dy="69mm"/>
|
||||
@@ -620,7 +580,6 @@
|
||||
<Template brand="Your Design" part="VM-6352" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6352-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="17.9mm" waste="1.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
@@ -634,7 +593,6 @@
|
||||
<Template brand="Your Design" part="VM-6353" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6353-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="8.9mm" waste="1.5mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
@@ -648,7 +606,6 @@
|
||||
<Template brand="Your Design" part="VM-6354" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6354-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="18mm" waste="1.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
@@ -662,7 +619,6 @@
|
||||
<Template brand="Your Design" part="VM-6355" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6355-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="8.9mm" waste="1.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
@@ -676,7 +632,6 @@
|
||||
<Template brand="Your Design" part="VM-6542" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6542-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="8.9mm" waste="3.175mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="2" x0="46mm" y0="25mm" dx="123.75mm" dy="128mm"/>
|
||||
@@ -689,7 +644,6 @@
|
||||
<Template brand="Your Design" part="VM-6754" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6754-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="18mm" waste="3.175mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="2" x0="46.5mm" y0="20.5mm" dx="123.75mm" dy="138mm"/>
|
||||
@@ -702,7 +656,6 @@
|
||||
<Template brand="Your Design" part="VM-6852" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6852-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="17.9mm" waste="1.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
@@ -716,7 +669,6 @@
|
||||
<Template brand="PEARL" part="VM-6853" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6853-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="8.9mm" waste="1.5mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
@@ -730,7 +682,6 @@
|
||||
<Template brand="Your Design" part="VM-6854" size="A4" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.pearl.de/a-VM6854-2213.shtml"/>
|
||||
<Label-cd id="0" radius="58.7mm" hole="18mm" waste="1.5mm">
|
||||
<Markup-margin size="3.2mm"/>
|
||||
<Layout nx="1" ny="2" x0="3mm" y0="3mm" dx="120.4mm" dy="173mm"/>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,11 +2,10 @@
|
||||
|
||||
<Glabels-templates>
|
||||
|
||||
|
||||
|
||||
<!-- ******************************************************************** -->
|
||||
<!-- Sheetlabels products. -->
|
||||
<!-- ******************************************************************** -->
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 4 per sheet -->
|
||||
@@ -14,21 +13,18 @@
|
||||
<Template brand="SheetLabels" part="SL1" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL1"/>
|
||||
<Label-rectangle id="0" width="5.5in" height="2.25in" round="0.2in" x_waste="1in" y_waste="0.125in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="1" ny="4" x0="1.5in" y0="0.625in" dx="7.5in" dy="2.5in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 4 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL10" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL10"/>
|
||||
<Label-rectangle id="0" width="109.5mm" height="50.8mm" round="5mm" x_waste="9mm" y_waste="9mm">
|
||||
<Markup-margin size="3.175mm"/>
|
||||
<Layout nx="1" ny="4" x0="53.2mm" y0="12.7mm" dx="127.5mm" dy="68.8mm"/>
|
||||
@@ -41,7 +37,6 @@
|
||||
<Template brand="SheetLabels" part="SL100" size="US-Letter" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL100"/>
|
||||
<Label-rectangle id="0" width="2.625in" height="1in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="3" ny="10" x0="0.1875in" y0="0.5in" dx="2.75in" dy="1in"/>
|
||||
@@ -54,7 +49,6 @@
|
||||
<Template brand="SheetLabels" part="SL101" size="US-Letter" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL101"/>
|
||||
<Label-rectangle id="0" width="4in" height="1.333333333in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="2" ny="7"
|
||||
@@ -68,7 +62,6 @@
|
||||
<Template brand="SheetLabels" part="SL102" size="US-Letter" _description="Shipping labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL102"/>
|
||||
<Label-rectangle id="0" width="4in" height="2in" round="0.125in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="5" x0="0.1625in" y0="0.5in" dx="4.1875in" dy="2in"/>
|
||||
@@ -81,7 +74,6 @@
|
||||
<Template brand="SheetLabels" part="SL103" size="US-Letter" _description="Shipping labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL103"/>
|
||||
<Label-rectangle id="0" width="4in" height="3.333333333in" round="0.125in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="3" x0="0.15625in" y0="0.5in" dx="4.1875in" dy="3.333333333in"/>
|
||||
@@ -94,7 +86,6 @@
|
||||
<Template brand="SheetLabels" part="SL104" size="US-Letter" _description="Shipping labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL104"/>
|
||||
<Label-rectangle id="0" width="4in" height="3.333333333in" round="0.125in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="3" x0="0.15625in" y0="0.5in" dx="4.1875in" dy="3.333333333in"/>
|
||||
@@ -107,7 +98,6 @@
|
||||
<Template brand="SheetLabels" part="SL105" size="US-Letter" _description="Return address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL105"/>
|
||||
<Label-rectangle id="0" width="1.75in" height="0.5in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="4" ny="20" x0="0.28125in" y0="0.5in" dx="2.0625in" dy="0.5in"/>
|
||||
@@ -120,7 +110,6 @@
|
||||
<Template brand="SheetLabels" part="SL107" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL107"/>
|
||||
<Label-round id="0" radius="0.8125in" waste="0pt">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="4" ny="6" x0="0.4157in" y0="0.549in" dx="2.0145in" dy="1.6554in"/>
|
||||
@@ -133,7 +122,6 @@
|
||||
<Template brand="SheetLabels" part="SL108" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL108"/>
|
||||
<Label-round id="0" radius="1.25in" waste="0pt">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="3" ny="4" x0="0.21in" y0="0.425in" dx="2.75in" dy="2.515in"/>
|
||||
@@ -145,7 +133,6 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL109" size="US-Letter" _description="Filing labels">
|
||||
<Meta category="label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL109"/>
|
||||
<Label-rectangle id="0" width="3.4375in" height="0.666666667in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="2" ny="15" x0="0.53125in" y0="0.5in" dx="4in" dy="0.666666667in"/>
|
||||
@@ -157,7 +144,6 @@
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL11" size="US-Letter" _description="Shipping labels">
|
||||
<Meta category="label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL11"/>
|
||||
<Label-rectangle id="0" width="2.3125in" height="1.4375in" round="0in" x_waste="0.125in" y_waste="0.125in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="3" ny="6" x0="0.53125in" y0="0.563in" dx="2.5625in" dy="1.688in"/>
|
||||
@@ -170,7 +156,6 @@
|
||||
<Template brand="SheetLabels" part="SL110" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL110"/>
|
||||
<Label-cd id="0" radius="166.5pt" hole="58.5pt" waste="9pt">
|
||||
<Markup-margin size="9pt"/>
|
||||
<Layout nx="1" ny="2" x0="144pt" y0="36pt" dx="351pt" dy="396pt"/>
|
||||
@@ -183,7 +168,6 @@
|
||||
<Template brand="SheetLabels" part="SL113" size="US-Letter" _description="CD/DVD labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL113"/>
|
||||
<Label-cd id="0" radius="166.5pt" hole="58.5pt" waste="9pt">
|
||||
<Markup-margin size="9pt"/>
|
||||
<Layout nx="1" ny="1" x0="0.7cm" y0="0.7cm" dx="0pt" dy="0cm"/>
|
||||
@@ -198,7 +182,6 @@
|
||||
<Template brand="SheetLabels" part="SL114" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL114"/>
|
||||
<Label-round id="0" radius="0.5in" waste="0.061in">
|
||||
<Markup-margin size="0.061in"/>
|
||||
<Layout nx="7" ny="9" x0="0.375in" y0="0.5in" dx="1.125in" dy="1.125in"/>
|
||||
@@ -211,7 +194,6 @@
|
||||
<Template brand="SheetLabels" part="SL115" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL115"/>
|
||||
<Label-round id="0" radius="0.375in" waste="0.031in">
|
||||
<Markup-margin size="0.06in"/>
|
||||
<Layout nx="9" ny="12" x0="0.625in" y0="0.656in" dx="0.812in" dy="0.812in"/>
|
||||
@@ -224,7 +206,6 @@
|
||||
<Template brand="SheetLabels" part="SL116" size="US-Letter" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL116"/>
|
||||
<Label-rectangle id="0" width="4in" height="1.5in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="2" ny="6" x0="0.1875in" y0="1in" dx="4.125in" dy="1.5in"/>
|
||||
@@ -237,7 +218,6 @@
|
||||
<Template brand="SheetLabels" part="SL121" size="US-Letter" _description="Diskette labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL121"/>
|
||||
<Label-rectangle id="0" width="2.75in" height="2.75in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="3" ny="3" x0="0.125in" y0="0.5in" dx="2.75in" dy="3in"/>
|
||||
@@ -251,7 +231,6 @@
|
||||
_description="CD/DVD labels (disc labels)">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL122"/>
|
||||
<Label-cd id="0" radius="2.3125in" hole="0.8125in" waste="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Markup-line x1="0" y1="2.3125in" x2="1.5in" y2="2.3125in"/>
|
||||
@@ -262,20 +241,17 @@
|
||||
</Label-cd>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Round labels, 20 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL123" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL123"/>
|
||||
<Label-round id="0" radius="1in" waste="0.03in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="4" ny="5" x0="0.156in" y0="0.375in" dx="2.062in" dy="2.062in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Round labels, 30 per sheet -->
|
||||
@@ -283,49 +259,42 @@
|
||||
<Template brand="SheetLabels" part="SL125" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL125"/>
|
||||
<Label-round id="0" radius="0.75in" waste="0.062in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="5" ny="6" x0="0.25in" y0="0.5in" dx="1.625in" dy="1.7in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Round labels, 6 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL128" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL128"/>
|
||||
<Label-round id="0" radius="1.75in" waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="3" x0="0.5in" y0="0.2in" dx="4in" dy="3.55in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Round labels, 1 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL129" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL129"/>
|
||||
<Label-round id="0" radius="2.75in" waste="1.5in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="1" ny="1" x0="1.5in" y0="2.75in" dx="8.5in" dy="5.5in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 4 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL145" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL145"/>
|
||||
<Label-rectangle id="0" width="3.5in" height="5in" round="0.1in" x_waste="0.25in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="2" x0="0.5in" y0="0.5in" dx="4in" dy="5in"/>
|
||||
@@ -338,13 +307,11 @@
|
||||
<Template brand="SheetLabels" part="SL200" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL200"/>
|
||||
<Label-round id="0" radius="1.969in" waste="0.03in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="2" x0="0.28125in" y0="1.531in" dx="4in" dy="4in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Elliptical labels, 10 per sheet -->
|
||||
@@ -352,28 +319,24 @@
|
||||
<Template brand="SheetLabels" part="SL201" size="US-Letter" _description="Bottle/jar labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="elliptical-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL201"/>
|
||||
<Label-ellipse id="0" width="3.937in" height="1.937in" waste="0.03in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="5" x0="0.281in" y0="0.531in" dx="4in" dy="2in"/>
|
||||
</Label-ellipse>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Round labels, 6 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL228" size="US-Letter" _description="Round labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="round-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL228"/>
|
||||
<Label-round id="0" radius="1.5in" waste="0.25in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="3" x0="0.75in" y0="0.5in" dx="4in" dy="3.5in"/>
|
||||
</Label-round>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: VCR labels, 1_7/8'' x 3_1/16'', 10 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
@@ -381,27 +344,23 @@
|
||||
_description="Video tape face labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL302"/>
|
||||
<Label-rectangle id="0" width="220" height="133" round="5">
|
||||
<Markup-margin size="5"/>
|
||||
<Layout nx="2" ny="5" x0="80" y0="60.5" dx="236" dy="133"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Bottle labels, 3 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL303" size="US-Letter" _description="Bottle/jar labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL303"/>
|
||||
<Label-rectangle id="0" width="7in" height="3in" round="0.1in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="1" ny="3" x0="0.75in" y0="1in" dx="7in" dy="3in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Bottle labels, 5 per sheet -->
|
||||
@@ -409,13 +368,11 @@
|
||||
<Template brand="SheetLabels" part="SL304" size="US-Letter" _description="Bottle/jar labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL304"/>
|
||||
<Label-rectangle id="0" width="8.5in" height="2in" round="0in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="1" ny="5" x0="0in" y0="0.5in" dx="8.5in" dy="2in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 2 per sheet -->
|
||||
@@ -423,13 +380,11 @@
|
||||
<Template brand="SheetLabels" part="SL517" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL517"/>
|
||||
<Label-rectangle id="0" width="6.5in" height="4.5in" round="0.375in" x_waste="0in" y_waste="0.343in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="1" ny="2" x0="1in" y0="0.656in" dx="6.5in" dy="5.1875in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 4 per sheet -->
|
||||
@@ -437,63 +392,54 @@
|
||||
<Template brand="SheetLabels" part="SL522" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL522"/>
|
||||
<Label-rectangle id="0" width="4in" height="5in" round="0.16in" x_waste="0.09in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="2" x0="0.125in" y0="0.5in" dx="4.19in" dy="5in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 5 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL527" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL527"/>
|
||||
<Label-rectangle id="0" width="8in" height="2in" round="0in" x_waste="0.1in" y_waste="0in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="1" ny="5" x0="0.25in" y0="0.5in" dx="8.2in" dy="2in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 10 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL529" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL529"/>
|
||||
<Label-rectangle id="0" width="8in" height="1in" round="0in" x_waste="0.1in" y_waste="0in">
|
||||
<Markup-margin size="0.06in"/>
|
||||
<Layout nx="1" ny="10" x0="0.25in" y0="0.5in" dx="8.2in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 6 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL530" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL5"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="3.665in" round="0in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="3" x0="0in" y0="0in" dx="4.25in" dy="3.665in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Mailing labels, 10 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL540" size="US-Letter" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL540"/>
|
||||
<Label-rectangle id="0" width="4.25in" height="2in" round="0in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="2" ny="5" x0="0in" y0="0.5in" dx="4.25in" dy="2in"/>
|
||||
@@ -506,21 +452,18 @@
|
||||
<Template brand="SheetLabels" part="SL550" size="US-Letter" _description="Address labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL550"/>
|
||||
<Label-rectangle id="0" width="4in" height="1in" round="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Layout nx="2" ny="10" x0="0.15625in" y0="0.5in" dx="4.1875in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 21 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL552" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL552"/>
|
||||
<Label-rectangle id="0" width="2.833in" height="1.5in" round="0in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="3" ny="7" x0="0in" y0="0.25in" dx="2.833in" dy="1.5in"/>
|
||||
@@ -533,21 +476,18 @@
|
||||
<Template brand="SheetLabels" part="SL556" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL556"/>
|
||||
<Label-rectangle id="0" width="2in" height="1in" round="0in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="4" ny="10" x0="0.25in" y0="0.5in" dx="2in" dy="1in"/>
|
||||
</Label-rectangle>
|
||||
</Template>
|
||||
|
||||
|
||||
<!-- =================================================================== -->
|
||||
<!-- SheetLabels: Rectangular labels, 50 per sheet -->
|
||||
<!-- =================================================================== -->
|
||||
<Template brand="SheetLabels" part="SL559" size="US-Letter" _description="Rectangular labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="rectangle-label"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL559"/>
|
||||
<Label-rectangle id="0" width="1.5in" height="1in" round="0in" x_waste="0in" y_waste="0in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="5" ny="10" x0="0.5in" y0="0.5in" dx="1.5in" dy="1in"/>
|
||||
@@ -561,7 +501,6 @@
|
||||
_description="CD/DVD labels (disc labels)">
|
||||
<Meta category="label"/>
|
||||
<Meta category="media"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL563"/>
|
||||
<Label-cd id="0" radius="2.3125in" hole="0.8125in" waste="0.0625in">
|
||||
<Markup-margin size="0.0625in"/>
|
||||
<Markup-line x1="0" y1="2.3125in" x2="1.5in" y2="2.3125in"/>
|
||||
@@ -578,7 +517,6 @@
|
||||
<Template brand="SheetLabels" part="SL573" size="US-Letter" _description="Mailing labels">
|
||||
<Meta category="label"/>
|
||||
<Meta category="mail"/>
|
||||
<Meta product_url="http://www.sheet-labels.com/labels/SL573"/>
|
||||
<Label-rectangle id="0" width="4in" height="3in" round="0.125in">
|
||||
<Markup-margin size="0.125in"/>
|
||||
<Layout nx="2" ny="3" x0="0.19in" y0="1.in" dx="4.125in" dy="3in"/>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Executable
+6
@@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
# Run the full bats test suite for sethLabels packaging scripts.
|
||||
# Requires: bats (apt install bats).
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
exec bats *.bats
|
||||
@@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# Tests for scripts/check-no-upstream-edits.sh
|
||||
|
||||
setup() {
|
||||
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
||||
SCRIPT="$REPO_ROOT/scripts/check-no-upstream-edits.sh"
|
||||
TMP_REPO=""
|
||||
}
|
||||
|
||||
teardown() {
|
||||
if [ -n "$TMP_REPO" ] && [ -d "$TMP_REPO" ]; then
|
||||
rm -rf "$TMP_REPO"
|
||||
fi
|
||||
}
|
||||
|
||||
# --- Helpers ---
|
||||
|
||||
# Build a minimal disposable repo that mimics the sethLabels structure with a
|
||||
# local "upstream/master" ref. Returns its path via stdout.
|
||||
make_test_repo() {
|
||||
local tmp=$(mktemp -d)
|
||||
cd "$tmp"
|
||||
git init -q -b master
|
||||
git config user.email "test@test"
|
||||
git config user.name "test"
|
||||
# Pretend-upstream files
|
||||
echo "upstream content" > UPSTREAM_FILE.md
|
||||
echo "real source" > glabels-source.cpp
|
||||
git add UPSTREAM_FILE.md glabels-source.cpp
|
||||
git commit -m "upstream base" -q
|
||||
# Create a local "upstream/master" ref pointing here
|
||||
git update-ref refs/remotes/upstream/master HEAD
|
||||
# Create a feature branch for sethLabels content
|
||||
git checkout -q -b main
|
||||
echo "$tmp"
|
||||
}
|
||||
|
||||
# --- Tests ---
|
||||
|
||||
@test "script exists and is executable" {
|
||||
[ -x "$SCRIPT" ]
|
||||
}
|
||||
|
||||
@test "exits 0 on clean state with only allowlisted committed changes" {
|
||||
TMP_REPO=$(make_test_repo)
|
||||
cd "$TMP_REPO"
|
||||
mkdir -p scripts packaging sethlabels-docs .claude/handoffs
|
||||
echo "test" > CLAUDE.md
|
||||
echo "test" > scripts/something.sh
|
||||
echo "test" > packaging/x.env
|
||||
echo "test" > sethlabels-docs/spec.md
|
||||
echo "" >> .gitignore
|
||||
git add -A
|
||||
git commit -m "sethLabels additions" -q
|
||||
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 0 ]
|
||||
[ -z "$output" ]
|
||||
}
|
||||
|
||||
@test "exits 1 when an upstream file is committed-modified" {
|
||||
TMP_REPO=$(make_test_repo)
|
||||
cd "$TMP_REPO"
|
||||
echo "evil edit" >> glabels-source.cpp
|
||||
git add glabels-source.cpp
|
||||
git commit -m "BAD: edit upstream file" -q
|
||||
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" == *"glabels-source.cpp"* ]]
|
||||
[[ "$output" == *"strict-zero"* ]]
|
||||
}
|
||||
|
||||
@test "exits 1 when an upstream file has uncommitted working-tree edits" {
|
||||
TMP_REPO=$(make_test_repo)
|
||||
cd "$TMP_REPO"
|
||||
echo "uncommitted evil edit" >> glabels-source.cpp
|
||||
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" == *"glabels-source.cpp"* ]]
|
||||
}
|
||||
|
||||
@test "exits 0 when only .gitignore is modified (allowlisted)" {
|
||||
TMP_REPO=$(make_test_repo)
|
||||
cd "$TMP_REPO"
|
||||
echo "*.tmp" >> .gitignore
|
||||
git add .gitignore
|
||||
git commit -m "extend gitignore" -q
|
||||
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "exits 0 when only CLAUDE.md / IDEA.md / DECISIONS.md / README.sethlabels.md are added" {
|
||||
TMP_REPO=$(make_test_repo)
|
||||
cd "$TMP_REPO"
|
||||
echo "x" > CLAUDE.md
|
||||
echo "x" > IDEA.md
|
||||
echo "x" > DECISIONS.md
|
||||
echo "x" > README.sethlabels.md
|
||||
git add -A
|
||||
git commit -m "add sethLabels root docs" -q
|
||||
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 0 ]
|
||||
}
|
||||
|
||||
@test "exits 1 when upstream/master ref is missing" {
|
||||
TMP_REPO=$(make_test_repo)
|
||||
cd "$TMP_REPO"
|
||||
# Delete the upstream/master ref we set in make_test_repo.
|
||||
git update-ref -d refs/remotes/upstream/master
|
||||
# Modify an upstream file in working tree — would normally trigger violation.
|
||||
echo "edit" >> glabels-source.cpp
|
||||
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" == *"upstream/master ref not found"* || "$stderr" == *"upstream/master ref not found"* ]]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# Tests for scripts/compute-version.sh
|
||||
# Invokes the real script against the real repo state.
|
||||
|
||||
setup() {
|
||||
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
||||
SCRIPT="$REPO_ROOT/scripts/compute-version.sh"
|
||||
}
|
||||
|
||||
@test "script exists and is executable" {
|
||||
[ -x "$SCRIPT" ]
|
||||
}
|
||||
|
||||
@test "output matches '<upstream-tag>-seth<N>' format" {
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ ^[0-9].+-seth[0-9]+$ ]]
|
||||
}
|
||||
|
||||
@test "N=1 when no prior seth-tags exist" {
|
||||
# This test assumes a clean tag db. If there ARE existing seth-tags, this
|
||||
# test will report N>1 and that's the correct value. Skipped if any
|
||||
# upstream-tag-seth* tag already exists.
|
||||
upstream_tag=$(git describe --tags --abbrev=0 upstream/master)
|
||||
existing=$(git tag --list "${upstream_tag}-seth*" | wc -l)
|
||||
if [ "$existing" -gt 0 ]; then
|
||||
skip "seth-tags already exist (count=$existing); N=1 invariant only holds on first release"
|
||||
fi
|
||||
run "$SCRIPT"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" == "${upstream_tag}-seth1" ]]
|
||||
}
|
||||
|
||||
@test "N increments past existing seth-tags" {
|
||||
upstream_tag=$(git describe --tags --abbrev=0 upstream/master)
|
||||
# Create a fake seth-tag for this test, then clean up.
|
||||
fake_tag="${upstream_tag}-seth99"
|
||||
git tag "$fake_tag" 2>/dev/null || true
|
||||
run "$SCRIPT"
|
||||
git tag -d "$fake_tag" >/dev/null 2>&1 || true
|
||||
[ "$status" -eq 0 ]
|
||||
# Existing count was at least 1 (our fake), so N >= 2.
|
||||
n="${output##*-seth}"
|
||||
[ "$n" -ge 2 ]
|
||||
}
|
||||
|
||||
@test "fails cleanly when upstream/master ref is missing" {
|
||||
# Run in a temp git repo with no upstream remote.
|
||||
tmp=$(mktemp -d)
|
||||
cd "$tmp"
|
||||
git init -q
|
||||
git commit --allow-empty -m "init" -q
|
||||
run "$SCRIPT"
|
||||
cd "$REPO_ROOT"
|
||||
rm -rf "$tmp"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
# Tests for scripts/lib/deps-debian.sh
|
||||
|
||||
setup() {
|
||||
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
||||
SCRIPT="$REPO_ROOT/scripts/lib/deps-debian.sh"
|
||||
}
|
||||
|
||||
@test "script exists and is executable" {
|
||||
[ -x "$SCRIPT" ]
|
||||
}
|
||||
|
||||
@test "sourceable: exposes SETHLABELS_DEPS array" {
|
||||
source "$SCRIPT"
|
||||
[ "${#SETHLABELS_DEPS[@]}" -gt 5 ]
|
||||
}
|
||||
|
||||
@test "SETHLABELS_DEPS contains core build tools" {
|
||||
source "$SCRIPT"
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" cmake "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" ninja-build "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" build-essential "* ]]
|
||||
}
|
||||
|
||||
@test "SETHLABELS_DEPS contains Qt6 libraries" {
|
||||
source "$SCRIPT"
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" qt6-base-dev "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" qt6-svg-dev "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" qt6-tools-dev "* ]]
|
||||
}
|
||||
|
||||
@test "SETHLABELS_DEPS contains barcode + zlib deps" {
|
||||
source "$SCRIPT"
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" zlib1g-dev "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" libqrencode-dev "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" libzint-dev "* ]]
|
||||
}
|
||||
|
||||
@test "SETHLABELS_DEPS contains packaging tools" {
|
||||
source "$SCRIPT"
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" dpkg-dev "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" fakeroot "* ]]
|
||||
[[ " ${SETHLABELS_DEPS[*]} " == *" wget "* ]]
|
||||
}
|
||||
|
||||
@test "executed: prints status and exits 0 (when all installed) OR 1 with apt-install hint" {
|
||||
run "$SCRIPT"
|
||||
if [ "$status" -eq 0 ]; then
|
||||
[[ "$output" == *"All build dependencies present"* ]]
|
||||
else
|
||||
[[ "$output" == *"sudo apt install"* ]]
|
||||
fi
|
||||
}
|
||||
|
||||
@test "executed: warns if not on Debian/Ubuntu" {
|
||||
# Simulate non-Debian by overriding /etc/os-release path via env var
|
||||
if [ -f /etc/os-release ] && grep -qE '^ID=(debian|ubuntu)' /etc/os-release; then
|
||||
skip "currently on Debian/Ubuntu — non-Debian path covered by source review"
|
||||
fi
|
||||
run "$SCRIPT"
|
||||
[[ "$output" == *"Debian"* || "$output" == *"Ubuntu"* ]]
|
||||
}
|
||||
@@ -15,13 +15,17 @@ el
|
||||
en_GB
|
||||
eo
|
||||
es
|
||||
et
|
||||
fi
|
||||
fr
|
||||
gl
|
||||
gu_IN
|
||||
hi_IN
|
||||
hu
|
||||
id
|
||||
it
|
||||
ja
|
||||
kab
|
||||
ko
|
||||
lv
|
||||
nb
|
||||
|
||||
@@ -271,6 +271,33 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GenericTemplate</name>
|
||||
<message>
|
||||
<source>Generic</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 full-page labels</source>
|
||||
<extracomment>%1 = page size. (e.g. A4)</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 envelope</source>
|
||||
<extracomment>%1 = envelope size. (e.g. DL)</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 half-page labels</source>
|
||||
<extracomment>%1 = page size. (e.g. A4)</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 quarter-page labels</source>
|
||||
<extracomment>%1 = page size. (e.g. A4)</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MergeView</name>
|
||||
<message>
|
||||
|
||||
+671
-669
File diff suppressed because it is too large
Load Diff
+664
-662
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
@@ -287,7 +287,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Records</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">Registros</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select all</source>
|
||||
@@ -299,7 +299,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">Examinar…</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -366,7 +366,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Editor</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">Editor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Barcode</source>
|
||||
|
||||
+13
-13
@@ -5,7 +5,7 @@
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<source>About gLabels</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Rakenduse teave: gLabels</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&License</source>
|
||||
@@ -2755,19 +2755,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBC MicroPDF417</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>HIBC MicroPDF417</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>MicroPDF417</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>MicroPDF417</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NVE-18 (SSCC-18)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>NVE-18 (SSCC-18)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PDF417 Compact</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>PDF417 kompaktne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pharmazentralnummer (PZN)</source>
|
||||
@@ -2775,7 +2775,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Channel Code</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Kanali kood</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Code 2 of 5 Industrial</source>
|
||||
@@ -2787,7 +2787,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>EAN-14</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>EAN-14</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>GS1 DataBar Omnidirectional</source>
|
||||
@@ -2795,19 +2795,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Han Xin</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Han Xin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flattermarken</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Flattermarken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>DPD Code</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>DPD kood</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>POSTNET</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>POSTNET</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Royal Mail 4-State Mailmark</source>
|
||||
@@ -2843,7 +2843,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>BC412 (SEMI TI-95)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>BC412 (SEMI TI-95)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2890,7 +2890,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>More detailed version information.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Üksikasjalikum versiooniteave.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
||||
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+54
-54
@@ -521,31 +521,31 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Grid</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Griglia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Configure grid behavior.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Configura il comportamento della griglia.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Origin</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Origine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Center</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Centro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Spacing</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Spaziatura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Top left corner</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Angolo in alto a sinistra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ripristino</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -624,15 +624,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Destination</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Destinazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Print</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Stampa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use system print dialog...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Usa la finestra di stampa di sistema...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -703,7 +703,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Select another product for this gLabels project.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Seleziona un altro prodotto per questo progetto gLabels.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -809,7 +809,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Label size:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Dimensione dell’etichetta:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Layout:</source>
|
||||
@@ -893,7 +893,7 @@
|
||||
<name>TemplateDesignerContinuousPage</name>
|
||||
<message>
|
||||
<source>Click "Cancel" to quit, or click "Back" to begin with a different product.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Fai clic su "Annulla" per uscire, oppure su "Indietro" per iniziare con un prodotto diverso.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -935,7 +935,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>This dialog will help you create a custom product template. Let's get started:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Questa finestra di dialogo ti aiuterà a creare un modello di prodotto personalizzato. Iniziamo:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1046,7 +1046,7 @@
|
||||
<name>TemplateDesignerPathPage</name>
|
||||
<message>
|
||||
<source>Click "Cancel" to quit, or click "Back" to begin with a different product.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Clicca su "Annulla" per uscire, oppure su "Indietro" per iniziare con un prodotto diverso.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1223,15 +1223,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Add variable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Aggiungi variabile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit selected variable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Modifica la variabile selezionata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete selected variable</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Elimina la variabile selezionata</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1357,7 +1357,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Drop</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Rilascia</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2123,19 +2123,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Print to file (PDF)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Stampa su file (PDF)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PDF files (*.pdf);;All files (*)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>File PDF (*.pdf);;Tutti i file (*)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 already exists.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>%1 esiste già.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to overwrite it?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Vuoi sovrascriverlo?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2607,7 +2607,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>DAFT Code</source>
|
||||
<translation type="unfinished">Codice DAFT</translation>
|
||||
<translation>Codice DAFT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Data Matrix</source>
|
||||
@@ -2723,123 +2723,123 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Aztec Runes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Rune azteche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>CEPNet (Brazilian Post)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>CEPNet (Posta Brasiliana)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Codablock-F</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Codablock-F</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Code 2 of 5 Standard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Code 2 of 5 Standard</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>GS1 DataBar Stacked</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>GS1 DataBar Impilato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>GS1 DataBar Stacked Omni.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>GS1 DataBar Impilato Omni.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>GS1 DataBar Expanded Stacked</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>GS1 DataBar Espanso Impilato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBC MicroPDF417</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>HIBC MicroPDF417</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>MicroPDF417</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>MicroPDF417</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NVE-18 (SSCC-18)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>NVE-18 (SSCC-18)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>PDF417 Compact</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>PDF417 Compact</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Pharmazentralnummer (PZN)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Numero centrale farmaceutico (PZN)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Channel Code</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Codice canale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Code 2 of 5 Industrial</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Code 2 of 5 Industrial</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>DotCode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>DotCode</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>EAN-14</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>EAN-14</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>GS1 DataBar Omnidirectional</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>GS1 DataBar Omnidirezionale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Han Xin</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Han Xin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Flattermarken</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Etichette irregolari</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>DPD Code</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Codice DPD</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>POSTNET</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>POSTNET</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Royal Mail 4-State Mailmark</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Royal Mail Mailmark a 4 stati</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>UPU S10</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>UPU S10</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>FIM (Facing ID Mark)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>FIM (Marcatura di orientamento)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>rMQR (Rectangular Micro QR)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>rMQR (Micro QR Rettangolare)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Royal Mail 4-State Customer</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Royal Mail 4-State Customer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>VIN (Vehicle ID Number)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>VIN (Numero di identificazione del veicolo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBC Codablock-F</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>HIBC Codablock-F</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Royal Mail 2-D Mailmark</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Royal Mail 2-D Mailmark</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>BC412 (SEMI TI-95)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>BC412 (SEMI TI-95)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+671
-669
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+671
-669
File diff suppressed because it is too large
Load Diff
+369
-481
File diff suppressed because it is too large
Load Diff
+555
-555
File diff suppressed because it is too large
Load Diff
+364
-364
File diff suppressed because it is too large
Load Diff
+525
-525
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user