diff options
author | Karl Berry <karl@freefriends.org> | 2013-12-13 22:20:40 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-12-13 22:20:40 +0000 |
commit | 2e18ec49471b5109220bcdbda439fb3461b42f61 (patch) | |
tree | a150c763a8eae02cfbe09b10a4af5fec533f9871 /Build | |
parent | bb69c6ad45c96b1cf0b5fa79318c64e26b1c9bcd (diff) |
pmxchords (12dec13)
git-svn-id: svn://tug.org/texlive/trunk@32405 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build')
3 files changed, 196 insertions, 0 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index ad4072b3b4e..0e62f01d415 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -141,6 +141,7 @@ texmf_other_scripts = \ pkfix/pkfix.pl \ pkfix-helper/pkfix-helper \ pmx/pmx2pdf.lua \ + pmxchords/pmxchords.lua \ pst2pdf/pst2pdf.pl \ ptex2pdf/ptex2pdf.lua \ purifyeps/purifyeps \ diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in index a9f4da2293d..35442038ae8 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.in +++ b/Build/source/texk/texlive/linked_scripts/Makefile.in @@ -346,6 +346,7 @@ texmf_other_scripts = \ pkfix/pkfix.pl \ pkfix-helper/pkfix-helper \ pmx/pmx2pdf.lua \ + pmxchords/pmxchords.lua \ pst2pdf/pst2pdf.pl \ ptex2pdf/ptex2pdf.lua \ purifyeps/purifyeps \ diff --git a/Build/source/texk/texlive/linked_scripts/pmxchords/pmxchords.lua b/Build/source/texk/texlive/linked_scripts/pmxchords/pmxchords.lua new file mode 100755 index 00000000000..13da5178d5b --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/pmxchords/pmxchords.lua @@ -0,0 +1,194 @@ +#!/usr/bin/env texlua +-- +-- global constants +-- +VERSION = "0.9.1" +FILE_SUFFIX="_chtr" +PMX_CMD="pmxab" + +--[[ + pmxchords.lua: transposes chord macros (e,g., \ch.C.\) and calls pmxab + + (c) Copyright 2013 Ondrej Fafejta <fafejtao@gmail.com> + https://github.com/fafejtao/pmxChords + +This program 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 2 of the License, or (at your +option) any later version. + +This program 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 this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +--]] + +--[[ + ChangeLog: + + version 0.9.1 2013-12-09 - added some options. Improved processing. + + version 0.9 2013-12-05 - rewrite code from perl to lua... +--]] + +function usage() + print("Usage: [texlua] pmxchords.lua basename[.pmx] ") + print(" 1. transpose chords into new file basename"..FILE_SUFFIX..".pmx") + print(" 2. call pmxab on transposed file basename"..FILE_SUFFIX..".pmx") + print(" 3. rename basename"..FILE_SUFFIX..".tex to basename.tex") + print("options: -v version") + print(" -h help") + print(" -s stop after first step. e.g. generate only transposed basename"..FILE_SUFFIX..".pmx file") +end + +function whoami () + print("This is pmxchords.lua version ".. VERSION) +end + +whoami() +if #arg == 0 then + usage() + os.exit(0) +end + +kpse.set_program_name("luatex") -- allows ChordsTr.lua to be installed in a texmf tree +require "ChordsTr" + +function parseInputSignature(line) + -- parse input signature from pmx digits line. Only one line digits format is supported! + -- e.g. + -- 1 1 2 4 2 4 0 -1 + -- signature is -1 : F major + local res = string.match(line, "^%s*[0-9]+%s+[0-9]+%s+[0-9]+%s+[0-9]+%s+[0-9]+%s+[0-9]+%s+[0-9]+%s+([%+%-]?[0-9]+)%s*$") + return tonumber(res) +end + +function parseOutputSignature(line) + -- parse output signature from pmx + -- e.g. + -- K-2+2 + -- output signature is +2 : D major + local res = string.match(line, "^K[%+%-]?[0-9]+([%+%-]?[0-9]+)") + return tonumber(res) +end + +function handleErr(msg) + io.stderr:write(msg.."\n") + os.exit(2) +end + +-- +-- get file name without .pmx suffix +-- +function getBaseFileName(fileName) + if fileName ~= "" and string.sub(fileName, -4, -1) == ".pmx" then + return string.sub(fileName, 1, -5) + else + return fileName + end +end + +-- +-- Make chords transposition. Generates new pmx file with transposed chords. +-- +-- param baseName input file name without .pmx suffix +-- return outputBaseName transposed pmx file name without .pmx suffix +-- +function makeChordsTransposition(baseName) + local inputFileName = baseName..".pmx" + local inputFile = io.open(inputFileName, "r") + if(inputFile == nil) then + handleErr("File does not exist: "..inputFileName) + end + + local outputBaseName = baseName..FILE_SUFFIX -- output base name without suffix. Used for renaming generated .tex file ... + local outputFileName = outputBaseName..".pmx" + local outputFile = io.open(outputFileName, "w") + if(outputFile == nil) then + handleErr("Can not create temporary file: ".. outputFileName) + end + + -- + -- transpose chords from inputFile into outputFile + -- + -- input and output signature will be parsed from input pmx file + -- + local iSig = nil -- input signature + local chTr = nil -- chords transposition class + + for line in inputFile:lines() do + if(chTr ~= nil) then + outputFile:write(chTr:lineTranspose(line).."\n") + else + outputFile:write(line.."\n") + end + if(iSig == nil) then + iSig = parseInputSignature(line) + if(iSig ~= nil) then + io.stderr:write("Chords: input signature detected: "..iSig .."\n") + end + elseif(chTr == nil) then + local oSig = parseOutputSignature(line) + if(oSig ~= nil) then + io.stderr:write("Chords: output signature detected: "..oSig .."\n") + chTr = ChordsTr(iSig, oSig) + end + end + end + inputFile:close() + outputFile:close() + + return outputBaseName +end + +-- +-- Make pmxab process. +-- param baseName input file name without .pmx suffix +-- param outputBaseName transposed pmx file name without .pmx suffix +-- +function pmxabProcess(baseName, outputBaseName) + -- + -- call pmxab to generate .tex file + -- + local pmxResCode = os.execute(PMX_CMD .. " " .. outputBaseName ) + if (pmxResCode ~= 0 ) then + io.stderr:write("PMX process fail! "..outputBaseName .."\n") + os.exit(pmxResCode) + end + + os.rename(outputBaseName..".tex", baseName..".tex") + + -- remove temporary files + os.remove(outputBaseName..".pmx") + os.remove(outputBaseName..".pml") + os.remove("pmxaerr.dat") +end + +narg = 1 +onlyTranspose = false + +repeat + this_arg = arg[narg] + if this_arg == "-v" then + os.exit(0) + elseif this_arg == "-h" then + usage() + os.exit(0) + elseif this_arg == "-s" then + onlyTranspose = true + else + local baseName = getBaseFileName(this_arg) + local outputBaseName = makeChordsTransposition(baseName) + + if (not onlyTranspose) then + pmxabProcess(baseName, outputBaseName) + end + end + + narg = narg + 1 +until narg > #arg |