private static void ProcessPotentialMergeBlock(ref int i)
        {
            if (TryClassifyAsSymbol(blocks[i]))
            {
                return;
            }

            TextBlock mergePreviousBlock   = null;
            bool      isPreviousMergeValid = TryMergeToPreviousBlock(i, ref mergePreviousBlock);

            TextBlock mergeNextBlock   = null;
            bool      isNextMergeValid = TryMergeToNextBlock(i, ref mergeNextBlock, ref isPreviousMergeValid);

            if (isPreviousMergeValid && isNextMergeValid)
            {
                DetermineMergeDirection(i, mergePreviousBlock, ref isPreviousMergeValid, mergeNextBlock, ref isNextMergeValid);
            }

            if (isPreviousMergeValid)
            {
                JoinPreviousMergeBlockToListBlock(ref i, mergePreviousBlock);
                return;
            }

            if (isNextMergeValid)
            {
                JoinNextMergeBlockToListBlock(i, mergeNextBlock);
                return;
            }

            if (!isHorizontalText)
            {
                if (VerticalTextProjection.GetMaxWidthPostionPercentToNeightbor(blocks, i) > VerticalTextProjection.MARK_WIDTH_POSITION_PERCENT)
                {
                    var lineIndex   = blocks[i].LineIndex;
                    var avgGapIntra = VerticalTextProjection.AvgGapIntraChars[lineIndex];
                    if (lineIndex == blocks[i - 1].LineIndex && blocks[i].Top - blocks[i - 1].Bottom <= avgGapIntra && mergePreviousBlock != null)
                    {
                        JoinPreviousMergeBlockToListBlock(ref i, mergePreviousBlock);
                        return;
                    }
                    else if (lineIndex == blocks[i + 1].LineIndex && blocks[i + 1].Top - blocks[i].Bottom <= avgGapIntra && mergeNextBlock != null)
                    {
                        JoinNextMergeBlockToListBlock(i, mergeNextBlock);
                        return;
                    }
                }
            }

            isPreviousMerge = false;
        }
        private static float CaluculateValidGap(int blockIndex, char text)
        {
            if (isHorizontalText)
            {
                float avgGap  = HorizontalTextProjection.AvgGapBlocks[blocks[blockIndex].LineIndex];
                float percent = HorizontalTextProjection.GetMaxHeightPostionPercentToNeightbor(blocks, blockIndex);
                if (text == '、' || text == 'l' || text == 'ノ')
                {
                    if (percent > HorizontalTextProjection.MARK_HEIGH_POSITION_PERCENT)
                    {
                        return(2f * avgGap);
                    }
                }
                else if (text == 'し')
                {
                    return((float)Math.Ceiling(avgGap * 2f));
                }
                else if (percent > HorizontalTextProjection.MARK_HEIGH_POSITION_PERCENT)
                {
                    return(1.5f * avgGap);
                }

                return(avgGap);
            }
            else
            {
                float percent = VerticalTextProjection.GetMaxWidthPostionPercentToNeightbor(blocks, blockIndex);
                if (percent > VerticalTextProjection.MARK_WIDTH_POSITION_PERCENT)
                {
                    return(VerticalTextProjection.AvgGapBlocks[blocks[blockIndex].LineIndex] * 1.5f);
                }
                else
                {
                    return(VerticalTextProjection.AvgGapBlocks[blocks[blockIndex].LineIndex]);
                }
            }
        }