Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions src/main/java/com/orgzly/org/OrgFileSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
*/
public class OrgFileSettings {
public static final String TITLE = "TITLE";
public static final String FILETAGS = "FILETAGS";

private String title;

Expand Down Expand Up @@ -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<String> getFiletags() {
List<String> values = getKeywordValues(FILETAGS);
if (values == null || values.isEmpty()) {
return new ArrayList<>();
}

List<String> 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;
Expand Down
91 changes: 91 additions & 0 deletions src/test/java/com/orgzly/org/OrgFileSettingsTest.java
Original file line number Diff line number Diff line change
@@ -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<String> 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<String> 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<String> 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<String> 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<String> tags = settings.getFiletags();

Assert.assertTrue(tags.isEmpty());
}

@Test
public void testGetFiletagsListWithEmptyValue() {
String preface = "#+FILETAGS: ::";
OrgFileSettings settings = OrgFileSettings.fromPreface(preface);

List<String> 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<String> 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());
}
}