LexicalChunk.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / MS / Internal / TextFormatting / LexicalChunk.cs / 1305600 / LexicalChunk.cs

                            //------------------------------------------------------------------------ 
//
//  Microsoft Windows Client Platform
//  Copyright (C) Microsoft Corporation
// 
//  File:      LexicalChunk.cs
// 
//  Contents:  Lexical chunk represents the character analysis of a piece of raw character string. 
//
//  Created:   6-13-2005 Worachai Chaoweeraprasit (wchao) 
//
//-----------------------------------------------------------------------

 
using System;
using System.Windows.Media.TextFormatting; 
using MS.Internal.Generic; 

 
namespace MS.Internal.TextFormatting
{
    /// 
    /// Lexical chunk represents the character analysis of a piece of raw character string. 
    /// It contains the analyzing result of the string by the lexical services component i.e.
    /// word-breaker or hyphenator or both. 
    /// 
    /// The number of character indices represented by a chunk may not map exactly to the same number
    /// of LSCP in the LS character position space. This is because two adjacent character indices in 
    /// a chunk may be mapped by two non-adjacent LSCP in the LS positions. Between two LSRun could
    /// exist a hidden-run which occupies real LSCP but represents no actual displayable character.
    ///
    /// The mapping between the character offsets and the offsets to the correspondent LSCP is retained 
    /// in a span vector that is indexed by the character offsets.
    ///  
    internal struct LexicalChunk 
    {
        private TextLexicalBreaks       _breaks;        // lexical breaks of chunk characters 
        private SpanVector         _ichVector;     // spans of offsets to the ich-correspondence LSCP


        internal TextLexicalBreaks Breaks 
        {
            get { return _breaks; } 
        } 

 
        /// 
        /// Boolean value indicates whether this chunk contains no valid break info
        /// 
        internal bool IsNoBreak 
        {
            get { return _breaks == null; } 
        } 

 
        /// 
        /// Contruct lexical chunk from character analysis
        /// 
        internal LexicalChunk( 
            TextLexicalBreaks   breaks,
            SpanVector     ichVector 
            ) 
        {
            Invariant.Assert(breaks != null); 
            _breaks = breaks;
            _ichVector = ichVector;
        }
 

        ///  
        /// Convert the specified LSCP to character index 
        /// 
        internal int LSCPToCharacterIndex(int lsdcp) 
        {
            if (_ichVector.Count > 0)
            {
                int ich = 0; 
                int cchLast = 0;
                int lsdcpLast = 0; 
 
                for (int i = 0; i < _ichVector.Count; i++)
                { 
                    Span span = _ichVector[i];
                    int lsdcpCurrent = span.Value;

                    if (lsdcpCurrent > lsdcp) 
                    {
                        return ich - cchLast + Math.Min(cchLast, lsdcp - lsdcpLast); 
                    } 

                    ich += span.Length; 
                    cchLast = span.Length;
                    lsdcpLast = lsdcpCurrent;
                }
 
                return ich - cchLast + Math.Min(cchLast, lsdcp - lsdcpLast);
            } 
 
            return lsdcp;
        } 


        /// 
        /// Convert the specified character index to LSCP 
        /// 
        internal int CharacterIndexToLSCP(int ich) 
        { 
            if (_ichVector.Count > 0)
            { 
                SpanRider ichRider = new SpanRider(_ichVector);
                ichRider.At(ich);
                return ichRider.CurrentValue + ich - ichRider.CurrentSpanStart;
            } 

            return ich; 
        } 
    }
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------ 
//
//  Microsoft Windows Client Platform
//  Copyright (C) Microsoft Corporation
// 
//  File:      LexicalChunk.cs
// 
//  Contents:  Lexical chunk represents the character analysis of a piece of raw character string. 
//
//  Created:   6-13-2005 Worachai Chaoweeraprasit (wchao) 
//
//-----------------------------------------------------------------------

 
using System;
using System.Windows.Media.TextFormatting; 
using MS.Internal.Generic; 

 
namespace MS.Internal.TextFormatting
{
    /// 
    /// Lexical chunk represents the character analysis of a piece of raw character string. 
    /// It contains the analyzing result of the string by the lexical services component i.e.
    /// word-breaker or hyphenator or both. 
    /// 
    /// The number of character indices represented by a chunk may not map exactly to the same number
    /// of LSCP in the LS character position space. This is because two adjacent character indices in 
    /// a chunk may be mapped by two non-adjacent LSCP in the LS positions. Between two LSRun could
    /// exist a hidden-run which occupies real LSCP but represents no actual displayable character.
    ///
    /// The mapping between the character offsets and the offsets to the correspondent LSCP is retained 
    /// in a span vector that is indexed by the character offsets.
    ///  
    internal struct LexicalChunk 
    {
        private TextLexicalBreaks       _breaks;        // lexical breaks of chunk characters 
        private SpanVector         _ichVector;     // spans of offsets to the ich-correspondence LSCP


        internal TextLexicalBreaks Breaks 
        {
            get { return _breaks; } 
        } 

 
        /// 
        /// Boolean value indicates whether this chunk contains no valid break info
        /// 
        internal bool IsNoBreak 
        {
            get { return _breaks == null; } 
        } 

 
        /// 
        /// Contruct lexical chunk from character analysis
        /// 
        internal LexicalChunk( 
            TextLexicalBreaks   breaks,
            SpanVector     ichVector 
            ) 
        {
            Invariant.Assert(breaks != null); 
            _breaks = breaks;
            _ichVector = ichVector;
        }
 

        ///  
        /// Convert the specified LSCP to character index 
        /// 
        internal int LSCPToCharacterIndex(int lsdcp) 
        {
            if (_ichVector.Count > 0)
            {
                int ich = 0; 
                int cchLast = 0;
                int lsdcpLast = 0; 
 
                for (int i = 0; i < _ichVector.Count; i++)
                { 
                    Span span = _ichVector[i];
                    int lsdcpCurrent = span.Value;

                    if (lsdcpCurrent > lsdcp) 
                    {
                        return ich - cchLast + Math.Min(cchLast, lsdcp - lsdcpLast); 
                    } 

                    ich += span.Length; 
                    cchLast = span.Length;
                    lsdcpLast = lsdcpCurrent;
                }
 
                return ich - cchLast + Math.Min(cchLast, lsdcp - lsdcpLast);
            } 
 
            return lsdcp;
        } 


        /// 
        /// Convert the specified character index to LSCP 
        /// 
        internal int CharacterIndexToLSCP(int ich) 
        { 
            if (_ichVector.Count > 0)
            { 
                SpanRider ichRider = new SpanRider(_ichVector);
                ichRider.At(ich);
                return ichRider.CurrentValue + ich - ichRider.CurrentSpanStart;
            } 

            return ich; 
        } 
    }
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK