diff --git a/src/main/java/com/orgzly/org/OrgFileSettings.java b/src/main/java/com/orgzly/org/OrgFileSettings.java index fa0078e..2fc826a 100644 --- a/src/main/java/com/orgzly/org/OrgFileSettings.java +++ b/src/main/java/com/orgzly/org/OrgFileSettings.java @@ -14,6 +14,7 @@ */ public class OrgFileSettings { public static final String TITLE = "TITLE"; + public static final String FILETAGS = "FILETAGS"; private String title; @@ -77,6 +78,30 @@ public String getLastKeywordValue(String keyword) { return values.get(values.size() - 1); } + /** + * Parse FILETAGS keyword values into individual tags. + * FILETAGS values use org-mode tag syntax: :tag1:tag2:tag3: + * + * @return list of individual tags from all FILETAGS entries, or empty list if none + */ + public List getFiletags() { + List values = getKeywordValues(FILETAGS); + if (values == null || values.isEmpty()) { + return new ArrayList<>(); + } + + List tags = new ArrayList<>(); + for (String value : values) { + // Split on ':' delimiter, same as headline tags + for (String tag : value.split(":")) { + if (!OrgStringUtils.isEmpty(tag)) { + tags.add(tag.trim()); + } + } + } + return tags; + } + private void addKeywordSetting(String keyword, String value) { if (keyword.equalsIgnoreCase(TITLE)) { title = value; diff --git a/src/test/java/com/orgzly/org/OrgFileSettingsTest.java b/src/test/java/com/orgzly/org/OrgFileSettingsTest.java new file mode 100644 index 0000000..a3d84ae --- /dev/null +++ b/src/test/java/com/orgzly/org/OrgFileSettingsTest.java @@ -0,0 +1,91 @@ +package com.orgzly.org; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +public class OrgFileSettingsTest { + + @Test + public void testGetFiletagsListWithSingleTag() { + String preface = "#+FILETAGS: :tag1:"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertEquals(1, tags.size()); + Assert.assertEquals("tag1", tags.get(0)); + } + + @Test + public void testGetFiletagsListWithMultipleTags() { + String preface = "#+FILETAGS: :tag1:tag2:tag3:"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertEquals(3, tags.size()); + Assert.assertEquals("tag1", tags.get(0)); + Assert.assertEquals("tag2", tags.get(1)); + Assert.assertEquals("tag3", tags.get(2)); + } + + @Test + public void testGetFiletagsListWithSpaces() { + String preface = "#+FILETAGS: : tag1 : tag2 :"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertEquals(2, tags.size()); + Assert.assertEquals("tag1", tags.get(0)); + Assert.assertEquals("tag2", tags.get(1)); + } + + @Test + public void testGetFiletagsListWithMultipleFiletagsLines() { + String preface = "#+FILETAGS: :tag1:tag2:\n#+FILETAGS: :tag3:"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertEquals(3, tags.size()); + Assert.assertEquals("tag1", tags.get(0)); + Assert.assertEquals("tag2", tags.get(1)); + Assert.assertEquals("tag3", tags.get(2)); + } + + @Test + public void testGetFiletagsListWithNoFiletags() { + String preface = "#+TITLE: My Document"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertTrue(tags.isEmpty()); + } + + @Test + public void testGetFiletagsListWithEmptyValue() { + String preface = "#+FILETAGS: ::"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertTrue(tags.isEmpty()); + } + + @Test + public void testGetFiletagsListWithMixedContent() { + String preface = "#+TITLE: Test\n#+FILETAGS: :work:project:\n#+AUTHOR: Test Author"; + OrgFileSettings settings = OrgFileSettings.fromPreface(preface); + + List tags = settings.getFiletags(); + + Assert.assertEquals(2, tags.size()); + Assert.assertEquals("work", tags.get(0)); + Assert.assertEquals("project", tags.get(1)); + Assert.assertEquals("Test", settings.getTitle()); + } +}