public void New_TrainWithInitialPredictor()
        {
            using (var env = new LocalEnvironment(seed: 1, conc: 1))
            {
                var data = new TextLoader(env, MakeSentimentTextLoaderArgs()).Read(new MultiFileSource(GetDataPath(TestDatasets.Sentiment.trainFilename)));

                // Pipeline.
                var pipeline = new TextTransform(env, "SentimentText", "Features");

                // Train the pipeline, prepare train set.
                var trainData = pipeline.FitAndTransform(data);

                // Train the first predictor.
                var trainer = new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments
                {
                    NumThreads = 1
                }, "Features", "Label");
                var firstModel = trainer.Fit(trainData);

                // Train the second predictor on the same data.
                var secondTrainer = new AveragedPerceptronTrainer(env, new AveragedPerceptronTrainer.Arguments());

                var trainRoles = new RoleMappedData(trainData, label: "Label", feature: "Features");
                var finalModel = secondTrainer.Train(new TrainContext(trainRoles, initialPredictor: firstModel.Model));
            }
        }
示例#2
0
        public static string Transform(this string str, TextTransform textTransform)
        {
            if (str == null)
            {
                return(null);
            }
            switch (textTransform)
            {
            case TextTransform.None:
                return(str);

            case TextTransform.ToLower:
                return(str.ToLowerInvariant());

            case TextTransform.ToUpper:
                return(str.ToUpperInvariant());

            case TextTransform.ToPascalNamingConvention:
                return(str.ToPascalNamingConvention());

            case TextTransform.ToUnderscoreLowerCaseNamingConvention:
                return(str.ToUnderscoreLowerCaseNamingConvention());

            case TextTransform.ToUnderscoreUpperCaseNamingConvention:
                return(str.ToUnderscoreUpperCaseNamingConvention());

            default:
                throw new NotImplementedException();
            }
        }
示例#3
0
        public void TrainWithValidationSet()
        {
            var dataPath           = GetDataPath(SentimentDataPath);
            var validationDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                // Pipeline
                var loader = new TextLoader(env, MakeSentimentTextLoaderArgs(), new MultiFileSource(dataPath));

                var trans     = TextTransform.Create(env, MakeSentimentTextTransformArgs(), loader);
                var trainData = trans;

                // Apply the same transformations on the validation set.
                // Sadly, there is no way to easily apply the same loader to different data, so we either have
                // to create another loader, or to save the loader to model file and then reload.

                // A new one is not always feasible, but this time it is.
                var validLoader = new TextLoader(env, MakeSentimentTextLoaderArgs(), new MultiFileSource(validationDataPath));
                var validData   = ApplyTransformUtils.ApplyAllTransformsToData(env, trainData, validLoader);

                // Cache both datasets.
                var cachedTrain = new CacheDataView(env, trainData, prefetch: null);
                var cachedValid = new CacheDataView(env, validData, prefetch: null);

                // Train.
                var trainer = new FastTreeBinaryClassificationTrainer(env, new FastTreeBinaryClassificationTrainer.Arguments
                {
                    NumTrees = 3
                });
                var trainRoles = new RoleMappedData(cachedTrain, label: "Label", feature: "Features");
                var validRoles = new RoleMappedData(cachedValid, label: "Label", feature: "Features");
                trainer.Train(new Runtime.TrainContext(trainRoles, validRoles));
            }
        }
示例#4
0
        void New_CrossValidation()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                var data = new TextLoader(env, MakeSentimentTextLoaderArgs())
                           .Read(new MultiFileSource(dataPath));
                // Pipeline.
                var pipeline = new TextTransform(env, "SentimentText", "Features")
                               .Append(new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments
                {
                    NumThreads           = 1,
                    ConvergenceTolerance = 1f
                }, "Features", "Label"));

                var cv = new MyCrossValidation.BinaryCrossValidator(env)
                {
                    NumFolds = 2
                };

                var cvResult = cv.CrossValidate(data, pipeline);
            }
        }
