Example #1
0
        public IExpression Collate(ICollation collation)
        {
            var col = Misc.TryCast <ICollation, QueryCollation>(collation);

            col.SetOperand(this);
            return(col);
        }
        public IExpression Collate([NotNull] ICollation collation)
        {
            CBDebug.MustNotBeNull(WriteLog.To.Query, Tag, nameof(collation), collation);
            var col = Misc.TryCast <ICollation, QueryCollation>(collation);

            col = new QueryCollation(col);
            col.SetOperand(this);
            return(col);
        }
        public int CreateCollation(IDbHandle db, ICollation collation)
        {
            var internalDbHandle = (DbHandle)db;

            var compareCallbackExecutor = new CompareCallbackExecutor(
                collation,
                SQLiteApiIOSInternal.GetCompareCallbackStringBytes);

            var func = new SQLiteApiIOSInternal.CompareCallback(compareCallbackExecutor.Execute);

            _allocatedGCHandles.Add(GCHandle.Alloc(func));

            return(SQLiteApiIOSInternal.sqlite3_create_collation(
                       internalDbHandle.DbPtr,
                       Encoding.UTF8.GetBytes(collation.Name),
                       SQLiteEncodings.SQLITE_UTF8,
                       IntPtr.Zero,
                       func));
        }
Example #4
0
 /// --------------------------------------------------------------------------------
 /// <summary>
 ///
 /// </summary>
 /// <param name="coll"></param>
 /// --------------------------------------------------------------------------------
 public CollationNameMultiUnicode(ICollation coll) : base()
 {
     m_coll = coll;
 }
        public void SerializeAndDeserialize()
        {
            IWritingSystem ws     = m_wsf.get_Engine("tl");
            int            wsIdTl = m_wsf.GetWsFromStr("tl");

            ws.Locale           = 13321;
            ws.DefaultMonospace = "Courier New";
            ws.DefaultSansSerif = "Arial";
            ws.DefaultBodyFont  = "Charis SIL";
            ws.DefaultSerif     = "Times New Roman";
            ws.set_Name(m_wsIdEn, "Tagalog");
            ws.set_Name(wsIdTl, "Tagalog");
            ws.set_Abbr(m_wsIdEn, "TGL");

            ICollation coll = CollationClass.Create();

            coll.WinLCID      = 1033;
            coll.WinCollation = "Latin1_General_CI_AI";
            coll.set_Name(m_wsIdEn, "Default Collation");
            coll.WritingSystemFactory = m_wsf;

            ws.set_Collation(0, coll);

            LanguageDefinition langDef = new LanguageDefinition(ws);

            langDef.BaseLocale = "en_US";
            langDef.XmlWritingSystem.WritingSystem.IcuLocale = "tl";
            langDef.LocaleName    = "Tagalog";
            langDef.LocaleScript  = "";
            langDef.LocaleCountry = "";
            langDef.LocaleVariant = "";
            langDef.XmlWritingSystem.WritingSystem.Locale = 13321;
            langDef.CollationElements = "\"&amp; B &lt; ...";
            langDef.ValidChars        = "abcdefg";
            langDef.LocaleResources   = @"
				zoneStrings {
					{
						'Europe/London',
						'Greenwich Mean Time',
				  }
				}"                ;
            CharDef[] charDefs = new CharDef[2];
            charDefs[0]            = new CharDef(0xF170, "COMBINING SNAKE BELOW;Mn;202;NSM;;;;");
            charDefs[1]            = new CharDef(0xF210, "LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;");
            langDef.PuaDefinitions = charDefs;
            FileName[] fonts = new FileName[4];
            fonts[0]                  = new FileName("arial.ttf");
            fonts[1]                  = new FileName("arialbd.ttf");
            fonts[2]                  = new FileName("ariali.ttf");
            fonts[3]                  = new FileName("arialbi.ttf");
            langDef.Fonts             = fonts;
            langDef.Keyboard          = new FileName("Tagalog.kmx");
            langDef.EncodingConverter = new EncodingConverter("SIL_IPA93.tec.vbs", "SIL-IPA93.tec");

            string tmpFileName = Path.GetTempFileName();

            langDef.Serialize(tmpFileName);

            LanguageDefinitionFactory otherIcuWs = new LanguageDefinitionFactory();

            LanguageDefinitionFactory.WritingSystemFactory = m_wsf;
            otherIcuWs.Deserialize(tmpFileName);
            ILanguageDefinition newLangDef       = otherIcuWs.LanguageDefinition;
            IWritingSystem      deserializedWs   = newLangDef.WritingSystem;
            ICollation          deserializedColl = newLangDef.GetCollation(0);

            StreamReader reader = new StreamReader(tmpFileName);
            string       line   = reader.ReadLine();

            while (line != null)
            {
                Console.WriteLine(line);
                line = reader.ReadLine();
            }
            reader.Close();
            File.Delete(tmpFileName);

            Assert.AreEqual(ws.Locale, deserializedWs.Locale);
            Assert.AreEqual(ws.IcuLocale, deserializedWs.IcuLocale);
            Assert.AreEqual(ws.DefaultSansSerif, deserializedWs.DefaultSansSerif);
            Assert.AreEqual(ws.DefaultBodyFont, deserializedWs.DefaultBodyFont);
            Assert.AreEqual(ws.get_Name(m_wsIdEn), deserializedWs.get_Name(m_wsIdEn));
            Assert.AreEqual(coll.WinLCID, deserializedColl.WinLCID);
            Assert.AreEqual(coll.WinCollation, deserializedColl.WinCollation);
            // ENHANCE: Add ValidChars to the interface
            // Assert.AreEqual(ws.ValidChars, deserializedWs.ValidChars);
            Assert.AreEqual(coll.get_Name(m_wsIdEn), deserializedColl.get_Name(m_wsIdEn));
        }
