public void UnsetLink()
 {
     if (_selection.IsEmpty)
     {
         var run = _target.GetInlineAt(_caretIndex) as Run;
         if (run != null)
         {
             var cmd = new SetLinkOfRunCommand(run, null);
             _executor.Execute(cmd);
         }
     }
     else
     {
         var cmd = new SetLinkCommand(_target, _selection.Range, null);
         _executor.Execute(cmd);
     }
 }
        // --- link ---
        public void SetLink(string uri, string relationship)
        {
            var link = new Link(uri, relationship);

            if (_selection.IsEmpty)
            {
                var run = _target.GetInlineAt(_caretIndex) as Run;
                if (run != null)
                {
                    var cmd = new SetLinkOfRunCommand(run, link);
                    _executor.Execute(cmd);
                }
            }
            else
            {
                var cmd = new SetLinkCommand(_target, _selection.Range, link);
                _executor.Execute(cmd);
            }
        }
        public void InsertText(string text, bool inBlock)
        {
            _nextInputInline = null;

            if (StringUtil.IsNullOrWhitespace(text))
            {
                return;
            }

            var cmds             = new CompositeCommand();
            var hasLastLineBreak = text[text.Length - 1] == '\n' || text[text.Length - 1] == '\r';
            var lines            = StyledTextUtil.SplitWithBlockBreak(text);

            if (lines.Any())
            {
                if (!_selection.IsEmpty)
                {
                    /// 範囲選択されているならその範囲を削除
                    var index = _selection.Offset;
                    cmds.Children.Add(new RemoveCommand(_target, _selection.Offset, _selection.Length));
                    CaretIndex = index;
                    ClearSelection();
                }

                var firstLine  = lines[0];
                var lastLine   = lines[lines.Length - 1];
                var caretIndex = _caretIndex;
                var urlRanges  = new List <Tuple <Range, string> >(); /// for link
                foreach (var line in lines)
                {
                    if (!string.IsNullOrEmpty(line))
                    {
                        _nextInputInline = null;
                        var sanitized = line.Replace("\t", "    ");

                        /// link取得
                        var ranges = StringUtil.GetUrlRanges(sanitized);
                        if (ranges.Any())
                        {
                            foreach (var r in ranges)
                            {
                                var tuple = Tuple.Create(
                                    new Range(r.Offset + caretIndex, r.Length),
                                    sanitized.Substring(r.Offset, r.Length)
                                    );
                                urlRanges.Add(tuple);
                            }
                        }

                        if (line == firstLine)
                        {
                            cmds.Children.Add(new InsertStringCommand(_target, caretIndex, sanitized));
                        }
                        else
                        {
                            cmds.Children.Add(
                                new InsertInlineCommand(_target, caretIndex, new Run(sanitized))
                                );
                        }
                        caretIndex += sanitized.Length;
                    }
                    if (line != lastLine || hasLastLineBreak)
                    {
                        if (inBlock)
                        {
                            cmds.Children.Add(new InsertLineBreakCommand(_target, caretIndex));
                        }
                        else
                        {
                            cmds.Children.Add(new InsertBlockBreakCommand(_target, caretIndex));
                        }
                        ++caretIndex;
                    }
                }

                /// link設定
                foreach (var urlRange in urlRanges)
                {
                    var link = new SetLinkCommand(_target, urlRange.Item1, new Link(urlRange.Item2));
                    cmds.Children.Add(link);
                }

                _executor.Execute(cmds);
                CaretIndex = caretIndex;
            }
        }