示例#5
0
        public void SetupSentimentPipeline()
        {
            _sentimentExample = new SentimentData()
            {
                SentimentText = "Not a big fan of this."
            };

            string _sentimentDataPath = Program.GetInvariantCultureDataPath("wikipedia-detox-250-line-data.tsv");

            using (var env = new ConsoleEnvironment(seed: 1, conc: 1, verbose: false, sensitivity: MessageSensitivity.None, outWriter: EmptyWriter.Instance))
            {
                var reader = new TextLoader(env,
                                            new TextLoader.Arguments()
                {
                    Separator = "\t",
                    HasHeader = true,
                    Column    = new[]
                    {
                        new TextLoader.Column("Label", DataKind.BL, 0),
                        new TextLoader.Column("SentimentText", DataKind.Text, 1)
                    }
                });

                IDataView data = reader.Read(new MultiFileSource(_sentimentDataPath));

                var pipeline = new TextTransform(env, "SentimentText", "Features")
                               .Append(new LinearClassificationTrainer(env, "Features", "Label", advancedSettings: (s) => { s.NumThreads = 1; s.ConvergenceTolerance = 1e-2f; }));

                var model = pipeline.Fit(data);

                _sentimentModel = model.MakePredictionFunction <SentimentData, SentimentPrediction>(env);
            }
        }
        void New_MultithreadedPrediction()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                var reader = new TextLoader(env, MakeSentimentTextLoaderArgs());
                var data   = reader.Read(new MultiFileSource(dataPath));

                // Pipeline.
                var pipeline = new TextTransform(env, "SentimentText", "Features")
                               .Append(new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments {
                    NumThreads = 1
                }, "Features", "Label"));

                // Train.
                var model = pipeline.Fit(data);

                // Create prediction engine and test predictions.
                var engine = new MyPredictionEngine <SentimentData, SentimentPrediction>(env, model);

                // Take a couple examples out of the test data and run predictions on top.
                var testData = reader.Read(new MultiFileSource(GetDataPath(SentimentTestPath)))
                               .AsEnumerable <SentimentData>(env, false);

                Parallel.ForEach(testData, (input) =>
                {
                    lock (engine)
                    {
                        var prediction = engine.Predict(input);
                    }
                });
            }
        }
示例#7
0
        public void AutoNormalizationAndCaching()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                // Pipeline.
                var loader = new TextLoader(env, MakeSentimentTextLoaderArgs(), new MultiFileSource(dataPath));

                var trans = TextTransform.Create(env, MakeSentimentTextTransformArgs(false), loader);

                // Train.
                var trainer = new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments
                {
                    NumThreads           = 1,
                    ConvergenceTolerance = 1f
                });

                // Auto-caching.
                IDataView trainData  = trainer.Info.WantCaching ? (IDataView) new CacheDataView(env, trans, prefetch: null) : trans;
                var       trainRoles = new RoleMappedData(trainData, label: "Label", feature: "Features");

                // Auto-normalization.
                NormalizeTransform.CreateIfNeeded(env, ref trainRoles, trainer);
                var predictor = trainer.Train(new Runtime.TrainContext(trainRoles));
            }
        }
示例#8
0
        public static NSAttributedString ToNSAttributedString(
            this FormattedString formattedString,
            IFontManager fontManager,
            double defaultLineHeight = 0d,             // TODO: NET7 should be -1, but too late to change for net6
            TextAlignment defaultHorizontalAlignment = TextAlignment.Start,
            Font?defaultFont   = null,
            Color?defaultColor = null,
            TextTransform defaultTextTransform = TextTransform.Default)
        {
            if (formattedString == null)
            {
                return(new NSAttributedString(string.Empty));
            }

            var attributed = new NSMutableAttributedString();

            for (int i = 0; i < formattedString.Spans.Count; i++)
            {
                Span span = formattedString.Spans[i];
                if (span.Text == null)
                {
                    continue;
                }

                attributed.Append(span.ToNSAttributedString(fontManager, defaultLineHeight, defaultHorizontalAlignment, defaultFont, defaultColor, defaultTextTransform));
            }

            return(attributed);
        }