Example #6
0
		private const string kClsid = "30"; //Collation.kclsidLgCollationString;

		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// C'tor
		/// </summary>
		/// <param name="coll"></param>
		/// ------------------------------------------------------------------------------------
		public XmlCollation(ICollation coll)
		{
			m_collation = coll;
		}
Example #7
0
		/// --------------------------------------------------------------------------------
		/// <summary>
		///
		/// </summary>
		/// <param name="coll"></param>
		/// --------------------------------------------------------------------------------
		public CollationNameMultiUnicode(ICollation coll): base()
		{
			m_coll = coll;
		}
Example #8
0
 public CompareCallbackExecutor(ICollation collation, Func <IntPtr, int, byte[]> compareCallbackStringBytesGetter)
 {
     _collation = collation;
     _compareCallbackStringBytesGetter = compareCallbackStringBytesGetter;
 }
 public int CreateCollation(IDbHandle db, ICollation collation)
 {
     throw new NotImplementedException();
 }
Example #10
0
        /// <summary>
        /// Get the set of significant digraphs (multigraphs) for the writing system.  At the
        /// moment, these are derived from ICU sorting rules associated with the writing system.
        /// </summary>
        private Set <string> GetDigraphs(string sWs, out Dictionary <string, string> mapChars)
        {
            Set <string> digraphs = null;

            if (m_mapWsDigraphs.TryGetValue(sWs, out digraphs))
            {
                mapChars = m_mapWsMapChars[sWs];
                return(digraphs);
            }
            digraphs = new Set <string>();
            mapChars = new Dictionary <string, string>();
            int            ws        = m_cache.LanguageWritingSystemFactoryAccessor.GetWsFromStr(sWs);
            IWritingSystem wsX       = null;
            ICollation     coll      = null;
            string         sIcuRules = null;

            if (ws > 0)
            {
                wsX = m_cache.LanguageWritingSystemFactoryAccessor.get_EngineOrNull(ws);
                if (wsX.CollationCount > 0)
                {
                    coll      = wsX.get_Collation(0);
                    sIcuRules = coll.IcuRules;
                    if (String.IsNullOrEmpty(sIcuRules))
                    {
                        // The ICU rules may not be loaded for built-in languages, but are
                        // still helpful for our purposes here.
                        string sIcuOrig = sIcuRules;
                        coll.LoadIcuRules(sWs);
                        sIcuRules     = coll.IcuRules;
                        coll.IcuRules = sIcuOrig;                               // but we don't want to actually change anything!
                    }
                }
            }
            if (!String.IsNullOrEmpty(sIcuRules) && sIcuRules.Contains("&"))
            {
                string[] rgsRules = sIcuRules.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < rgsRules.Length; ++i)
                {
                    string sRule = rgsRules[i];
                    // This is a valid rule that specifies that the digraph aa should be ignored
                    // [last tertiary ignorable] = \u02bc = aa
                    // but the code here will ignore this. YAGNI the chances of a user specifying a digraph
                    // as ignorable may never happen.
                    if (sRule.Contains("["))
                    {
                        sRule = sRule.Substring(0, sRule.IndexOf("["));
                    }
                    if (String.IsNullOrEmpty(sRule.Trim()))
                    {
                        continue;
                    }
                    sRule = sRule.Replace("<<<", "=");
                    sRule = sRule.Replace("<<", "=");
                    if (sRule.Contains("<"))
                    {
                        // "&N<ng<<<Ng<ny<<<Ny" => "&N<ng=Ng<ny=Ny"
                        // "&N<ñ<<<Ñ" => "&N<ñ=Ñ"
                        // There are other issues we are not handling proplerly such as the next line
                        // &N<\u006e\u0067
                        string[] rgsPieces = sRule.Split(new char[] { '<', '=' }, StringSplitOptions.RemoveEmptyEntries);
                        for (int j = 0; j < rgsPieces.Length; ++j)
                        {
                            string sGraph = rgsPieces[j];
                            sGraph = sGraph.Trim();
                            if (String.IsNullOrEmpty(sGraph))
                            {
                                continue;
                            }
                            sGraph = Icu.Normalize(sGraph, Icu.UNormalizationMode.UNORM_NFD);
                            if (sGraph.Length > 1)
                            {
                                sGraph = Icu.ToLower(sGraph, sWs);
                                if (!digraphs.Contains(sGraph))
                                {
                                    digraphs.Add(sGraph);
                                }
                            }
                        }
                    }
                    else if (sRule.Contains("="))
                    {
                        // "&ae<<æ<<<Æ" => "&ae=æ=Æ"
                        string[] rgsPieces     = sRule.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                        string   sGraphPrimary = rgsPieces[0].Trim();
                        Debug.Assert(!String.IsNullOrEmpty(sGraphPrimary));
                        sGraphPrimary = Icu.ToLower(sGraphPrimary, sWs);
                        for (int j = 1; j < rgsPieces.Length; ++j)
                        {
                            string sGraph = rgsPieces[j];
                            sGraph = sGraph.Trim();
                            if (String.IsNullOrEmpty(sGraph))
                            {
                                continue;
                            }
                            sGraph = Icu.Normalize(sGraph, Icu.UNormalizationMode.UNORM_NFD);
                            sGraph = Icu.ToLower(sGraph, sWs);
                            if (sGraph != sGraphPrimary)
                            {
                                if (!mapChars.ContainsKey(sGraph))
                                {
                                    mapChars.Add(sGraph, sGraphPrimary);
                                }
                            }
                        }
                    }
                }
            }
            m_mapWsDigraphs.Add(sWs, digraphs);
            m_mapWsMapChars.Add(sWs, mapChars);
            return(digraphs);
        }