/// <summary>
        /// add new post
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void NewPost(object sender, RoutedEventArgs e)
        {
            // todo : check config
            // there already a temp post
            if (FindTempFile())
            {
                return;
            }

            var current = new PostItemControl(this.inputTbx);

            current.Register((sender, e) =>
            {
                foreach (var control in cacheControls)
                {
                    control.Background = new SolidColorBrush(Color.FromRgb(49, 47, 47));
                    control.Foreground = new SolidColorBrush(Colors.Silver);
                    control.RemoveHandlers();
                }

                current.Background = new SolidColorBrush(Color.FromRgb(199, 80, 73));
                current.Foreground = new SolidColorBrush(Colors.White);
                selectedItem       = current;
                current.ConfigTimer();
            });
            inputTbx.Text =
                $"---{Environment.NewLine}{Environment.NewLine}title: {Environment.NewLine}{Environment.NewLine}date: {DateTime.Now.ToString(TimePattern)}{Environment.NewLine}{Environment.NewLine}tags: {Environment.NewLine}{Environment.NewLine}---{Environment.NewLine}{Environment.NewLine}";
            markdownPreview.Markdown =
                $"---{Environment.NewLine}{Environment.NewLine}title: {Environment.NewLine}{Environment.NewLine}date: {DateTime.Now.ToString(TimePattern)}{Environment.NewLine}{Environment.NewLine}tags: {Environment.NewLine}{Environment.NewLine}---{Environment.NewLine}{Environment.NewLine}";
            current.UpdateCache();
            articleListPanel.Children.Insert(0, current);
            cacheControls.Add(current);
            SelectControl(current);
        }
        /// <summary>
        /// load post or reload posts
        /// </summary>
        private void LoadPosts()
        {
            // make sure directory exists
            GitUtils.MakeDirectory(CommonData.config.PostDirectory);
            // clear selected
            if (selectedItem != null)
            {
                selectedItem.RemoveHandlers();
                selectedItem = null;
            }

            inputTbx.Text = string.Empty;
            articleListPanel.Children.Clear();

            // get markdown files
            var files = Directory.GetFiles(CommonData.config.PostDirectory)
                        .Where(f => f.EndsWith(Suffix));

            var targetBackground = new SolidColorBrush(Color.FromRgb(199, 80, 73));
            var targetForeground = new SolidColorBrush(Colors.White);
            var otherBackground  = new SolidColorBrush(Color.FromRgb(49, 47, 47));
            var otherForeground  = new SolidColorBrush(Colors.Silver);

            // deal with each post
            foreach (var file in files)
            {
                var current = new PostItemControl(file, this.inputTbx);
                current.Register((sender, e) =>
                {
                    foreach (var control in cacheControls)
                    {
                        control.Background = otherBackground;
                        control.Foreground = otherForeground;
                        control.RemoveHandlers();
                    }
                    // current
                    current.Background = targetBackground;
                    current.Foreground = targetForeground;
                    selectedItem       = current;
                    current.ConfigTimer();
                });
                articleListPanel.Children.Add(current);
            }

            // bake in cache
            var array = new PostItemControl[articleListPanel.Children.Count];

            articleListPanel.Children.CopyTo(array, 0);
            // add cache
            cacheControls.Clear();
            cacheControls.AddRange(array);
        }