示例#9
0
        public override void Execute(CommandContext context, CallerContext callerContext, ChatUser callingUser, string[] args)
        {
            if (context.Repository.Users.Count() == 1)
            {
                throw new InvalidOperationException("You're the only person in here...");
            }

            if (args.Length == 0 || String.IsNullOrWhiteSpace(args[0]))
            {
                throw new InvalidOperationException("Who are you trying send a private message to?");
            }
            var      toUserName = HttpUtility.HtmlDecode(args[0]);
            ChatUser toUser     = context.Repository.VerifyUser(toUserName);

            if (toUser == callingUser)
            {
                throw new InvalidOperationException("You can't private message yourself!");
            }

            string messageText = String.Join(" ", args.Skip(1)).Trim();

            if (String.IsNullOrEmpty(messageText))
            {
                throw new InvalidOperationException(String.Format("What did you want to say to '{0}'?", toUser.Name));
            }

            HashSet <string> urls;
            var transform = new TextTransform(context.Repository);

            messageText = transform.Parse(messageText);

            messageText = TextTransform.TransformAndExtractUrls(messageText, out urls);

            context.NotificationService.SendPrivateMessage(callingUser, toUser, messageText);
        }
示例#10
0
        void FileBasedSavingOfData()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                // Pipeline
                var loader = new TextLoader(env, MakeSentimentTextLoaderArgs(), new MultiFileSource(dataPath));

                var trans = TextTransform.Create(env, MakeSentimentTextTransformArgs(), loader);
                var saver = new BinarySaver(env, new BinarySaver.Arguments());
                using (var ch = env.Start("SaveData"))
                    using (var file = env.CreateOutputFile("i.idv"))
                    {
                        DataSaverUtils.SaveDataView(ch, saver, trans, file);
                    }

                var binData    = new BinaryLoader(env, new BinaryLoader.Arguments(), new MultiFileSource("i.idv"));
                var trainRoles = new RoleMappedData(binData, label: "Label", feature: "Features");
                var trainer    = new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments
                {
                    NumThreads = 1
                });
                var predictor = trainer.Train(new Runtime.TrainContext(trainRoles));

                DeleteOutputPath("i.idv");
            }
        }
        public void New_SimpleTrainAndPredict()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                var reader = new TextLoader(env, MakeSentimentTextLoaderArgs());
                var data   = reader.Read(new MultiFileSource(dataPath));
                // Pipeline.
                var pipeline = new TextTransform(env, "SentimentText", "Features")
                               .Append(new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments {
                    NumThreads = 1
                }, "Features", "Label"));

                // Train.
                var model = pipeline.Fit(data);

                // Create prediction engine and test predictions.
                var engine = model.MakePredictionFunction <SentimentData, SentimentPrediction>(env);

                // Take a couple examples out of the test data and run predictions on top.
                var testData = reader.Read(new MultiFileSource(GetDataPath(SentimentTestPath)))
                               .AsEnumerable <SentimentData>(env, false);
                foreach (var input in testData.Take(5))
                {
                    var prediction = engine.Predict(input);
                    // Verify that predictions match and scores are separated from zero.
                    Assert.Equal(input.Sentiment, prediction.Sentiment);
                    Assert.True(input.Sentiment && prediction.Score > 1 || !input.Sentiment && prediction.Score < -1);
                }
            }
        }
