diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /indexing/zhmakeindex/kpathsea/kpathsea.go |
Initial commit
Diffstat (limited to 'indexing/zhmakeindex/kpathsea/kpathsea.go')
-rw-r--r-- | indexing/zhmakeindex/kpathsea/kpathsea.go | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/indexing/zhmakeindex/kpathsea/kpathsea.go b/indexing/zhmakeindex/kpathsea/kpathsea.go new file mode 100644 index 0000000000..d2bdce6497 --- /dev/null +++ b/indexing/zhmakeindex/kpathsea/kpathsea.go @@ -0,0 +1,108 @@ +// 提供 kpathsea 库的基本文件查找功能 +package kpathsea // import "github.com/leo-liu/zhmakeindex/kpathsea" + +import ( + "os" + "os/exec" + "strings" +) + +// 以 C 中对应于 enum kpse_file_format_type,见源代码 types.h +type FileFormatType int + +// 对应于 TL2014 中的 kpathsea 6.20 +const ( + GF_FORMAT FileFormatType = iota + PK_FORMAT + ANY_GLYPH_FORMAT // ``any'' meaning gf or pk + TFM_FORMAT + AFM_FORMAT + BASE_FORMAT + BIB_FORMAT + BST_FORMAT + CNF_FORMAT + DB_FORMAT + FMT_FORMAT + FONTMAP_FORMAT + MEM_FORMAT + MF_FORMAT + MFPOOL_FORMAT + MFT_FORMAT + MP_FORMAT + MPPOOL_FORMAT + MPSUPPORT_FORMAT + OCP_FORMAT + OFM_FORMAT + OPL_FORMAT + OTP_FORMAT + OVF_FORMAT + OVP_FORMAT + PICT_FORMAT + TEX_FORMAT + TEXDOC_FORMAT + TEXPOOL_FORMAT + TEXSOURCE_FORMAT + TEX_PS_HEADER_FORMAT + TROFF_FONT_FORMAT + TYPE1_FORMAT + VF_FORMAT + DVIPS_CONFIG_FORMAT + IST_FORMAT + TRUETYPE_FORMAT + TYPE42_FORMAT + WEB2C_FORMAT + PROGRAM_TEXT_FORMAT + PROGRAM_BINARY_FORMAT + MISCFONTS_FORMAT + WEB_FORMAT + CWEB_FORMAT + ENC_FORMAT + CMAP_FORMAT + SFD_FORMAT + OPENTYPE_FORMAT + PDFTEX_CONFIG_FORMAT + LIG_FORMAT + TEXMFSCRIPTS_FORMAT + LUA_FORMAT + FEA_FORMAT + CID_FORMAT + MLBIB_FORMAT + MLBST_FORMAT + CLUA_FORMAT + RIS_FORMAT + BLTXML_FORMAT + LAST_FORMAT // one past last index +) + +// 基本文件查询函数调用 kpsewhich 的最简单的备用实现。 +// 在 C 中对应于 +// extern KPSEDLL string kpathsea_find_file (kpathsea kpse, const_string name, +// kpse_file_format_type format, boolean must_exist); +// 见源代码 tex-file.h +func FindFile(name string, format FileFormatType, mustExist bool) string { + /* + outpath := findFile_dynamic(name, format, mustExist) + if outpath != "" { + return outpath + } + */ + return findFile_external(name) +} + +// 基本文件查询函数调用 kpsewhich 的最简单的备用实现。 +// 没有 format 与 mustExist 参数。 +func findFile_external(name string) string { + // 先尝试直接搜索(速度较快) + if _, err := os.Stat(name); err == nil { + return name + } + // 调用 kpsewhich 外部程序搜索(慢) + cmd := exec.Command("kpsewhich", name) + out, err := cmd.Output() + if err != nil { + return "" + } else { + outpath := strings.TrimSpace(string(out)) + return outpath + } +} |