From: Stas Vilchik Date: Tue, 29 Apr 2014 11:51:47 +0000 (+0600) Subject: Component Viewer: blocks X-Git-Tag: 4.4-RC1~1350 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=569c13f5721ff8b0dbaf2597141a002a0eeebab1;p=sonarqube.git Component Viewer: blocks --- diff --git a/sonar-server/src/main/coffee/component-viewer/main.coffee b/sonar-server/src/main/coffee/component-viewer/main.coffee index 0f540618849..05d2b035df8 100644 --- a/sonar-server/src/main/coffee/component-viewer/main.coffee +++ b/sonar-server/src/main/coffee/component-viewer/main.coffee @@ -13,7 +13,7 @@ define [ ) -> $ = jQuery - API_SOURCES = "#{baseUrl}/api/sources" + API_SOURCES = "#{baseUrl}/api/sources/show" API_RESOURCES = "#{baseUrl}/api/resources" SOURCE_METRIC_LIST = 'lines,ncloc,functions,accessors,classes,statements,complexity,function_complexity,' + @@ -54,7 +54,7 @@ define [ @settings = new Backbone.Model issues: false coverage: false - duplications: true + duplications: false scm: false workspace: false @@ -86,8 +86,8 @@ define [ requestSource: (key) -> - $.get API_SOURCES, resource: key, (data) => - @source.set source: data[0] + $.get API_SOURCES, key: key, (data) => + @source.set source: data.source extractCoverage: (data) -> @@ -119,7 +119,6 @@ define [ { from: 62, count: 33 } ] duplicationsMeasures = _.sortBy data[0].msr, (item) -> -(item.key == 'duplicated_lines_density') - console.log data @component.set 'duplicationsMeasures', duplicationsMeasures diff --git a/sonar-server/src/main/coffee/component-viewer/source.coffee b/sonar-server/src/main/coffee/component-viewer/source.coffee index e54ec45efd8..e65396b7a77 100644 --- a/sonar-server/src/main/coffee/component-viewer/source.coffee +++ b/sonar-server/src/main/coffee/component-viewer/source.coffee @@ -20,6 +20,12 @@ define [ class SourceView extends Marionette.ItemView template: Templates['source'] + expandTemplate: Templates['code-expand'] + + LINES_AROUND_ISSUE = 4 + LINES_AROUND_COVERAGE = 4 + LINES_AROUND_DUPLICATION = 4 + EXPAND_LINES = 20 events: @@ -34,19 +40,46 @@ define [ 'mouseenter .duplication-exists': 'duplicationMouseEnter' 'mouseleave .duplication-exists': 'duplicationMouseLeave' + 'click .js-expand': 'expandBlock' + + + initialize: -> + super + @showBlocks = [] + onRender: -> @delegateEvents() @showSettings = false - + @renderExpandButtons() @renderIssues() if @options.main.settings.get('issues') && @model.has('issues') + renderExpandButtons: -> + rows = @$('.row[data-line-number]') + rows.get().forEach (row) => + line = $(row).data 'line-number' + linePrev = $(row).prev('[data-line-number]').data 'line-number' + if line? && linePrev? && (linePrev + 1) < line + expand = @expandTemplate from: linePrev, to: line, settings: @options.main.settings.toJSON() + $(expand).insertBefore $(row) + + lines = _.size @model.get 'source' + lastShown = rows.last().data('line-number') + if lastShown < lines + expand = @expandTemplate from: lastShown, to: lines, settings: @options.main.settings.toJSON() + $(expand).insertAfter rows.last() + + @delegateEvents() + + renderIssues: -> issues = @model.get 'issues' issues.forEach (issue) => line = issue.line || 0 - container = @$("[data-line-number=#{line}]").children('.line') + row = @$("[data-line-number=#{line}]") + row.removeClass 'row-hidden' + container = row.children('.line') container.addClass 'issue' if line > 0 issueView = new IssueView model: new Issue issue issueView.render().$el.appendTo container @@ -66,12 +99,14 @@ define [ toggleCoverage: (e) -> + @showBlocks = [] active = $(e.currentTarget).is ':checked' @showSettings = true if active then @options.main.showCoverage() else @options.main.hideCoverage() toggleDuplications: (e) -> + @showBlocks = [] active = $(e.currentTarget).is ':checked' @showSettings = true if active then @options.main.showDuplications() else @options.main.hideDuplications() @@ -116,42 +151,96 @@ define [ $(".duplication", @).eq(index).filter('.duplication-exists').toggleClass 'duplication-hover', add - prepareSource: -> - source = @model.get 'source' + expandBlock: (e) -> + linesFrom = $(e.currentTarget).data 'from' + linesTo = $(e.currentTarget).data 'to' + if linesTo == _.size @model.get 'source' + if linesTo - linesFrom > EXPAND_LINES + linesTo = linesFrom + EXPAND_LINES + if linesFrom == 0 && linesTo > EXPAND_LINES + linesFrom = linesTo - EXPAND_LINES + @showBlocks.push from: linesFrom, to: linesTo + @render() + + + + getLineCoverage: (line) -> coverage = @model.get 'coverage' + + lineCoverage = coverage? && coverage[line]? && coverage[line] + lineCoverage = +lineCoverage if _.isString lineCoverage + + lineCoverageStatus = null + if _.isNumber lineCoverage + lineCoverageStatus = 'red' if lineCoverage == 0 + lineCoverageStatus = 'green' if lineCoverage > 0 + + coverage: lineCoverage + coverageStatus: lineCoverageStatus + + + getLineCoverageConditions: (line) -> coverageConditions = @model.get 'coverageConditions' conditions = @model.get 'conditions' + + lineCoverageConditions = coverageConditions? && coverageConditions[line]? && coverageConditions[line] + lineCoverageConditions = +lineCoverageConditions if _.isString lineCoverageConditions + lineConditions = conditions? && conditions[line]? && conditions[line] + lineConditions = +lineConditions if _.isString lineConditions + + lineCoverageConditionsStatus = null + if _.isNumber(lineCoverageConditions) && _.isNumber(conditions) + lineCoverageConditionsStatus = 'red' if lineCoverageConditions == 0 + lineCoverageConditionsStatus = 'orange' if lineCoverageConditions > 0 && lineCoverageConditions < lineConditions + lineCoverageConditionsStatus = 'green' if lineCoverageConditions == lineConditions + + coverageConditions: lineCoverageConditions + conditions: lineConditions + coverageConditionsStatus: lineCoverageConditionsStatus + + + getLineDuplications: (line) -> duplications = @model.get('duplications') || [] - _.map source, (code, line) -> - lineCoverage = coverage? && coverage[line]? && coverage[line] - lineCoverage = +lineCoverage if _.isString lineCoverage - lineCoverageConditions = coverageConditions? && coverageConditions[line]? && coverageConditions[line] - lineCoverageConditions = +lineCoverageConditions if _.isString lineCoverageConditions - lineConditions = conditions? && conditions[line]? && conditions[line] - lineConditions = +lineConditions if _.isString lineConditions - - lineCoverageStatus = null - if _.isNumber lineCoverage - lineCoverageStatus = 'red' if lineCoverage == 0 - lineCoverageStatus = 'green' if lineCoverage > 0 - - lineCoverageConditionsStatus = null - if _.isNumber(lineCoverageConditions) && _.isNumber(conditions) - lineCoverageConditionsStatus = 'red' if lineCoverageConditions == 0 - lineCoverageConditionsStatus = 'orange' if lineCoverageConditions > 0 && lineCoverageConditions < lineConditions - lineCoverageConditionsStatus = 'green' if lineCoverageConditions == lineConditions - - lineDuplications = duplications.map (d) -> - d.from <= line && (d.from + d.count) > line - - lineNumber: line - code: code - coverage: lineCoverage - coverageStatus: lineCoverageStatus - coverageConditions: lineCoverageConditions - conditions: lineConditions - coverageConditionsStatus: lineCoverageConditionsStatus || lineCoverageStatus - duplications: lineDuplications + lineDuplications = duplications.map (d) -> + d.from <= line && (d.from + d.count) > line + + duplications: lineDuplications + + + augmentWithShow: (sourceLine) -> + show = false + line = sourceLine.lineNumber + + @showBlocks.forEach (block) -> + if block.from <= line && block.to >= line + show = true + + if @options.main.settings.get('issues') && !show + @model.get('issues')?.forEach (issue) -> + if issue.line? + if (issue.line - LINES_AROUND_ISSUE) <= line && (issue.line + LINES_AROUND_ISSUE) >= line + show = true + + if @options.main.settings.get('coverage') && !show + show = true if sourceLine.coverageStatus + + if @options.main.settings.get('duplications') && !show + sourceLine.duplications.forEach (d) -> + show = true if d + + _.extend sourceLine, show: show + + + prepareSource: -> + source = @model.get 'source' + _.map source, (code, line) => + base = lineNumber: line, code: code + if @options.main.settings.get('coverage') + _.extend base, @getLineCoverage(line), @getLineCoverageConditions(line) + if @options.main.settings.get('duplications') + _.extend base, @getLineDuplications(line) + @augmentWithShow base + serializeData: -> diff --git a/sonar-server/src/main/hbs/component-viewer/code-expand.hbs b/sonar-server/src/main/hbs/component-viewer/code-expand.hbs new file mode 100644 index 00000000000..837830a67b4 --- /dev/null +++ b/sonar-server/src/main/hbs/component-viewer/code-expand.hbs @@ -0,0 +1,13 @@ + + {{#if settings.coverage}} + + + {{/if}} + {{#if settings.duplications}} + + {{/if}} + + + + + \ No newline at end of file diff --git a/sonar-server/src/main/hbs/component-viewer/source.hbs b/sonar-server/src/main/hbs/component-viewer/source.hbs index ba11ec0cf52..b5cba8fe256 100644 --- a/sonar-server/src/main/hbs/component-viewer/source.hbs +++ b/sonar-server/src/main/hbs/component-viewer/source.hbs @@ -1,4 +1,4 @@ - +
{{#if settings.coverage}} @@ -116,7 +116,7 @@ - + {{#if settings.coverage}} @@ -129,39 +129,41 @@ {{#each source}} - + {{#if show}} + - {{#if ../settings.coverage}} - + {{#if ../../settings.coverage}} + - - {{/if}} + + {{/if}} - {{#if ../settings.duplications}} - - {{/if}} + {{#if ../../settings.duplications}} + + {{/if}} - + - - + + + {{/if}} {{/each}}
- {{#if coverage}} - {{coverage}} - {{/if}} - + {{#if coverage}} + {{coverage}} + {{/if}} + - {{#if coverageConditions}} - {{#if conditions}} - - {{coverageConditions}}/{{conditions}} - + + {{#if coverageConditions}} + {{#if conditions}} + + {{coverageConditions}}/{{conditions}} + + {{/if}} {{/if}} - {{/if}} - - {{#each duplications}} - - {{/each}} - + {{#each duplications}} + + {{/each}} + {{lineNumber}}{{lineNumber}}
{{{code}}}
{{{code}}}
\ No newline at end of file diff --git a/sonar-server/src/main/less/component-viewer-source-colorizer.less b/sonar-server/src/main/less/component-viewer-source-colorizer.less new file mode 100644 index 00000000000..182bb8b3623 --- /dev/null +++ b/sonar-server/src/main/less/component-viewer-source-colorizer.less @@ -0,0 +1,64 @@ +@import 'variables'; + +.component-viewer-source { + + .code pre { + padding: 0; + font-family: 'Source Code Pro', monospace; + font-size: 12px; + line-height: 17px; + } + + /* for example java annotations */ + .code .a { + color: #808000; + } + /* constants */ + .code .c { + color: #660E80; + font-style: italic; + } + /* javadoc */ + .code .j { + color: #cfcbcb; + font-style: normal; + } + /* classic comment */ + .code .cd { + color: #cfcbcb; + font-style: italic; + } + /* C++ doc */ + .code .cppd { + color: #666666; + font-style: italic; + } + /* keyword */ + .code .k { + color: @darkBlue; + font-weight: normal; + } + /* string */ + .code .s { + color: darken(@red, 10%); + font-weight: normal; + } + /* keyword light*/ + .code .h { + color: #de4150; + } + /* preprocessing directive */ + .code .p { + color: #347235; + font-weight: normal; + } + .sym { + color: darken(@green, 10%); + cursor: pointer; + } + .highlighted { + background-color: #B3D4FF; + } + + +} \ No newline at end of file diff --git a/sonar-server/src/main/less/component-viewer.less b/sonar-server/src/main/less/component-viewer.less index 7f2f9979911..4bab7111525 100644 --- a/sonar-server/src/main/less/component-viewer.less +++ b/sonar-server/src/main/less/component-viewer.less @@ -70,11 +70,12 @@ .component-viewer-source { - .sources2 { + .code { + width: 100%; border-left: 1px solid @barBorderColor; } - .sources2 th { + .code th { height: 30px; .box-sizing(border-box); @@ -104,17 +105,13 @@ } } - .sources2 td.line { + .code td.line { + width: 100%; padding: 1px 5px; - - pre { - padding: 0; - font-family: 'inconsolata', monospace; - font-size: 13px; - } } - .sources2 .stat { + .code .stat { + vertical-align: top; min-width: 12px; padding: 1px 5px; border-left: 1px solid @barBorderColor; @@ -122,22 +119,23 @@ background-color: @barBackgroundColor; color: #888; font-size: 11px; + line-height: 17px; text-align: right; cursor: default; white-space: nowrap; } - .sources2 .lid { + .code .lid { min-width: 18px; padding-left: 10px; padding-right: 10px; } - .sources2 .coverage-tests { + .code .coverage-tests { cursor: pointer; } - .sources2 .duplications { + .code .duplications { padding-top: 0; padding-bottom: 0; font-size: 0; @@ -161,18 +159,22 @@ } } - .sources2 .measures { + .code .measures { padding: 4px 5px; border-left: 1px solid @barBorderColor; border-bottom: 1px solid @barBorderColor; background-color: @barBackgroundColor; } - .sources2 .issue pre { - background-color: #ff9090; + .code .issue pre { + display: inline-block; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAGCAYAAAAPDoR2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1M0M2Rjk4M0M3QUYxMUUzODkzRUREMUM5OTNDMjY4QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1M0M2Rjk4NEM3QUYxMUUzODkzRUREMUM5OTNDMjY4QSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjUzQzZGOTgxQzdBRjExRTM4OTNFREQxQzk5M0MyNjhBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjUzQzZGOTgyQzdBRjExRTM4OTNFREQxQzk5M0MyNjhBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+bcqJtQAAAEhJREFUeNpi+G+swwDGDAwgbAWlwZiJAQFCgfgwEIfDRaC67ID4NRDnQ2kQnwFZwgFqnANMAQOUYY9sF0wBiCGH5CBkrAgQYACuWi4sSGW8yAAAAABJRU5ErkJggg==); + background-repeat: repeat-x; + background-size: 4px; + background-position: bottom; } - .sources2 .row { + .code .row { &.coverage-green td.stat { background-color: lighten(@green, 15%); @@ -191,6 +193,17 @@ } } + .code .row-expand { + + .stat, .line { + border-left: none; + border-right: none; + background: url(../images/gray-stripes.png) repeat; + } + } + + .code .row-hidden { display: none; } + } @@ -328,23 +341,10 @@ } -@font-face { - font-family: 'inconsolata-bold'; - src: url('../fonts/inconsolata-bold-webfont.woff') format('woff'), - url('../fonts/inconsolata-bold-webfont.svg#inconsolatabold') format('svg'); - font-weight: normal; - font-style: normal; - -} - - - @font-face { - font-family: 'inconsolata'; - src: url('../fonts/inconsolata-regular-webfont.woff') format('woff'), - url('../fonts/inconsolata-regular-webfont.svg#inconsolataregular') format('svg'); + font-family: 'Source Code Pro'; + src: url('../fonts/sourcecodepro-regular.woff') format('woff'); font-weight: normal; font-style: normal; - } \ No newline at end of file diff --git a/sonar-server/src/main/less/icons.less b/sonar-server/src/main/less/icons.less index f599f328130..23aea4b2974 100644 --- a/sonar-server/src/main/less/icons.less +++ b/sonar-server/src/main/less/icons.less @@ -3,8 +3,7 @@ @font-face { font-family: 'sonar'; - src: url('../fonts/sonar.woff') format('woff'), - url('../fonts/sonar.svg#sonar') format('svg'); + src: url('../fonts/sonar.woff') format('woff'); font-weight: normal; font-style: normal; } @@ -412,13 +411,9 @@ a[class^="icon-"], a[class*=" icon-"] { color: @darkGrey; font-size: @iconFontSize; } -.icon-coverage:before { - content: "\f091"; - font-size: @iconSmallFontSize; -} -.icon-duplications:before { - content: "\f0c5"; - font-size: @iconSmallFontSize; +.icon-expand:before { + content: "\e60b"; + font-size: @iconFontSize; } diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.eot b/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.eot deleted file mode 100755 index da21f2ff657..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.eot and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.svg b/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.svg deleted file mode 100755 index f338af43d5a..00000000000 --- a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.ttf b/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.ttf deleted file mode 100755 index 4eff562aeec..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.ttf and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.woff b/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.woff deleted file mode 100755 index 9d54523d93b..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/inconsolata-bold-webfont.woff and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.eot b/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.eot deleted file mode 100755 index df6e264322b..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.eot and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.svg b/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.svg deleted file mode 100755 index cb0fa46d45c..00000000000 --- a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.ttf b/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.ttf deleted file mode 100755 index 587638a9588..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.ttf and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.woff b/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.woff deleted file mode 100755 index c838c3486fc..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/inconsolata-regular-webfont.woff and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/sonar.eot b/sonar-server/src/main/webapp/fonts/sonar.eot deleted file mode 100755 index 0ac2e08c0dc..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/sonar.eot and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/sonar.svg b/sonar-server/src/main/webapp/fonts/sonar.svg deleted file mode 100755 index a0159d70fe4..00000000000 --- a/sonar-server/src/main/webapp/fonts/sonar.svg +++ /dev/null @@ -1,68 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/sonar-server/src/main/webapp/fonts/sonar.ttf b/sonar-server/src/main/webapp/fonts/sonar.ttf deleted file mode 100755 index cca0a5f69b2..00000000000 Binary files a/sonar-server/src/main/webapp/fonts/sonar.ttf and /dev/null differ diff --git a/sonar-server/src/main/webapp/fonts/sonar.woff b/sonar-server/src/main/webapp/fonts/sonar.woff index 2f3a11d0bb9..b8a67891a7a 100755 Binary files a/sonar-server/src/main/webapp/fonts/sonar.woff and b/sonar-server/src/main/webapp/fonts/sonar.woff differ diff --git a/sonar-server/src/main/webapp/fonts/sourcecodepro-regular.woff b/sonar-server/src/main/webapp/fonts/sourcecodepro-regular.woff new file mode 100755 index 00000000000..23d72d234f9 Binary files /dev/null and b/sonar-server/src/main/webapp/fonts/sourcecodepro-regular.woff differ