示例#12
0
        public void TrainWithInitialPredictor()
        {
            var dataPath = GetDataPath(SentimentDataPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                // Pipeline
                var loader = new TextLoader(env, MakeSentimentTextLoaderArgs(), new MultiFileSource(dataPath));

                var trans     = TextTransform.Create(env, MakeSentimentTextTransformArgs(), loader);
                var trainData = trans;

                var cachedTrain = new CacheDataView(env, trainData, prefetch: null);
                // Train the first predictor.
                var trainer = new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments
                {
                    NumThreads = 1
                });
                var trainRoles = new RoleMappedData(cachedTrain, label: "Label", feature: "Features");
                var predictor  = trainer.Train(new Runtime.TrainContext(trainRoles));

                // Train the second predictor on the same data.
                var secondTrainer  = new AveragedPerceptronTrainer(env, new AveragedPerceptronTrainer.Arguments());
                var finalPredictor = secondTrainer.Train(new TrainContext(trainRoles, initialPredictor: predictor));
            }
        }
        public void New_ReconfigurablePrediction()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                var dataReader = new TextLoader(env, MakeSentimentTextLoaderArgs());

                var data     = dataReader.Read(new MultiFileSource(dataPath));
                var testData = dataReader.Read(new MultiFileSource(testDataPath));

                // Pipeline.
                var pipeline = new TextTransform(env, "SentimentText", "Features")
                               .Fit(data);

                var trainer = new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments {
                    NumThreads = 1
                }, "Features", "Label");
                var trainData = pipeline.Transform(data);
                var model     = trainer.Fit(trainData);

                var scoredTest = model.Transform(pipeline.Transform(testData));
                var metrics    = new MyBinaryClassifierEvaluator(env, new BinaryClassifierEvaluator.Arguments()).Evaluate(scoredTest, "Label", "Probability");

                var newModel      = new BinaryPredictionTransformer <IPredictorProducing <float> >(env, model.Model, trainData.Schema, model.FeatureColumn, threshold: 0.01f, thresholdColumn: DefaultColumnNames.Probability);
                var newScoredTest = newModel.Transform(pipeline.Transform(testData));
                var newMetrics    = new MyBinaryClassifierEvaluator(env, new BinaryClassifierEvaluator.Arguments {
                    Threshold = 0.01f, UseRawScoreThreshold = false
                }).Evaluate(newScoredTest, "Label", "Probability");
            }
        }
示例#14
0
        private string ParseChatMessageText(string content, out HashSet <string> links)
        {
            var    textTransform = new TextTransform(_repository);
            string message       = textTransform.Parse(content);

            return(Transform(message, out links));
        }
示例#15
0
        private void HandleMsg(ChatUser user, string[] parts)
        {
            if (_repository.Users.Count() == 1)
            {
                throw new InvalidOperationException("You're the only person in here...");
            }

            if (parts.Length < 2 || String.IsNullOrWhiteSpace(parts[1]))
            {
                throw new InvalidOperationException("Who are you trying send a private message to?");
            }
            var      toUserName = parts[1];
            ChatUser toUser     = _repository.VerifyUser(toUserName);

            if (toUser == user)
            {
                throw new InvalidOperationException("You can't private message yourself!");
            }

            string messageText = String.Join(" ", parts.Skip(2)).Trim();

            if (String.IsNullOrEmpty(messageText))
            {
                throw new InvalidOperationException(String.Format("What did you want to say to '{0}'.", toUser.Name));
            }

            HashSet <string> urls;
            var transform = new TextTransform(_repository);

            messageText = transform.Parse(messageText);

            messageText = TextTransform.TransformAndExtractUrls(messageText, out urls);

            _notificationService.SendPrivateMessage(user, toUser, messageText);
        }
 public void TextContainsSymbols_Test()
 {
     Assert.False(TextTransform.CheckTextContainsSymbols("", Symbol.Brackets));
     Assert.False(TextTransform.CheckTextContainsSymbols("Hello, world!", Symbol.Quotes));
     Assert.True(TextTransform.CheckTextContainsSymbols("Hell(o)", Symbol.Brackets));
     Assert.True(TextTransform.CheckTextContainsSymbols("Organization name: «Pomoika Inc»", Symbol.Quotes));
     Assert.True(TextTransform.CheckTextContainsSymbols("Organization name: \"Pomoika Inc\"", Symbol.Quotes));
 }
示例#17
0
 public void ReplaceSubstringInText_Test()
 {
     Assert.Equal("", TextTransform.RemoveTextBetweenSymbols("", Symbol.Brackets));
     Assert.Equal("Hello, world!", TextTransform.RemoveTextBetweenSymbols("Hello, world!", Symbol.Quotes));
     Assert.Equal("Hell(1)", TextTransform.RemoveTextBetweenSymbols("Hell(o)", Symbol.Brackets));
     Assert.Equal("Organization name: «11»", TextTransform.RemoveTextBetweenSymbols("Organization name: «Pomoika Inc»", Symbol.Quotes));
     Assert.Equal("Organization name: \"11\"", TextTransform.RemoveTextBetweenSymbols("Organization name: \"Pomoika Inc\"", Symbol.Quotes));
 }
