#include "StdAfx.h"
#include "TextFormatter.h"

CTextFormatter::CTextFormatter(void)
{
}

CTextFormatter::~CTextFormatter(void)
{
}


/*!
	置き換え追加
*/
void CTextFormatter::AddKey(CString key, CString swapTo)
{
	//	無効文字を処置
	for(int i=0;i<m_escape.GetSize();i++)
		swapTo.Replace(m_escape[i].m_key, m_escape[i].m_data);

	//	追加
	m_keys.Add(key, swapTo);
}

/*!
	置き換え追加
*/
void CTextFormatter::AddKeyFromWorkspace(CWorkspaceAccess workspace, CString keyHeader)
{
	//	すべて取得
	CStringArray	key, data;
	workspace.GetAllKey(key);
	workspace.GetAllData(data);

	//	追加
	for(int i=0;i<key.GetSize();i++)
	{
		//	無効文字を処置
		for(int j=0;j<m_escape.GetSize();j++)
			data[i].Replace(m_escape[j].m_key, m_escape[j].m_data);

		m_keys.Add(keyHeader + key[i], data[i]);
	}
}

/*!
	クリア
*/
void CTextFormatter::Clear()
{
	m_keys.RemoveAll();
	m_escape.RemoveAll();
}

/*!
	無効文字追加
*/
void CTextFormatter::AddEscape(CString token, CString escape)
{
	m_escape.Add(token, escape);
}



/*!
	置き換え実行
*/
CString CTextFormatter::GetFormattedString(CString format, CString keyMarker, CString noMatchKey)
{
	CString	key, left, ret;
	int		index = 0;

	while(GetNextMarker(format, index, keyMarker, left, key))
	{
		ret += left;

		int keyIndex = m_keys.Find(key);
		if(keyIndex == -1)
			ret += noMatchKey;
		else
			ret += m_keys[keyIndex].m_data;
	}

	return(ret + left);
}


///////////////////////////////////////////////////////////////////////////////////////////////////
//	検索処理
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	マーカ切り出し
*/
int CTextFormatter::GetNextMarker(CString &format, int &nextIndex, CString &marker, CString &leftText, CString &key)
{
	int	markerLen = marker.GetLength();

	//	最初のマーカを取得
	int markStart = format.Find(marker, nextIndex);
	if(markStart == -1)
	{
		leftText = format.Mid(nextIndex);
		return(0);
	}

	//	次のマーカを取得
	int markEnd = format.Find(marker, markStart + markerLen);
	if(markEnd == -1)
	{
		leftText = format.Mid(nextIndex);
		return(0);
	}

	//	左側テキスト切り出し
	leftText = format.Mid(nextIndex, markStart - nextIndex);

	//	キー切り出し
	key = format.Mid(markStart + markerLen, markEnd - (markStart + markerLen));

	//	次の開始位置
	nextIndex = markEnd + markerLen;
	return(1);
}

