11function getData ( url , callback ) {
2- var request = new XMLHttpRequest ( ) ;
3- request . open ( 'GET' , url , true ) ;
2+ var request = new XMLHttpRequest ( )
3+ request . open ( 'GET' , url , true )
44 request . onload = function ( ) {
55 if ( request . status >= 200 && request . status < 400 ) {
6- callback ( request . responseText ) ;
6+ callback ( request . responseText )
77 }
8- } ;
9- request . send ( ) ;
8+ }
9+ request . send ( )
1010}
1111
1212function getJson ( url , callback ) {
13- var request = new XMLHttpRequest ( ) ;
14- request . open ( 'GET' , url , true ) ;
13+ var request = new XMLHttpRequest ( )
14+ request . open ( 'GET' , url , true )
1515 request . onload = function ( ) {
1616 if ( request . status >= 200 && request . status < 400 ) {
17- var data = JSON . parse ( request . responseText ) ;
18- callback ( data ) ;
17+ var data = JSON . parse ( request . responseText )
18+ callback ( data )
1919 }
20- } ;
21- request . send ( ) ;
20+ }
21+ request . send ( )
2222}
2323
2424function getDom ( url , callback ) {
25- var request = new XMLHttpRequest ( ) ;
26- request . open ( 'GET' , url , true ) ;
25+ var request = new XMLHttpRequest ( )
26+ request . open ( 'GET' , url , true )
2727 request . onload = function ( ) {
2828 if ( request . status >= 200 && request . status < 400 ) {
29- var el = document . createElement ( 'html' ) ;
30- el . innerHTML = request . responseText ;
31- callback ( el ) ;
29+ var el = document . createElement ( 'html' )
30+ el . innerHTML = request . responseText
31+ callback ( el )
3232 } else {
3333 // TODO
3434 }
35- } ;
35+ }
3636 request . onerror = function ( ) {
3737 // TODO
38- } ;
39- request . send ( ) ;
38+ }
39+ request . send ( )
4040}
4141
4242function initializeVoting ( token , problemId , votedFlag ) {
4343 var params = {
4444 "token" : token
45- } ;
46- var xhr = new XMLHttpRequest ( ) ;
47- xhr . open ( 'POST' , 'https://api.solved.ac/validate_token.php' , true ) ;
48- xhr . setRequestHeader ( 'Content-type' , 'application/json' ) ;
45+ }
46+ var xhr = new XMLHttpRequest ( )
47+ xhr . open ( 'POST' , 'https://api.solved.ac/validate_token.php' , true )
48+ xhr . setRequestHeader ( 'Content-type' , 'application/json' )
4949 xhr . onload = function ( ) {
5050 if ( this . status == 200 ) {
51- var response = JSON . parse ( this . responseText ) ;
51+ var response = JSON . parse ( this . responseText )
5252 if ( response . success ) {
53- var user = response . user ;
53+ var user = response . user
5454 if ( user . level >= 16 ) {
5555 if ( document . querySelector ( ".label-success" ) ) {
56- const bottom = document . querySelector ( ".col-md-12:nth-child(4)" ) ;
57- const toggleFunction = "var o=document.getElementById('problem_difficulty');if(o.className==='poll_shown'){o.className='poll_hidden';}else{o.className='poll_shown';}" ;
58- var visibleState = "poll_shown" ;
59- if ( votedFlag == true ) visibleState = "poll_hidden" ;
60- bottom . outerHTML += "<div class=\"col-md-12\"><section id=\"problem_difficulty\" class=\"" + visibleState + "\"><div class=\"headline\" onclick=\"" + toggleFunction + "\"><h2>난이도 투표 <small>펼치기/접기</small></h2></div></section></div>" ;
56+ const bottom = document . querySelector ( ".col-md-12:nth-child(4)" )
57+ const toggleFunction = "var o=document.getElementById('problem_difficulty');if(o.className==='poll_shown'){o.className='poll_hidden';}else{o.className='poll_shown';}"
58+ var visibleState = "poll_shown"
59+ if ( votedFlag == true ) visibleState = "poll_hidden"
60+ bottom . outerHTML += "<div class=\"col-md-12\"><section id=\"problem_difficulty\" class=\"" + visibleState + "\"><div class=\"headline\" onclick=\"" + toggleFunction + "\"><h2>난이도 투표 <small>펼치기/접기</small></h2></div></section></div>"
6161
62- const difficultySection = document . getElementById ( "problem_difficulty" ) ;
62+ const difficultySection = document . getElementById ( "problem_difficulty" )
6363 for ( var i = 1 ; i <= 30 ; i ++ ) {
6464 const func = "var params={'token':'" + token + "','id':" + problemId + ",'level':" + i + "};" +
6565 "var o=new XMLHttpRequest;" +
6666 "o.open('POST','https://api.solved.ac/vote_difficulty.php',!0)," +
6767 "o.onload=function(){if(o.status>=200&&o.status<400){location.reload()}else{alert(JSON.parse(o.responseText).error)}}," +
68- "o.send(JSON.stringify(params))" ;
69- difficultySection . innerHTML += "<span onclick=\"" + func + "\">" + levelLabel ( i ) + "</a>" ;
70- if ( i % 5 == 0 ) difficultySection . innerHTML += "<br>" ;
68+ "o.send(JSON.stringify(params))"
69+ difficultySection . innerHTML += "<span onclick=\"" + func + "\">" + levelLabel ( i ) + "</a>"
70+ if ( i % 5 == 0 ) difficultySection . innerHTML += "<br>"
7171 }
72- difficultySection . innerHTML += "<br>" ;
72+ difficultySection . innerHTML += "<br>"
7373 }
7474 }
7575 }
7676 }
77- } ;
78- xhr . send ( JSON . stringify ( params ) ) ;
77+ }
78+ xhr . send ( JSON . stringify ( params ) )
7979}
8080
8181function formatPercentage ( x ) {
8282 if ( x > 100 ) {
83- return "100.0" ;
83+ return "100.0"
8484 } else if ( x > 20 ) {
85- return x . toFixed ( 1 ) ;
85+ return x . toFixed ( 1 )
8686 } else if ( x > 2 ) {
87- return x . toFixed ( 2 ) ;
87+ return x . toFixed ( 2 )
8888 } else if ( x > 0.2 ) {
89- return x . toFixed ( 3 ) ;
89+ return x . toFixed ( 3 )
9090 } else if ( x > 0.02 ) {
91- return x . toFixed ( 4 ) ;
91+ return x . toFixed ( 4 )
9292 } else if ( x > 0.002 ) {
93- return x . toFixed ( 5 ) ;
93+ return x . toFixed ( 5 )
9494 } else {
95- return x . toFixed ( 6 ) ;
95+ return x . toFixed ( 6 )
9696 }
9797}
9898
9999function levelName ( level ) {
100- const prefix = [ 'Bronze' , 'Silver' , 'Gold' , 'Platinum' , 'Diamond' , 'Ruby' ] ;
101- const roman = [ 'I' , 'II' , 'III' , 'IV' , 'V' ] ;
100+ const prefix = [ 'Bronze' , 'Silver' , 'Gold' , 'Platinum' , 'Diamond' , 'Ruby' ]
101+ const roman = [ 'I' , 'II' , 'III' , 'IV' , 'V' ]
102102
103- return prefix [ Math . floor ( ( level - 1 ) / 5 ) ] + ' ' + roman [ 4 - ( level - 1 ) % 5 ] ;
103+ return prefix [ Math . floor ( ( level - 1 ) / 5 ) ] + ' ' + roman [ 4 - ( level - 1 ) % 5 ]
104104}
105105
106106function levelShortDisplayName ( level ) {
107- const prefix = [ 'B' , 'S' , 'G' , 'P' , 'D' , 'R' ] ;
108- const roman = [ 'I' , 'II' , 'III' , 'IV' , 'V' ] ;
107+ const prefix = [ 'B' , 'S' , 'G' , 'P' , 'D' , 'R' ]
108+ const roman = [ 'I' , 'II' , 'III' , 'IV' , 'V' ]
109109
110- return '<b>' + prefix [ Math . floor ( ( level - 1 ) / 5 ) ] + '</b> ' + roman [ 4 - ( level - 1 ) % 5 ] ;
110+ return '<b>' + prefix [ Math . floor ( ( level - 1 ) / 5 ) ] + '</b> ' + roman [ 4 - ( level - 1 ) % 5 ]
111111}
112112
113113function levelCssClass ( level ) {
114- const prefix = [ 'bronze' , 'silver' , 'gold' , 'platinum' , 'diamond' , 'ruby' ] ;
114+ const prefix = [ 'bronze' , 'silver' , 'gold' , 'platinum' , 'diamond' , 'ruby' ]
115115
116- return prefix [ Math . floor ( ( level - 1 ) / 5 ) ] ;
116+ return prefix [ Math . floor ( ( level - 1 ) / 5 ) ]
117117}
118118
119119function levelText ( level ) {
120- if ( level == 0 ) return "<span>Unranked</span>" ;
121- return "<span class=\"text-" + levelCssClass ( level ) + "\">" + levelName ( level ) + "</span>" ;
120+ if ( level == 0 ) return "<span>Unranked</span>"
121+ return "<span class=\"text-" + levelCssClass ( level ) + "\">" + levelName ( level ) + "</span>"
122122}
123123
124124function kudekiLevelText ( level ) {
125- const roman = [ 'I' , 'II' , 'III' , 'IV' , 'V' , 'VI' , 'VII' ] ;
126- return "<span class=\"text-kudeki\">Kudeki " + roman [ level - 1 ] + "</span>" ;
125+ const roman = [ 'I' , 'II' , 'III' , 'IV' , 'V' , 'VI' , 'VII' ]
126+ return "<span class=\"text-kudeki\">Kudeki " + roman [ level - 1 ] + "</span>"
127+ }
128+
129+ function levelLabelUnlisted ( ) {
130+ return "<span class=\"level_hidden\">00"
131+ + "</span><img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome . extension . getURL ( "svg/unlisted.svg" ) + "\">"
127132}
128133
129134function levelLabel ( level ) {
130- if ( level == - 1 ) level = 0 ;
135+ if ( level === null ) return levelLabelUnlisted ( )
136+ if ( level == - 1 ) level = 0
131137 return "<span class=\"level_hidden\">" + ( '0' + level ) . slice ( - 2 )
132- + "</span><img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome . extension . getURL ( "svg/" + level + ".svg" ) + "\">" ;
138+ + "</span><img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome . extension . getURL ( "svg/" + level + ".svg" ) + "\">"
133139}
134140
135141function kudekiLevelLabel ( level ) {
136- return "<img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome . extension . getURL ( "svg/ka" + level + ".svg" ) + "\">" ;
142+ return "<img class=\"level_badge small\" style=\"width: 1.1em;height: 1.4em;\" src=\"" + chrome . extension . getURL ( "svg/ka" + level + ".svg" ) + "\">"
137143}
138144
139145if ( document . getElementById ( "problem-body" ) || document . getElementById ( "chart_div" ) ) {
140- const problemId = document . querySelector ( "ul.problem-menu li a" ) . innerText . replace ( / [ ^ 0 - 9 . ] / g, "" ) ;
146+ const problemId = document . querySelector ( "ul.problem-menu li a" ) . innerText . replace ( / [ ^ 0 - 9 . ] / g, "" )
147+ const problemInfo = document . querySelector ( "div.page-header" )
148+
141149 getJson ( "https://api.solved.ac/problem_level.php?id=" + problemId , function ( levelData ) {
142- if ( levelData . level == null ) return ;
150+ if ( levelData . level == null ) {
151+ var description = document . createElement ( "span" )
152+ description . innerText = "아직 solved.ac 데이터베이스에 등록되지 않은 문제입니다. 내일 오전 6시부터 난이도 의견 제출이 가능합니다."
153+ problemInfo . appendChild ( description )
154+ return
155+ }
143156 getJson ( "https://api.solved.ac/question_level_votes.php?id=" + problemId , function ( difficultyVotes ) {
144- const nick = document . querySelector ( "ul.loginbar li:first-child a" ) . innerText . trim ( ) ;
145- var votedFlag = false ;
146-
147- const problemInfo = document . querySelector ( "div.page-header" ) ;
157+ const nick = document . querySelector ( "ul.loginbar li:first-child a" ) . innerText . trim ( )
158+ var votedFlag = false
148159
149- var titleBadge = document . createElement ( "span" ) ;
150- titleBadge . className = "title_badge" ;
151- titleBadge . innerHTML = levelLabel ( levelData . level ) + " " + levelText ( levelData . level ) ;
152- problemInfo . appendChild ( titleBadge ) ;
160+ var titleBadge = document . createElement ( "span" )
161+ titleBadge . className = "title_badge"
162+ titleBadge . innerHTML = levelLabel ( levelData . level ) + " " + levelText ( levelData . level )
163+ problemInfo . appendChild ( titleBadge )
153164
154165 if ( levelData . kudeki_level ) {
155- var titleBadge = document . createElement ( "span" ) ;
156- titleBadge . className = "title_badge" ;
157- titleBadge . innerHTML = " / " + kudekiLevelLabel ( levelData . kudeki_level ) + " " + kudekiLevelText ( levelData . kudeki_level ) ;
158- problemInfo . appendChild ( titleBadge ) ;
166+ var titleBadge = document . createElement ( "span" )
167+ titleBadge . className = "title_badge"
168+ titleBadge . innerHTML = " / " + kudekiLevelLabel ( levelData . kudeki_level ) + " " + kudekiLevelText ( levelData . kudeki_level )
169+ problemInfo . appendChild ( titleBadge )
159170 }
160171
161172 if ( levelData . level != 0 ) {
162- problemInfo . appendChild ( document . createElement ( "br" ) ) ;
163- problemInfo . appendChild ( document . createElement ( "br" ) ) ;
164- var difficultyVotesHeader = document . createElement ( "b" ) ;
165- difficultyVotesHeader . innerText = "난이도 의견" ;
166- problemInfo . appendChild ( difficultyVotesHeader ) ;
167- problemInfo . appendChild ( document . createElement ( "br" ) ) ;
173+ problemInfo . appendChild ( document . createElement ( "br" ) )
174+ problemInfo . appendChild ( document . createElement ( "br" ) )
175+ var difficultyVotesHeader = document . createElement ( "b" )
176+ difficultyVotesHeader . innerText = "난이도 의견"
177+ problemInfo . appendChild ( difficultyVotesHeader )
178+ problemInfo . appendChild ( document . createElement ( "br" ) )
168179
169180 for ( var i = 0 ; i < difficultyVotes . length ; i ++ ) {
170- var vote = difficultyVotes [ i ] ;
171- if ( vote . user_id === nick ) votedFlag = true ;
181+ var vote = difficultyVotes [ i ]
182+ if ( vote . user_id === nick ) votedFlag = true
172183
173- var difficultyVote = document . createElement ( "span" ) ;
174- difficultyVote . className = "difficulty_vote" ;
175- difficultyVote . innerHTML = "<span class=\"text-" + levelCssClass ( vote . user_level ) + "\">" + levelLabel ( vote . user_level ) + vote . user_id + "</span> ➔ " + levelLabel ( vote . voted_level ) ;
176- problemInfo . appendChild ( difficultyVote ) ;
184+ var difficultyVote = document . createElement ( "span" )
185+ difficultyVote . className = "difficulty_vote"
186+ difficultyVote . innerHTML = "<span class=\"text-" + levelCssClass ( vote . user_level ) + "\">" + levelLabel ( vote . user_level ) + vote . user_id + "</span> ➔ " + levelLabel ( vote . voted_level )
187+ problemInfo . appendChild ( difficultyVote )
177188 }
178189 }
179190
180191 chrome . storage . local . get ( 'token' , function ( items ) {
181- initializeVoting ( items . token , problemId , votedFlag ) ;
182- } ) ;
183- } ) ;
184- } ) ;
192+ initializeVoting ( items . token , problemId , votedFlag )
193+ } )
194+ } )
195+ } )
185196} else {
186197 var pattern = / ^ [ / ] p r o b l e m [ / ] [ 0 - 9 ] + $ / i
187- var problemLinks = document . getElementsByTagName ( "a" ) ;
188- problemLinks = [ ] . slice . call ( problemLinks , 0 ) ;
198+ var problemLinks = document . getElementsByTagName ( "a" )
199+ problemLinks = [ ] . slice . call ( problemLinks , 0 )
189200 problemLinks
190201 . filter ( function ( item ) {
191202 return item . getAttribute ( "href" ) && pattern . test ( item . getAttribute ( "href" ) )
192203 } )
193204 . forEach ( function ( item , index ) {
194- const problemId = item . getAttribute ( "href" ) . split ( "/" ) [ 2 ] ;
205+ const problemId = item . getAttribute ( "href" ) . split ( "/" ) [ 2 ]
195206
196207 getJson ( "https://api.solved.ac/problem_level.php?id=" + problemId , function ( levelData ) {
197208 if ( levelData . kudeki_level ) {
198- item . insertAdjacentHTML ( 'afterbegin' , kudekiLevelLabel ( levelData . kudeki_level ) ) ;
209+ item . insertAdjacentHTML ( 'afterbegin' , kudekiLevelLabel ( levelData . kudeki_level ) )
199210 }
200- item . insertAdjacentHTML ( 'afterbegin' , levelLabel ( levelData . level ) ) ;
201- } ) ;
211+ item . insertAdjacentHTML ( 'afterbegin' , levelLabel ( levelData . level ) )
212+ } )
202213 } )
203214}
204215
205- $ ( '.dropdown-toggle' ) . dropdown ( ) ;
216+ $ ( '.dropdown-toggle' ) . dropdown ( )
0 commit comments