示例#18
0
        public TransformWrapper Fit(IDataView input)
        {
            var xf    = TextTransform.Create(_env, _args, input);
            var empty = new EmptyDataView(_env, input.Schema);
            var chunk = ApplyTransformUtils.ApplyAllTransformsToData(_env, xf, empty, input);

            return(new TransformWrapper(_env, chunk));
        }
示例#19
0
            public void StringWithHashtagButRoomDoesntExistDoesNotModifyMessage()
            {
                IJabbrRepository repository = CreateRoomRepository();

                TextTransform transform = new TextTransform(repository);
                string        result    = transform.Parse("#thisdoesnotexist");

                Assert.Equal("#thisdoesnotexist", result);
            }
示例#20
0
        private string ConvertUrlsAndRoomLinks(string message)
        {
            TextTransform textTransform = new TextTransform(_repository);

            message = textTransform.ConvertHashtagsToRoomLinks(message);
            HashSet <string> urls;

            return(TextTransform.TransformAndExtractUrls(message, out urls));
        }
示例#21
0
        public async Task InitialTextTransformApplied(string text, TextTransform transform, string expected)
        {
            var control = new Editor()
            {
                Text = text, TextTransform = transform
            };
            var platformText = await GetPlatformText(await CreateHandlerAsync <EditorHandler>(control));

            Assert.Equal(expected, platformText);
        }
示例#22
0
            public void StringWithHashtagModifiesHashtagToRoomLink()
            {
                IJabbrRepository repository = CreateRoomRepository();
                string           expected   = "<a href=\"#/rooms/hashtag\" title=\"#hashtag\">#hashtag</a>";

                TextTransform transform = new TextTransform(repository);
                string        result    = transform.Parse("#hashtag");

                Assert.Equal(expected, result);
            }
示例#23
0
 public Style(string fontName, UnitPx fontSize, FontWeight fontWeight, FontStyle fontStyle, TextTransform textTransform, TextDecoration textDecoration, Color color)
 {
     this.FontName       = fontName;
     this.FontSize       = fontSize;
     this.FontWeight     = fontWeight;
     this.FontStyle      = fontStyle;
     this.TextTransform  = textTransform;
     this.TextDecoration = textDecoration == TextDecoration.Inherit? TextDecoration.None: textDecoration;
     this.Color          = color;
 }
        void ReconfigurablePrediction()
        {
            var dataPath     = GetDataPath(SentimentDataPath);
            var testDataPath = GetDataPath(SentimentTestPath);

            using (var env = new TlcEnvironment(seed: 1, conc: 1))
            {
                // Pipeline
                var loader = new TextLoader(env, MakeSentimentTextLoaderArgs(), new MultiFileSource(dataPath));

                var trans = TextTransform.Create(env, MakeSentimentTextTransformArgs(), loader);

                // Train
                var trainer = new LinearClassificationTrainer(env, new LinearClassificationTrainer.Arguments
                {
                    NumThreads = 1
                });

                var        cached     = new CacheDataView(env, trans, prefetch: null);
                var        trainRoles = new RoleMappedData(cached, label: "Label", feature: "Features");
                IPredictor predictor  = trainer.Train(new Runtime.TrainContext(trainRoles));
                using (var ch = env.Start("Calibrator training"))
                {
                    predictor = CalibratorUtils.TrainCalibrator(env, ch, new PlattCalibratorTrainer(env), int.MaxValue, predictor, trainRoles);
                }

                var scoreRoles = new RoleMappedData(trans, label: "Label", feature: "Features");
                IDataScorerTransform scorer = ScoreUtils.GetScorer(predictor, scoreRoles, env, trainRoles.Schema);

                var dataEval = new RoleMappedData(scorer, label: "Label", feature: "Features", opt: true);

                var evaluator = new BinaryClassifierMamlEvaluator(env, new BinaryClassifierMamlEvaluator.Arguments()
                {
                });
                var metricsDict = evaluator.Evaluate(dataEval);

                var metrics = BinaryClassificationMetrics.FromMetrics(env, metricsDict["OverallMetrics"], metricsDict["ConfusionMatrix"])[0];

                var bindable  = ScoreUtils.GetSchemaBindableMapper(env, predictor, null);
                var mapper    = bindable.Bind(env, trainRoles.Schema);
                var newScorer = new BinaryClassifierScorer(env, new BinaryClassifierScorer.Arguments {
                    Threshold = 0.01f, ThresholdColumn = DefaultColumnNames.Probability
                },
                                                           scoreRoles.Data, mapper, trainRoles.Schema);

                dataEval = new RoleMappedData(newScorer, label: "Label", feature: "Features", opt: true);
                var newEvaluator = new BinaryClassifierMamlEvaluator(env, new BinaryClassifierMamlEvaluator.Arguments()
                {
                    Threshold = 0.01f, UseRawScoreThreshold = false
                });
                metricsDict = newEvaluator.Evaluate(dataEval);
                var newMetrics = BinaryClassificationMetrics.FromMetrics(env, metricsDict["OverallMetrics"], metricsDict["ConfusionMatrix"])[0];
            }
        }
