
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8">
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
                background: #262626;
            }
        </style>
        <div id="main"></div>
        <script>
            var chart;
            require([
                'echarts'
            ], function (echarts) {

                chart = echarts.init(document.getElementById('main'));

                var colors = ['#FFAE57', '#FF7853', '#EA5151', '#CC3F57', '#9A2555'];
                var bgColor = '#262626';

                var itemStyle = {
                    star5: {
                        color: colors[0]
                    },
                    star4: {
                        color: colors[1]
                    },
                    star3: {
                        color: colors[2]
                    },
                    star2: {
                        color: colors[3]
                    }
                };

                var data = [{
                    name: '虚构',
                    itemStyle: {
                        normal: {
                            color: colors[1]
                        }
                    },
                    children: [{
                        name: '小说',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '疼'
                            }, {
                                name: '慈悲'
                            }, {
                                name: '楼下的房客'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: '虚无的十字架'
                            }, {
                                name: '无声告白'
                            }, {
                                name: '童年的终结'
                            }]
                        }, {
                            name: '3☆',
                            children: [{
                                name: '疯癫老人日记'
                            }]
                        }]
                    }, {
                        name: '其他',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '纳博科夫短篇小说全集'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: '安魂曲'
                            }, {
                                name: '人生拼图版'
                            }]
                        }, {
                            name: '3☆',
                            children: [{
                                name: '比起爱你，我更需要你'
                            }]
                        }]
                    }]
                }, {
                    name: '非虚构',
                    itemStyle: {
                        color: colors[2]
                    },
                    children: [{
                        name: '设计',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '无界面交互'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: '数字绘图的光照与渲染技术'
                            }, {
                                name: '日本建筑解剖书'
                            }]
                        }, {
                            name: '3☆',
                            children: [{
                                name: '奇幻世界艺术\n&RPG地图绘制讲座'
                            }]
                        }]
                    }, {
                        name: '社科',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '痛点'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: '卓有成效的管理者'
                            }, {
                                name: '进化'
                            }, {
                                name: '后物欲时代的来临',
                            }]
                        }, {
                            name: '3☆',
                            children: [{
                                name: '疯癫与文明'
                            }]
                        }]
                    }, {
                        name: '心理',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '我们时代的神经症人格'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: '皮格马利翁效应'
                            }, {
                                name: '受伤的人'
                            }]
                        }, {
                            name: '3☆',
                        }, {
                            name: '2☆',
                            children: [{
                                name: '迷恋'
                            }]
                        }]
                    }, {
                        name: '居家',
                        children: [{
                            name: '4☆',
                            children: [{
                                name: '把房子住成家'
                            }, {
                                name: '只过必要生活'
                            }, {
                                name: '北欧简约风格'
                            }]
                        }]
                    }, {
                        name: '绘本',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '设计诗'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: '假如生活糊弄了你'
                            }, {
                                name: '博物学家的神秘动物图鉴'
                            }]
                        }, {
                            name: '3☆',
                            children: [{
                                name: '方向'
                            }]
                        }]
                    }, {
                        name: '哲学',
                        children: [{
                            name: '4☆',
                            children: [{
                                name: '人生的智慧'
                            }]
                        }]
                    }, {
                        name: '技术',
                        children: [{
                            name: '5☆',
                            children: [{
                                name: '代码整洁之道'
                            }]
                        }, {
                            name: '4☆',
                            children: [{
                                name: 'Three.js 开发指南'
                            }]
                        }]
                    }]
                }];

                for (var j = 0; j < data.length; ++j) {
                    var level1 = data[j].children;
                    for (var i = 0; i < level1.length; ++i) {
                        var block = level1[i].children;
                        var bookScore = [];
                        var bookScoreId;
                        for (var star = 0; star < block.length; ++star) {
                            var style = (function (name) {
                                switch (name) {
                                    case '5☆':
                                        bookScoreId = 0;
                                        return itemStyle.star5;
                                    case '4☆':
                                        bookScoreId = 1;
                                        return itemStyle.star4;
                                    case '3☆':
                                        bookScoreId = 2;
                                        return itemStyle.star3;
                                    case '2☆':
                                        bookScoreId = 3;
                                        return itemStyle.star2;
                                }
                            })(block[star].name);

                            block[star].label = {
                                color: style.color,
                                downplay: {
                                    opacity: 0.5
                                }
                            };

                            if (block[star].children) {
                                style = {
                                    opacity: 1,
                                    color: style.color
                                };
                                block[star].children.forEach(function (book) {
                                    book.value = 1;
                                    book.itemStyle = style;

                                    book.label = {
                                        color: style.color
                                    };

                                    var value = 1;
                                    if (bookScoreId === 0 || bookScoreId === 3) {
                                        value = 5;
                                    }

                                    if (bookScore[bookScoreId]) {
                                        bookScore[bookScoreId].value += value;
                                    }
                                    else {
                                        bookScore[bookScoreId] = {
                                            color: colors[bookScoreId],
                                            value: value
                                        };
                                    }
                                });
                            }
                        }

                        level1[i].itemStyle = {
                            color: data[j].itemStyle.color
                        };
                    }
                }

                chart.setOption({
                    color: colors,
                    // title: {
                    //     text: '2017 读书记录',
                    //     bottom: 30,
                    //     left: 'center',
                    //     textStyle: {
                    //         color: colors[0]
                    //     }
                    // },
                    series: [{
                        type: 'sunburst',
                        center: ['50%', '48%'],
                        data: data,
                        sort: function (a, b) {
                            if (a.depth === 1) {
                                return b.getValue() - a.getValue();
                            }
                            else {
                                return a.dataIndex - b.dataIndex;
                            }
                        },
                        label: {
                            rotate: 'radial',
                            color: bgColor
                        },
                        itemStyle: {
                            borderColor: bgColor,
                            borderWidth: 2
                        },
                        levels: [{}, {
                            r0: 0,
                            r: 40,
                            label: {
                                rotate: 0
                            }
                        }, {
                            r0: 40,
                            r: 105
                        }, {
                            r0: 115,
                            r: 140,
                            itemStyle: {
                                shadowBlur: 2,
                                shadowColor: colors[2],
                                color: 'transparent'
                            },
                            label: {
                                rotate: 'tangential',
                                fontSize: 10,
                                color: colors[0]
                            }
                        }, {
                            r0: 140,
                            r: 145,
                            itemStyle: {
                                shadowBlur: 80,
                                shadowColor: colors[0]
                            },
                            label: {
                                position: 'outside',
                                textShadowBlur: 5,
                                textShadowColor: '#333',
                                downplay: {
                                    opacity: 0.5
                                }
                            }
                        }]
                    }]
                });
            });
        </script>
    </body>
</html>
