Skip to content

Commit

Permalink
Utilities: Implement slugify using AK/Slugify
Browse files Browse the repository at this point in the history
  • Loading branch information
tbhaxor committed Oct 17, 2023
1 parent 5ec4714 commit 86a1b24
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions Userland/Utilities/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ target_link_libraries(run-tests PRIVATE LibCoredump LibDebug LibFileSystem LibRe
target_link_libraries(rm PRIVATE LibFileSystem)
target_link_libraries(sed PRIVATE LibRegex LibFileSystem)
target_link_libraries(shot PRIVATE LibFileSystem LibGfx LibGUI LibIPC)
target_link_libraries(slugify PRIVATE LibUnicode)
target_link_libraries(sql PRIVATE LibFileSystem LibIPC LibLine LibSQL)
target_link_libraries(su PRIVATE LibCrypt)
target_link_libraries(syscall PRIVATE LibSystem)
Expand Down
48 changes: 48 additions & 0 deletions Userland/Utilities/slugify.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2023, Gurkirat Singh <tbhaxor@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/

#include <AK/Error.h>
#include <AK/Slugify.h>
#include <AK/String.h>
#include <AK/Vector.h>
#include <LibCore/ArgsParser.h>
#include <LibMain/Main.h>
#include <LibUnicode/Normalize.h>

ErrorOr<int> serenity_main(Main::Arguments arguments)
{
Vector<String> inputs;
String output_type;
String glue;
bool spa;

Core::ArgsParser parser;
parser.set_general_help("Slugify is a simple text to slug transform utility\n$ slugify 'Serenity is a cool ### PROject123.'");
parser.add_option(output_type, "Output format to choose from 'md', 'html', 'plain'. (default: md)", "format", 'f', "FORMAT");
parser.add_option(glue, "Specify delimiter to join the parts. (default: -)", "glue", 'g', "GLUE");
parser.add_option(spa, "Prepends hash/pound symble (#) to the slugified string when set, otherwise slash (/). Useful for markdowns like in GitHub (default: false)", "single-page", 's');
parser.add_positional_argument(inputs, "Input strings to be slugified.", "inputs");
if (!parser.parse(arguments)) {
parser.print_usage(stderr, arguments.strings[0]);
return 1;
}

char cglue = glue.is_empty() ? '-' : static_cast<char>(*glue.code_points().begin());
auto prepend_char = spa ? '#' : '/';

for (auto& input : inputs) {
auto slugified = TRY(slugify(Unicode::normalize(input, Unicode::NormalizationForm::NFD), cglue));

if (output_type.is_empty() || output_type == "md") {
outln("[{}]({}{})", input, prepend_char, slugified);
} else if (output_type == "html") {
outln("<a href='{}{}'>{}</a>", prepend_char, slugified, input);
} else {
outln("{}{}", prepend_char, input);
}
}
return 0;
}

0 comments on commit 86a1b24

Please sign in to comment.