示例#25
0
        public void LabelTextTransform(TextTransform result)
        {
            var xaml = @"
			<Label 
				xmlns=""http://schemas.microsoft.com/dotnet/2021/maui""
				xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" TextTransform="""                 + result + @""" />";

            var label = new Label().LoadFromXaml(xaml);

            Assert.AreEqual(result, label.TextTransform);
        }
示例#26
0
        public static void UpdateInlines(
            this TextBlock textBlock,
            IFontManager fontManager,
            FormattedString formattedString,
            double defaultLineHeight = 0d,             // TODO: NET7 should be -1, but too late to change for net6
            TextAlignment defaultHorizontalAlignment = TextAlignment.Start,
            Font?defaultFont   = null,
            Color?defaultColor = null,
            TextTransform defaultTextTransform = TextTransform.Default)
        {
            textBlock.Inlines.Clear();
            // Have to implement a measure here, otherwise inline.ContentStart and ContentEnd will be null, when used in RecalculatePositions
            textBlock.Measure(new global::Windows.Foundation.Size(double.MaxValue, double.MaxValue));

            var runAndColorTuples = formattedString.ToRunAndColorsTuples(fontManager, defaultLineHeight, defaultHorizontalAlignment, defaultFont, defaultColor, defaultTextTransform);

            var heights          = new List <double>();
            int currentTextIndex = 0;

            foreach (var runAndColorTuple in runAndColorTuples)
            {
                Run   run        = runAndColorTuple.Item1;
                Color textColor  = runAndColorTuple.Item2;
                Color background = runAndColorTuple.Item3;
                heights.Add(textBlock.FindDefaultLineHeight(run));
                textBlock.Inlines.Add(run);
                int length = run.Text.Length;

                if (background != null || textColor != null)
                {
                    TextHighlighter textHighlighter = new TextHighlighter {
                        Ranges = { new TextRange(currentTextIndex, length) }
                    };

                    if (background != null)
                    {
                        textHighlighter.Background = background.ToPlatform();
                    }
                    else
                    {
                        textHighlighter.Background = Colors.Transparent.ToPlatform();
                    }

                    if (textColor != null)
                    {
                        textHighlighter.Foreground = textColor.ToPlatform();
                    }

                    textBlock.TextHighlighters.Add(textHighlighter);
                }

                currentTextIndex += length;
            }
        }
示例#27
0
            public void UrlWithHttpsIsTransformed()
            {
                //arrange
                var message = "message https://www.jabbr.net continues on";
                HashSet <string> extractedUrls;

                //act
                var result = TextTransform.TransformAndExtractUrls(message, out extractedUrls);

                //assert
                Assert.Equal("message <a rel=\"nofollow external\" target=\"_blank\" href=\"https://www.jabbr.net\" title=\"https://www.jabbr.net\">https://www.jabbr.net</a> continues on", result);
            }
示例#28
0
        public void LabelTextTransform(TextTransform result)
        {
            var xaml = @"
			<Label 
				xmlns=""http://xamarin.com/schemas/2014/forms""
				xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" TextTransform="""                 + result + @""" />";

            Device.PlatformServices = new MockPlatformServices();
            var label = new Label().LoadFromXaml(xaml);

            Assert.AreEqual(result, label.TextTransform);
        }
示例#29
0
            public void UrlEndsWithSlashInsideAQuotedSentence()
            {
                //arrange
                var message = "\"Visit http://www.jabbr.net/\"";
                HashSet <string> extractedUrls;

                //act
                var result = TextTransform.TransformAndExtractUrls(message, out extractedUrls);

                //assert
                Assert.Equal("\"Visit <a rel=\"nofollow external\" target=\"_blank\" href=\"http://www.jabbr.net/\" title=\"http://www.jabbr.net/\">http://www.jabbr.net/</a>\"", result);
            }
示例#30
0
            public void UrlInsideAQuotedSentence()
            {
                //arrange
                var message = "This is a sentence with quotes and a url ... see \"http://foo.com\"";
                HashSet <string> extractedUrls;

                //act
                var result = TextTransform.TransformAndExtractUrls(message, out extractedUrls);

                //assert
                Assert.Equal("This is a sentence with quotes and a url ... see \"<a rel=\"nofollow external\" target=\"_blank\" href=\"http://foo.com\" title=\"http://foo.com\">http://foo.com</a>\"", result);
            }
示例#31
0
 /// <summary>
 /// Initializes a new instance of the <see cref="FriendlyUrlSettings"/> class.
 /// </summary>
 /// <param name="config">The config.</param>
 public FriendlyUrlSettings(NameValueCollection config)
 {
     if (config == null)
         return;
     textTransformation = ParseTextTransform(config["textTransform"]);
     separatingCharacter = config["separatingCharacter"];
     string wordCountLimitText = config["limitWordCount"];
     if(!String.IsNullOrEmpty(wordCountLimitText) )
     {
         int.TryParse(wordCountLimitText, out this.wordCountLimit);
     }
     enabled = true;
 }
示例#32
0
 public CssStyle()
 {
     color=	new Color(0, 0, 0);
     background=	new Background();
     border=	new Border();
     clear=	FloatType.none;
     display=	Display.inline;
     _float=	FloatType.none;
     height=	new FlexibleFloat(0f, FlexFloatType.px);
     margin=	new Margin(0f, 0f, 0f, 0f);
     padding=	new Padding(0f, 0f, 0f, 0f);
     width=	new FlexibleFloat(100f, FlexFloatType.percentage);
     letterSpacing=	new FlexibleFloat(FlexibleFloat.letterSpacingNormal, FlexFloatType.px);
     lineHeight=	new FlexibleFloat(FlexibleFloat.lineHeightNormal, FlexFloatType.px);
     textAlign=	TextAlignment.left;
     textIndex=	new FlexibleFloat(0f, FlexFloatType.px);
     textTransform=	TextTransform.none;
     whiteSpace=	WhiteSpace.normal;
     wordSpacing=	new FlexibleFloat(FlexibleFloat.wordSpacingNormal, FlexFloatType.px);
     textDecoration=	TextDecoration.none;
     font=	new Sdx.Font("arial", 14);
     listStyle=	new ListStyle();
 }
示例#33
0
文件: Entries.cs 项目: ayende/Subtext
 /// <summary>
 /// Converts a title of a blog post into a friendly, but URL safe string.
 /// Defaults entryId to 0 as if it was a new entry
 /// </summary>
 /// <param name="title">The original title of the blog post.</param>
 /// <param name="wordSeparator">The string used to separate words in the title.</param>
 /// <param name="textTransform">Used to specify a change to the casing of the string.</param>
 /// <returns></returns>
 public static string AutoGenerateFriendlyUrl(string title, char wordSeparator, TextTransform textTransform)
 {
     return AutoGenerateFriendlyUrl(title, wordSeparator, 0, textTransform);
 }
示例#34
0
文件: Entries.cs 项目: ayende/Subtext
        /// <summary>
        /// Converts a title of a blog post into a friendly, but URL safe string.
        /// </summary>
        /// <param name="title">The original title of the blog post.</param>
        /// <param name="wordSeparator">The string used to separate words in the title.</param>
        /// <param name="entryId">The id of the current entry.</param>
        /// <param name="textTransform">Used to specify a change to the casing of the string.</param>
        /// <returns></returns>
        public static string AutoGenerateFriendlyUrl(string title, char wordSeparator, int entryId, TextTransform textTransform)
        {
            if (title == null)
            {
                throw new ArgumentNullException("title", "Cannot generate friendly url from null title.");
            }

            string entryName = RemoveNonWordCharacters(title);
            entryName = ReplaceSpacesWithSeparator(entryName, wordSeparator);
            entryName = ReplaceUnicodeCharacters(entryName);
            entryName = HttpUtility.UrlEncode(entryName);
            entryName = RemoveTrailingPeriods(entryName);
            entryName = entryName.Trim(new char[] {wordSeparator});
            entryName = StringHelper.RemoveDoubleCharacter(entryName, '.');
            if (wordSeparator != char.MinValue && wordSeparator != '.')
                entryName = StringHelper.RemoveDoubleCharacter(entryName, wordSeparator);

            if (StringHelper.IsNumeric(entryName))
            {
                entryName = "n" + wordSeparator + entryName;
            }

            string newEntryName = FriendlyUrlSettings.TransformString(entryName, textTransform);

            int tryCount = 0;
            Entry currentEntry = ObjectProvider.Instance().GetEntry(newEntryName, false, false);

            while (currentEntry != null)
            {
                if (currentEntry.Id == entryId) //This means that we are updating the same entry, so should allow same entryname
                    break;
                switch(tryCount)
                {
                    case 0:
                        newEntryName = entryName + wordSeparator + "Again";
                        break;
                    case 1:
                        newEntryName = entryName + wordSeparator + "Yet" + wordSeparator + "Again";
                        break;
                    case 2:
                        newEntryName = entryName + wordSeparator + "And" + wordSeparator + "Again";
                        break;
                    case 3:
                        newEntryName = entryName + wordSeparator + "Once" + wordSeparator + "More";
                        break;
                    case 4:
                        newEntryName = entryName + wordSeparator + "To" + wordSeparator + "Beat" + wordSeparator + "A" + wordSeparator +
                                           "Dead" + wordSeparator + "Horse";
                        break;
                }
                if (tryCount++ > 5)
                    break; //Allow an exception to get thrown later.

                newEntryName = FriendlyUrlSettings.TransformString(newEntryName, textTransform);
                currentEntry = ObjectProvider.Instance().GetEntry(newEntryName, false, false);
            }

            return newEntryName;
        }
示例#35
0
        public static string TransformString(string s, TextTransform textTransform)
        {
            switch (textTransform)
            {
                case TextTransform.None:
                    break;

                case TextTransform.LowerCase:
                    return s.ToLower(CultureInfo.InvariantCulture);

                case TextTransform.UpperCase:
                    return s.ToUpper(CultureInfo.InvariantCulture);
            }
            return s;
        }
示例#36
0
 public static string Transform(this string str, TextTransform textTransform)
 {
     switch (textTransform)
     {
         case TextTransform.None:
             return str;
         case TextTransform.ToLower:
             return str.ToLower();
         case TextTransform.ToUpper:
             return str.ToUpper();
         case TextTransform.ToPascalNamingConvention:
             return str.ToPascalNamingConvention();
         case TextTransform.ToUnderscoreLowerCaseNamingConvention:
             return str.ToUnderscoreLowerCaseNamingConvention();
         case TextTransform.ToUnderscoreUpperCaseNamingConvention:
             return str.ToUnderscoreUpperCaseNamingConvention();
         default:
             throw new NotImplementedException();
     }
 }