From 28205c42d57fc999c3b5eaf5830495e7b0424e60 Mon Sep 17 00:00:00 2001 From: nojhan Date: Mon, 30 Jan 2023 23:28:00 +0100 Subject: [PATCH] feat(filename): adds filename shortening methods --- README.md | 28 +++++++++++++++++++++++- clutchlog/clutchlog.h | 50 ++++++++++++++++++++++++++++++++++++++----- tests/t-filename.cpp | 31 +++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 tests/t-filename.cpp diff --git a/README.md b/README.md index e909f2c..93bffe1 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,7 @@ Available tags are: - `{level}`: the current log level (i.e. `Critical`, `Error`, `Warning`, `Progress`, `Note`, `Info`, `Debug` or `XDebug`), - `{level_letter}`: the first letter of the current log level, - `{level_short}`: the current log level, printed in only four letters, -- `{file}`: the current file (absolute path), +- `{file}`: the current file name, - `{func}`: the current function, - `{line}`: the current line number, - `{level_fmt}`: the style of the current level (i.e. configured with `clutchlog::style`), @@ -480,6 +480,32 @@ log.strip_calls(CLUTCHLOG_STRIP_CALLS); // Defaults to 5. ``` +### Filename + +By default, the `{file}` template tag is rendered as the absolute path +(which is usualy handy if your terminal detects paths +and allows to run a command on click). + +You can change this behavior to display shorter names, using `clutchlog::filename`, +and passing one of the following the shortening method: +- `clutchlog::filename::base`: the file name itself, +- `clutchlog::filename::dir`: the name of the single last directory containing the file, +- `clutchlog::filename::dirbase`: the last directory and the file names, +- `clutchlog::filename::stem`: the file name without its extension, +- `clutchlog::filename::dirstem`: the last directory and the file without extension. +- `clutchlog::filename::path`: the absolute path (the default). + +Example: +```cpp +log.filename(clutchlog::filename::path) // /home/nojhan/code/clutchlog/tests/t-filename.cpp +log.filename(clutchlog::filename::base) // t-filename.cpp +log.filename(clutchlog::filename::dir) // tests +log.filename(clutchlog::filename::dirbase) // tests/t-filename.cpp +log.filename(clutchlog::filename::stem) // t-filename +log.filename(clutchlog::filename::dirstem) // tests/t-filename +``` + + Disabled calls -------------- diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 23ad419..c619f99 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -312,6 +312,9 @@ class clutchlog //! Available log levels. enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7}; + //! Available filename rendering methods. + enum filename {path, base, dir, dirbase, stem, dirstem}; + /** @} */ /** @addtogroup Formating Formating tools @@ -891,11 +894,12 @@ class clutchlog _stage(level::error), _in_file(".*"), _in_func(".*"), - _in_line(".*") + _in_line(".*"), // Empty vectors by default: // _filehash_fmts // _funchash_fmts // _depth_fmts + _filename(filename::path) { // Reverse the level->word map into a word->level map. for(auto& lw : _level_word) { @@ -966,7 +970,10 @@ class clutchlog /** Current terminal size (for right-alignment). */ size_t _nb_columns; #endif - /** @}*/ + + /** Filename rendering method. */ + filename _filename; + /** @} Internal details */ public: @@ -1107,7 +1114,10 @@ class clutchlog //! Get the configured fmt instance of the given log level. fmt style(level stage) const { return _level_fmt.at(stage); } - /** @} */ + //! Sets the file naming scheme. */ + void filename(filename f) {_filename = f;} + + /** @} Configuration accessors */ public: @@ -1283,14 +1293,42 @@ class clutchlog ) const { row = replace(row, "\\{msg\\}", what); - row = replace(row, "\\{file\\}", file); + + const std::filesystem::path filepath(file); + assert(filepath.is_absolute()); + std::string filename; + std::filesystem::path::iterator ip = filepath.end(); + std::advance(ip, -2); + switch(_filename) { + case filename::base: + filename = filepath.filename().string(); + break; + case filename::dir: + filename = ip->string(); + break; + case filename::dirbase: + filename = (*ip / filepath.filename()).string(); + break; + case filename::stem: + filename = filepath.stem().string(); + break; + case filename::dirstem: + filename = (*ip / filepath.stem()).string(); + break; + case filename::path: + default: + filename = file; + break; + } + row = replace(row, "\\{file\\}", filename); + + row = replace(row, "\\{func\\}", func); row = replace(row, "\\{line\\}", line); row = replace(row, "\\{level\\}", _level_word.at(stage)); std::string letter(1, _level_word.at(stage).at(0)); // char -> string row = replace(row, "\\{level_letter\\}", letter); - row = replace(row, "\\{level_short\\}", _level_short.at(stage)); #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 @@ -1468,6 +1506,7 @@ class clutchlog public: static clutchlog& logger() {} enum level {critical=0, error=1, warning=2, progress=3, note=4, info=5, debug=6, xdebug=7}; + enum filename {path, base, dir, dirbase, stem, dirstem}; class fmt { public: enum class ansi { colors_16, colors_256, colors_16M} mode; @@ -1635,6 +1674,7 @@ class clutchlog void style(level, FMT...) {} void style(level, fmt) {} fmt style(level) const {} + void filename(filename) {} public: std::string replace( const std::string&, diff --git a/tests/t-filename.cpp b/tests/t-filename.cpp new file mode 100644 index 0000000..cebe3de --- /dev/null +++ b/tests/t-filename.cpp @@ -0,0 +1,31 @@ +#include +#include + +#include "../clutchlog/clutchlog.h" + +int main(/*const int argc, char* argv[]*/) +{ + auto& log = clutchlog::logger(); + log.format("{msg}\t= {filehash_fmt}{file}\n"); + log.threshold(clutchlog::level::xdebug); + + log.filename(clutchlog::filename::path); + CLUTCHLOG(note,"clutchlog::filename::path"); + + log.filename(clutchlog::filename::base); + CLUTCHLOG(note,"clutchlog::filename::base"); + + log.filename(clutchlog::filename::dir); + CLUTCHLOG(note,"clutchlog::filename::dir"); + + log.filename(clutchlog::filename::dirbase); + CLUTCHLOG(note,"clutchlog::filename::dirbase"); + + log.filename(clutchlog::filename::stem); + CLUTCHLOG(note,"clutchlog::filename::stem"); + + log.filename(clutchlog::filename::dirstem); + CLUTCHLOG(note,"clutchlog::filename::dirstem"); +} + +