diff options
Diffstat (limited to 'src/Tag.vala')
-rw-r--r-- | src/Tag.vala | 67 |
1 files changed, 40 insertions, 27 deletions
diff --git a/src/Tag.vala b/src/Tag.vala index cf41c0e..31b1e40 100644 --- a/src/Tag.vala +++ b/src/Tag.vala @@ -269,6 +269,7 @@ public class TagSourceCollection : ContainerSourceCollection { public class Tag : DataSource, ContainerSource, Proxyable, Indexable { public const string TYPENAME = "tag"; public const string PATH_SEPARATOR_STRING = "/"; + public const string TAG_LIST_SEPARATOR_STRING = ", "; private class TagSnapshot : SourceSnapshot { private TagRow row; @@ -533,7 +534,12 @@ public class Tag : DataSource, ContainerSource, Proxyable, Indexable { return String.precollated_compare(a.get_name(), a.get_name_collation_key(), b.get_name(), b.get_name_collation_key()); } - + + public static int compare_user_visible_names(Tag a, Tag b) { + return String.precollated_compare(a.get_user_visible_name(), a.get_name_collation_key(), + b.get_user_visible_name(), b.get_name_collation_key()); + } + public static uint hash_name_string(string a) { return String.collated_hash(a); } @@ -601,40 +607,47 @@ public class Tag : DataSource, ContainerSource, Proxyable, Indexable { return result; } - - public static string make_tag_string(Gee.Collection<Tag> tags, string? start = null, - string separator = ", ", string? end = null, bool escape = false) { - StringBuilder builder = new StringBuilder(start ?? ""); + + // Creates a sorted list of terminal tags, unique by user-visible-name + public static Gee.List<Tag> make_user_visible_tag_list(Gee.Collection<Tag> tags) { Gee.HashSet<string> seen_tags = new Gee.HashSet<string>(); Gee.Collection<Tag> terminal_tags = get_terminal_tags(tags); - Gee.ArrayList<string> sorted_tags = new Gee.ArrayList<string>(); + Gee.ArrayList<Tag> sorted_tags = new Gee.ArrayList<Tag>(); foreach (Tag tag in terminal_tags) { - string user_visible_name = escape ? guarded_markup_escape_text( - tag.get_user_visible_name()) : tag.get_user_visible_name(); - - if (!seen_tags.contains(user_visible_name)) - sorted_tags.add(user_visible_name); + string user_visible_name = tag.get_user_visible_name(); + if (!seen_tags.contains(user_visible_name)) { + sorted_tags.add(tag); + seen_tags.add(user_visible_name); + } } - - sorted_tags.sort(); - Gee.Iterator<string> iter = sorted_tags.iterator(); - while(iter.next()) { - builder.append(iter.get()); - builder.append(separator); + sorted_tags.sort(Tag.compare_user_visible_names); + return sorted_tags; + } + + public static string make_tag_markup_string(Gee.List<Tag> tags, int highlight_index = -1) { + StringBuilder builder = new StringBuilder("<small>"); + int i = 0; + bool first = true; + foreach(Tag tag in tags) { + string tag_name = tag.get_user_visible_name(); + string esc_tag_name = guarded_markup_escape_text(tag_name); + if (first) + first = false; + else + builder.append(TAG_LIST_SEPARATOR_STRING); + if (highlight_index == i) + builder.append("<u>"); + builder.append(esc_tag_name); + if (highlight_index == i) + builder.append("</u>"); + ++i; } - + + builder.append("</small>"); string built = builder.str; - - if (built.length >= separator.length) - if (built.substring(built.length - separator.length, separator.length) == separator) - built = built.substring(0, built.length - separator.length); - - if (end != null) - built += end; - return built; } - + // Utility function to cleanup a tag name that comes from user input and prepare it for use // in the system and storage in the database. Returns null if the name is unacceptable. public static string? prep_tag_name(string name) { |