Skip to content

Commit

Permalink
Merge f6babac into 9dd0482
Browse files Browse the repository at this point in the history
  • Loading branch information
Kohki Akikaze authored Feb 20, 2021
2 parents 9dd0482 + f6babac commit fe4796c
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 111 deletions.
19 changes: 3 additions & 16 deletions sakura_core/doc/layout/CLayoutMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,22 +345,9 @@ class CLayoutMgr : public CProgressSubject
void _OnLine2(SLayoutWork* pWork);

private:
bool _ExistKinsokuKuto(wchar_t wc) const{ return m_pszKinsokuKuto_1.exist(wc); }
bool _ExistKinsokuHead(wchar_t wc) const{ return m_pszKinsokuHead_1.exist(wc); }
bool IsKinsokuHead( wchar_t wc ); /*!< 行頭禁則文字をチェックする */ //@@@ 2002.04.08 MIK
bool IsKinsokuTail( wchar_t wc ); /*!< 行末禁則文字をチェックする */ //@@@ 2002.04.08 MIK
bool IsKinsokuKuto( wchar_t wc ); /*!< 句読点文字をチェックする */ //@@@ 2002.04.17 MIK
// 2005-08-20 D.S.Koba 禁則関連処理の関数化
/*! 句読点ぶら下げの処理位置か
@date 2005-08-20 D.S.Koba
@date Sep. 3, 2005 genta 最適化
*/
bool IsKinsokuPosKuto(CLayoutInt nRest, CLayoutInt nCharChars ) const {
return nRest < nCharChars;
}
bool IsKinsokuPosHead(CLayoutInt nRest, CLayoutInt nCharKetas, CLayoutInt nCharKetas2); //!< 行頭禁則の処理位置か
bool IsKinsokuPosTail(CLayoutInt nRest, CLayoutInt nCharKetas, CLayoutInt nCharKetas2); //!< 行末禁則の処理位置か
private:
bool IsKinsokuHead( wchar_t wc ) const; // 行頭禁則文字をチェックする
bool IsKinsokuTail( wchar_t wc ) const; // 行末禁則文字をチェックする
bool IsKinsokuKuto( wchar_t wc ) const; // 句読点文字をチェックする
// Oct. 1, 2002 genta インデント幅計算関数群
CLayoutInt getIndentOffset_Normal( CLayout* pLayoutPrev );
CLayoutInt getIndentOffset_Tx2x( CLayout* pLayoutPrev );
Expand Down
56 changes: 49 additions & 7 deletions sakura_core/doc/layout/CLayoutMgr_DoLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,44 @@ static bool _GetKeywordLength(
}
}

/*!
@brief 行頭禁則の処理位置であるか調べる
@param[in] nRest 現在行に挿入可能な文字の総幅
@param[in] nCharKetas 現在の位置にある文字の幅
@param[in] nCharKetas2 次の位置にある文字の幅
@return 処理が必要な位置ならばtrue
*/
static bool _IsKinsokuPosHead( CLayoutInt nRest, CLayoutInt nCharKetas, CLayoutInt nCharKetas2 )
{
return nRest < nCharKetas + nCharKetas2;
}

/*!
@brief 行末禁則の処理位置であるか調べる
@param[in] nRest 現在行に挿入可能な文字の総幅
@param[in] nCharKetas 現在の位置にある文字の幅
@param[in] nCharKetas2 次の位置にある文字の幅
@return 処理が必要な位置ならばtrue
*/
static bool _IsKinsokuPosTail( CLayoutInt nRest, CLayoutInt nCharKetas, CLayoutInt nCharKetas2 )
{
return nRest < nCharKetas + nCharKetas2;
}

