Class: Store

Inherits:
Object
  • Object
show all
Defined in:
lib/store.rb

Instance Method Summary collapse

Constructor Details

#initialize(files) ⇒ Store

Returns a new instance of Store.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/store.rb', line 7

def initialize(files)
    #直接子级的key
    @children_key = '__children__'
    #所有后代的key
    @posterity_key = '__posterity__'
    #所有文章
    @article = Article.new

    @data = {
        #所有文章列表
        'articles' => self.get_articles(files),
        #目录树
        'tree' => {
            @children_key => Array.new
        }
    }

    self.make_tree_index
    self.sort @data['tree']
end

Instance Method Details

#articlesObject



32
33
34
# File 'lib/store.rb', line 32

def articles
    @data['articles']
end

#get_articles(files) ⇒ Object

获取所有的文章列表以hash的方式保存, key即是文件路径的md5值



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/store.rb', line 47

def get_articles(files)
    result = Hash.new

    files.each { | file |
        article = @article.convert(file)
        key = article['relative_path_md5']
        result[key] = article;
    }

    result
end

#get_children(node = @data['tree']) ⇒ Object

从节点数据中, 获取items



37
38
39
# File 'lib/store.rb', line 37

def get_children(node = @data['tree'])
    node[@children_key]
end

#is_children_key(key) ⇒ Object



41
42
43
# File 'lib/store.rb', line 41

def is_children_key(key)
    key == @children_key
end

#make_tree_indexObject

创建树状结构的索引



60
61
62
63
64
65
66
67
# File 'lib/store.rb', line 60

def make_tree_index
    this = self
    @data['articles'].each{ |key, article|
        dir = File::dirname(article['relative_path'])
        relative_path_md5 = article['relative_path_md5']
        this.mount_node_to_tree dir, relative_path_md5
    }
end

#mount_node_to_tree(path, relative_path_md5) ⇒ Object

挂到节点上, 如果不在则创建



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/store.rb', line 70

def mount_node_to_tree(path, relative_path_md5)
    node = @data['tree']

    if path == '.'
        node[@children_key].push relative_path_md5
        return
    end

    path.split('/').each{ |segment|
        current_node = node[segment]
        if not current_node
            current_node = Hash.new()
            current_node[@children_key] = Array.new
            node[segment] = current_node
        end

        node = current_node
        node[@children_key].push relative_path_md5

        #所有的子级,都要向root插入数据
        @data['tree'][@children_key].push relative_path_md5
    }
end

#sort(node) ⇒ Object

给所有的文件夹排序



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/store.rb', line 96

def sort(node)
    this = self
    node.each { | key, current |
        #items, 需要进行排序
        if key == @children_key
            #根据文章的最后修改日期进行排序
            current.sort! {|left, right|
                left_article = @data['articles'][left]
                right_article = @data['articles'][right]
                right_article['mtime'] <=> left_article['mtime']
            }
        else
            #递归调用进行排序
            this.sort(current)
        end
    }
end

#treeObject



28
29
30
# File 'lib/store.rb', line 28

def tree
    @data['tree']
end