mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-11-03 21:14:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Scintilla source code edit control
 | 
						|
/** @file HanjaDic.cxx
 | 
						|
 ** Korean Hanja Dictionary
 | 
						|
 ** Convert between Korean Hanja and Hangul by COM interface.
 | 
						|
 **/
 | 
						|
// Copyright 2015 by Neil Hodgson <neilh@scintilla.org>
 | 
						|
// The License.txt file describes the conditions under which this software may be distributed.
 | 
						|
 | 
						|
#include <string>
 | 
						|
#include <string_view>
 | 
						|
 | 
						|
#include <windows.h>
 | 
						|
 | 
						|
#include "UniConversion.h"
 | 
						|
#include "HanjaDic.h"
 | 
						|
 | 
						|
namespace Scintilla {
 | 
						|
 | 
						|
namespace HanjaDict {
 | 
						|
 | 
						|
interface IRadical;
 | 
						|
interface IHanja;
 | 
						|
interface IStrokes;
 | 
						|
 | 
						|
typedef enum { HANJA_UNKNOWN = 0, HANJA_K0 = 1, HANJA_K1 = 2, HANJA_OTHER = 3 } HANJA_TYPE;
 | 
						|
 | 
						|
interface IHanjaDic : IUnknown {
 | 
						|
	STDMETHOD(OpenMainDic)();
 | 
						|
	STDMETHOD(CloseMainDic)();
 | 
						|
	STDMETHOD(GetHanjaWords)(BSTR bstrHangul, SAFEARRAY* ppsaHanja, VARIANT_BOOL* pfFound);
 | 
						|
	STDMETHOD(GetHanjaChars)(unsigned short wchHangul, BSTR* pbstrHanjaChars, VARIANT_BOOL* pfFound);
 | 
						|
	STDMETHOD(HanjaToHangul)(BSTR bstrHanja, BSTR* pbstrHangul);
 | 
						|
	STDMETHOD(GetHanjaType)(unsigned short wchHanja, HANJA_TYPE* pHanjaType);
 | 
						|
	STDMETHOD(GetHanjaSense)(unsigned short wchHanja, BSTR* pbstrSense);
 | 
						|
	STDMETHOD(GetRadicalID)(short SeqNumOfRadical, short* pRadicalID, unsigned short* pwchRadical);
 | 
						|
	STDMETHOD(GetRadical)(short nRadicalID, IRadical** ppIRadical);
 | 
						|
	STDMETHOD(RadicalIDToHanja)(short nRadicalID, unsigned short* pwchRadical);
 | 
						|
	STDMETHOD(GetHanja)(unsigned short wchHanja, IHanja** ppIHanja);
 | 
						|
	STDMETHOD(GetStrokes)(short nStrokes, IStrokes** ppIStrokes);
 | 
						|
	STDMETHOD(OpenDefaultCustomDic)();
 | 
						|
	STDMETHOD(OpenCustomDic)(BSTR bstrPath, long* plUdr);
 | 
						|
	STDMETHOD(CloseDefaultCustomDic)();
 | 
						|
	STDMETHOD(CloseCustomDic)(long lUdr);
 | 
						|
	STDMETHOD(CloseAllCustomDics)();
 | 
						|
	STDMETHOD(GetDefaultCustomHanjaWords)(BSTR bstrHangul, SAFEARRAY** ppsaHanja, VARIANT_BOOL* pfFound);
 | 
						|
	STDMETHOD(GetCustomHanjaWords)(long lUdr, BSTR bstrHangul, SAFEARRAY** ppsaHanja, VARIANT_BOOL* pfFound);
 | 
						|
	STDMETHOD(PutDefaultCustomHanjaWord)(BSTR bstrHangul, BSTR bstrHanja);
 | 
						|
	STDMETHOD(PutCustomHanjaWord)(long lUdr, BSTR bstrHangul, BSTR bstrHanja);
 | 
						|
	STDMETHOD(MaxNumOfRadicals)(short* pVal);
 | 
						|
	STDMETHOD(MaxNumOfStrokes)(short* pVal);
 | 
						|
	STDMETHOD(DefaultCustomDic)(long* pVal);
 | 
						|
	STDMETHOD(DefaultCustomDic)(long pVal);
 | 
						|
	STDMETHOD(MaxHanjaType)(HANJA_TYPE* pHanjaType);
 | 
						|
	STDMETHOD(MaxHanjaType)(HANJA_TYPE pHanjaType);
 | 
						|
};
 | 
						|
 | 
						|
extern "C" const GUID __declspec(selectany) IID_IHanjaDic =
 | 
						|
{ 0xad75f3ac, 0x18cd, 0x48c6, { 0xa2, 0x7d, 0xf1, 0xe9, 0xa7, 0xdc, 0xe4, 0x32 } };
 | 
						|
 | 
						|
class HanjaDic {
 | 
						|
private:
 | 
						|
	HRESULT hr;
 | 
						|
	CLSID CLSID_HanjaDic;
 | 
						|
 | 
						|
public:
 | 
						|
	IHanjaDic *HJinterface;
 | 
						|
 | 
						|
	HanjaDic() : HJinterface(nullptr) {
 | 
						|
		hr = CLSIDFromProgID(OLESTR("mshjdic.hanjadic"), &CLSID_HanjaDic);
 | 
						|
		if (SUCCEEDED(hr)) {
 | 
						|
			hr = CoCreateInstance(CLSID_HanjaDic, nullptr,
 | 
						|
					CLSCTX_INPROC_SERVER, IID_IHanjaDic,
 | 
						|
					(LPVOID *)& HJinterface);
 | 
						|
			if (SUCCEEDED(hr)) {
 | 
						|
				hr = HJinterface->OpenMainDic();
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	~HanjaDic() {
 | 
						|
		if (SUCCEEDED(hr)) {
 | 
						|
			hr = HJinterface->CloseMainDic();
 | 
						|
			HJinterface->Release();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	bool HJdictAvailable() {
 | 
						|
		return SUCCEEDED(hr);
 | 
						|
	}
 | 
						|
 | 
						|
	bool IsHanja(int hanja) {
 | 
						|
		HANJA_TYPE hanjaType;
 | 
						|
		hr = HJinterface->GetHanjaType(static_cast<unsigned short>(hanja), &hanjaType);
 | 
						|
		if (SUCCEEDED(hr)) {
 | 
						|
			return (hanjaType > 0);
 | 
						|
		}
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
};
 | 
						|
 | 
						|
int GetHangulOfHanja(wchar_t *inout) {
 | 
						|
	// Convert every hanja to hangul.
 | 
						|
	// Return the number of characters converted.
 | 
						|
	int changed = 0;
 | 
						|
	HanjaDic dict;
 | 
						|
	if (dict.HJdictAvailable()) {
 | 
						|
		const size_t len = wcslen(inout);
 | 
						|
		wchar_t conv[UTF8MaxBytes] = {0};
 | 
						|
		BSTR bstrHangul = SysAllocString(conv);
 | 
						|
		for (size_t i=0; i<len; i++) {
 | 
						|
			if (dict.IsHanja(static_cast<int>(inout[i]))) { // Pass hanja only!
 | 
						|
				conv[0] = inout[i];
 | 
						|
				BSTR bstrHanja = SysAllocString(conv);
 | 
						|
				const HRESULT hr = dict.HJinterface->HanjaToHangul(bstrHanja, &bstrHangul);
 | 
						|
				if (SUCCEEDED(hr)) {
 | 
						|
					inout[i] = static_cast<wchar_t>(bstrHangul[0]);
 | 
						|
					changed += 1;
 | 
						|
				}
 | 
						|
				SysFreeString(bstrHanja);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		SysFreeString(bstrHangul);
 | 
						|
	}
 | 
						|
	return changed;
 | 
						|
}
 | 
						|
 | 
						|
}
 | 
						|
}
 |