/*!
@brief 句読点ぶら下げの処理位置であるか調べる
@param[in] nRest 現在行に挿入可能な文字の総幅
@param[in] nCharChars 現在の位置にある文字の幅
@return 処理が必要な位置ならばtrue
*/
static bool _IsKinsokuPosKuto( CLayoutInt nRest, CLayoutInt nCharChars )
{
return nRest < nCharChars;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 部品ステータス //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
Expand Down Expand Up @@ -118,12 +156,13 @@ void CLayoutMgr::_DoWordWrap(SLayoutWork* pWork, PF_OnLine pfOnLine)

void CLayoutMgr::_DoKutoBurasage(SLayoutWork* pWork)
{
if( (GetMaxLineLayout() - pWork->nPosX < 2) && (pWork->eKinsokuType == KINSOKU_TYPE_NONE) )
// 現在位置が行末付近で禁則処理の実行中でないこと
if( GetMaxLineLayout() - pWork->nPosX < 2 * GetWidthPerKeta() && pWork->eKinsokuType == KINSOKU_TYPE_NONE )
{
// 2007.09.07 kobake レイアウトとロジックの区別
CLayoutInt nCharKetas = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos );

if( IsKinsokuPosKuto(GetMaxLineLayout() - pWork->nPosX, nCharKetas) && IsKinsokuKuto( pWork->cLineStr.At(pWork->nPos) ) )
if( _IsKinsokuPosKuto( GetMaxLineLayout() - pWork->nPosX, nCharKetas ) && IsKinsokuKuto( pWork->cLineStr.At( pWork->nPos ) ) )
{
pWork->nWordBgn = pWork->nPos;
pWork->nWordLen = 1;
Expand All @@ -134,16 +173,17 @@ void CLayoutMgr::_DoKutoBurasage(SLayoutWork* pWork)

void CLayoutMgr::_DoGyotoKinsoku(SLayoutWork* pWork, PF_OnLine pfOnLine)
{
// 現在位置が行末付近かつ行頭ではなく、禁則処理の実行中でないこと
if( (pWork->nPos+1 < pWork->cLineStr.GetLength()) // 2007.02.17 ryoji 追加
&& (GetMaxLineLayout() - pWork->nPosX < 4)
&& ( GetMaxLineLayout() - pWork->nPosX < 4 * GetWidthPerKeta() )
&& ( pWork->nPosX > pWork->nIndent ) // 2004.04.09 pWork->nPosXの解釈変更のため,行頭チェックも変更
&& (pWork->eKinsokuType == KINSOKU_TYPE_NONE) )
{
// 2007.09.07 kobake レイアウトとロジックの区別
CLayoutInt nCharKetas2 = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos );
CLayoutInt nCharKetas3 = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos+1 );

if( IsKinsokuPosHead( GetMaxLineLayout() - pWork->nPosX, nCharKetas2, nCharKetas3 )
if( _IsKinsokuPosHead( GetMaxLineLayout() - pWork->nPosX, nCharKetas2, nCharKetas3 )
&& IsKinsokuHead( pWork->cLineStr.At(pWork->nPos+1) )
&& ! IsKinsokuHead( pWork->cLineStr.At(pWork->nPos) ) //1文字前が行頭禁則でない
&& ! IsKinsokuKuto( pWork->cLineStr.At(pWork->nPos) ) ) //句読点でない
Expand All @@ -159,15 +199,17 @@ void CLayoutMgr::_DoGyotoKinsoku(SLayoutWork* pWork, PF_OnLine pfOnLine)

void CLayoutMgr::_DoGyomatsuKinsoku(SLayoutWork* pWork, PF_OnLine pfOnLine)
{
// 現在位置が行末付近かつ行頭ではなく、禁則処理の実行中でないこと
if( (pWork->nPos+1 < pWork->cLineStr.GetLength()) // 2007.02.17 ryoji 追加
&& (GetMaxLineKetas() - pWork->nPosX < 4)
&& ( GetMaxLineLayout() - pWork->nPosX < 4 * GetWidthPerKeta() )
&& ( pWork->nPosX > pWork->nIndent ) // 2004.04.09 pWork->nPosXの解釈変更のため,行頭チェックも変更
&& (pWork->eKinsokuType == KINSOKU_TYPE_NONE) )
{ /* 行末禁則する && 行末付近 && 行頭でないこと(無限に禁則してしまいそう) */
{
CLayoutInt nCharKetas2 = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos );
CLayoutInt nCharKetas3 = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos+1 );

if( IsKinsokuPosTail(GetMaxLineLayout() - pWork->nPosX, nCharKetas2, nCharKetas3) && IsKinsokuTail(pWork->cLineStr.At(pWork->nPos)) ){
if( _IsKinsokuPosTail( GetMaxLineLayout() - pWork->nPosX, nCharKetas2, nCharKetas3 ) && IsKinsokuTail( pWork->cLineStr.At( pWork->nPos ) ) )
{
pWork->nWordBgn = pWork->nPos;
pWork->nWordLen = 1;
pWork->eKinsokuType = KINSOKU_TYPE_KINSOKU_TAIL;
Expand Down
94 changes: 6 additions & 88 deletions sakura_core/doc/layout/CLayoutMgr_New.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,121 +27,39 @@
/*!
行頭禁則文字に該当するかを調べる.
@param[in] pLine 調べる文字へのポインタ
@param[in] length 当該箇所の文字サイズ
@param[in] wc 調べる文字
@retval true 禁則文字に該当
@retval false 禁則文字に該当しない
*/
bool CLayoutMgr::IsKinsokuHead( wchar_t wc )
bool CLayoutMgr::IsKinsokuHead( wchar_t wc ) const
{
return m_pszKinsokuHead_1.exist(wc);
}

/*!
行末禁則文字に該当するかを調べる.
@param[in] pLine 調べる文字へのポインタ
@param[in] length 当該箇所の文字サイズ
@param[in] wc 調べる文字
@retval true 禁則文字に該当
@retval false 禁則文字に該当しない
*/
bool CLayoutMgr::IsKinsokuTail( wchar_t wc )
bool CLayoutMgr::IsKinsokuTail( wchar_t wc ) const
{
return m_pszKinsokuTail_1.exist(wc);
}

/*!
禁則対象句読点に該当するかを調べる.
@param [in] pLine 調べる文字へのポインタ
@param [in] length 当該箇所の文字サイズ
@param[in] wc 調べる文字
@retval true 禁則文字に該当
@retval false 禁則文字に該当しない
*/
bool CLayoutMgr::IsKinsokuKuto( wchar_t wc )
bool CLayoutMgr::IsKinsokuKuto( wchar_t wc ) const
{
return m_pszKinsokuKuto_1.exist(wc);
}

/*!
@date 2005-08-20 D.S.Koba _DoLayout()とDoLayout_Range()から分離
*/
bool CLayoutMgr::IsKinsokuPosHead(
CLayoutInt nRest, //!< [in] 行の残り文字数
CLayoutInt nCharKetas, //!< [in] 現在位置の文字サイズ
CLayoutInt nCharKetas2 //!< [in] 現在位置の次の文字サイズ
)
{
switch( (Int)nRest )
{
// 321012 ↓マジックナンバー
// 3 "る)" : 22 ")"の2バイト目で折り返しのとき
// 2 "Z)" : 12 ")"の2バイト目で折り返しのとき
// 2 "る)": 22 ")"で折り返しのとき
// 2 "る)" : 21 ")"で折り返しのとき
// 1 "Z)": 12 ")"で折り返しのとき
// 1 "Z)" : 11 ")"で折り返しのとき
//↑何文字前か?
// ※ただし、"るZ"部分が禁則なら処理しない。
case 3: // 3文字前
if( nCharKetas == 2 && nCharKetas2 == 2 ){
return true;
}
break;
case 2: // 2文字前
if( nCharKetas == 2 ){
return true;
}
else if( nCharKetas == 1 && nCharKetas2 == 2 ){
return true;
}
break;
case 1: // 1文字前
if( nCharKetas == 1 ){
return true;
}
break;
}
return false;
}

/*!
@date 2005-08-20 D.S.Koba _DoLayout()とDoLayout_Range()から分離
*/
bool CLayoutMgr::IsKinsokuPosTail(
CLayoutInt nRest, //!< [in] 行の残り文字数
CLayoutInt nCharKetas, //!< [in] 現在位置の文字サイズ
CLayoutInt nCharKetas2 //!< [in] 現在位置の次の文字サイズ
)
{
switch( (Int)nRest )
{
case 3: // 3文字前
if( nCharKetas == 2 && nCharKetas2 == 2){
// "(あ": "あ"の2バイト目で折り返しのとき
return true;
}
break;
case 2: // 2文字前
if( nCharKetas == 2 ){
// "(あ": "あ"で折り返しのとき
return true;
}
else if( nCharKetas == 1 && nCharKetas2 == 2){
// "(あ": "あ"の2バイト目で折り返しのとき
return true;
}
break;
case 1: // 1文字前
if( nCharKetas == 1 ){
// "(あ": "あ"で折り返しのとき
return true;
}
break;
}
return false;
}

/*!
@brief 行の長さを計算する (2行目以降の字下げ無し)
Expand Down

0 comments on commit fe4796c

Please sign in to comment.