콘텐츠 지원 Part 6: 텍스트 필터

텍스트 필터는 주어진 텍스트에 특정 텍스트가 포함되어 있는지 검사할 수 있는 기능입니다. 상황에 따라 필터링 해야하는 텍스트 목록이 다를 수 있으므로 여러 종류의 텍스트 목록을 필터링할 수 있도록 여러 개의 텍스트 필터를 사용할 수 있습니다.

텍스트 필터 사용을 위한 설정 (MANIFEST.json)

아래와 같이 MANIFEST.json 파일을 설정하면 텍스트 필터를 사용할 수 있습니다.

{
    "dependency": {
        .....,
        "Textfilter": {}
    }
}

텍스트 필터 사용하기

텍스트 필터 생성하기

아래 인터페이스를 사용하여 텍스트 필터를 생성할 수 있습니다.

static bool TextFilter::Create(size_t category, const string &path, FilterType type);
public class TextFilter
{
  public static bool Create (UInt64 category, string path FilterType type);
}
  • category : 각 필터를 구분하기 위한 정수 값

  • path : 필터링 목록 파일의 경로

  • type : 필터링 방법을 설정하기 위한 텍스트 필터 타입

필터링 목록 파일은 아래와 같이 JSON Array 형식으로 작성되어 있어야 합니다.

[
  "바보",
  "멍청이",
  ...
]

소스 최상위 디렉터리의 game_data/default_filter.json 에 샘플용 필터링 목록 파일이 있습니다. 이 파일을 수정하거나 같은 형식의 새로운 파일을 생성하여 사용하시면 됩니다.

텍스트 필터 타입은 두가지가 있습니다.

enum TextFilter
{
  TRIE,
  REGEX
}

TRIE 타입은 검사하고자 하는 텍스트가 필터링 목록에 있는 텍스트를 포함하는지 검사합니다. REGEX 타입은 정규표현식의 필터링 목록을 입력받아 필터링 목록에 있는 정규표현식과 일치하는 텍스트를 포함하는지 검사합니다.

요청한 카테고리의 텍스트 필터가 이미 생성되어 있거나 필터링 목록 파일을 읽어올 수 없거나 또는 잘못된 텍스트 필터 타입으로 요청한 경우 텍스트 필터 생성을 실패하며 false 를 리턴합니다. 텍스트 필터 생성에 성공하면 true 를 리턴합니다.

텍스트 필터 가져오기

생성된 텍스트 필터를 가져오는 인터페이스 입니다.

static Ptr<TextFilter> TextFilter::Get(size_t category);
public class TextFilter
{
  public static TextFilter Get (UInt64 category);
}

해당 카테고리로 생성한 텍스트 필터가 존재하지 않으면 null 값을 리턴합니다.

텍스트 필터 타입 확인하기

텍스트 필터의 타입을 가져오는 인터페이스 입니다.

FilterType TextFilter::GetType();
public class TextFilter
{
  public static FilterType Type ();
}

텍스트 필터가 어떤 필터링 타입을 사용하는지 확인할 수 있습니다.

텍스트가 존재하는지 확인하기

주어진 텍스트가 필터링 목록에 존재하는 텍스트를 가지고 있는 확인하는 인터페이스 입니다.

bool TextFilter::Search(const string &text);
public class TextFilter
{
  public bool Search (string text);
}

필터링 목록에 존재하는 텍스트를 포함하고 있다면 true 를 리턴합니다.

텍스트 치환하기

주어진 텍스트가 필터링 목록에 존재하는 텍스트를 가지고 있다면 해당 텍스트를 * 로 치환하는 인터페이스 입니다.

bool TextFilter::Replace(string *path);
public class TextFilter
{
  public bool Replace (ref string text);
}

치환된 텍스트가 있다면 true 를 리턴합니다.

예제

const string path = ...;
string text = ...;

// TRIE 타입의 텍스트 필터 생성
bool b = TextFilter::Create(0, path, TextFilter::TRIE);
if (not b) {
  // 텍스트 필터 생성 실패
  // 이미 해당 카테고리의 텍스트 필터가 존재하거나
  // 필터링 목록 파일을 읽어올 수 없거나
  // 또는 잘못된 텍스트 필터 타입으로 요청한 경우
} else {
  auto filter = TextFilter::Get(0); // 텍스트 필터 가져오기
  // 필터링 목록에 존재하는 텍스트를 포함하는지 검사
  if (filter->Search(text)) {
    // 포함하고 있음
  }
  // 필터링 목록에 존재하는 텍스트를 '#' 로 치환
  if (filter->Replace(&text, '#')) {
    // 치환된 텍스트가 있음
  }
}
string path = ...;
string text = ...;

// TRIE 타입의 텍스트 필터 생성
bool b = TextFilter.Create(0, path, TextFilter::TRIE);
if (!b)
{
  // 텍스트 필터 생성 실패
  // 이미 해당 카테고리의 텍스트 필터가 존재하거나
  // 필터링 목록 파일을 읽어올 수 없거나
  // 또는 잘못된 텍스트 필터 타입으로 요청한 경우
}
else
{
  var filter = TextFilter.Get(0); // 텍스트 필터 가져오기
  // 필터링 목록에 존재하는 텍스트를 포함하는지 검사
  if (filter.Search(text))
  {
    // 포함하고 있음
  }
  // 필터링 목록에 존재하는 텍스트를 '#' 로 치환
  if (filter.Replace(ref text, '#'))
  {
    // 치환된 텍스트가 있음
  }
}