|  | /* | 
|  | * 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. | 
|  | */ | 
|  |  | 
|  | const cStyleComment = ` | 
|  | /* | 
|  | * 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. | 
|  | */ | 
|  |  | 
|  | `; | 
|  |  | 
|  | const hashComment = ` | 
|  | # 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. | 
|  |  | 
|  | `; | 
|  |  | 
|  | const mlComment = ` | 
|  | <!-- | 
|  | 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. | 
|  | --> | 
|  |  | 
|  | `; | 
|  |  | 
|  | function hasPreamble(fileExt) { | 
|  | return fileExt && preambleMap[fileExt]; | 
|  | } | 
|  |  | 
|  | function addPreamble(fileStr, fileExt) { | 
|  | if (fileStr && fileExt) { | 
|  | const addFn = addFns[fileExt]; | 
|  | const headStr = preambleMap[fileExt]; | 
|  | return addFn && headStr && addFn(headStr, fileStr); | 
|  | } | 
|  | } | 
|  |  | 
|  | const addFns = { | 
|  |  | 
|  | ts: function (headStr, fileStr) { | 
|  | return headStr + fileStr; | 
|  | }, | 
|  |  | 
|  | js: function (headStr, fileStr) { | 
|  | return headStr + fileStr; | 
|  | }, | 
|  |  | 
|  | css: function (headStr, fileStr) { | 
|  | return headStr + fileStr; | 
|  | }, | 
|  |  | 
|  | java: function (headStr, fileStr) { | 
|  | return headStr + fileStr; | 
|  | }, | 
|  |  | 
|  | yml: addShellLikeHeader, | 
|  |  | 
|  | yaml: addShellLikeHeader, | 
|  |  | 
|  | sh: addShellLikeHeader, | 
|  |  | 
|  | html: function (headStr, fileStr) { | 
|  | // Git diff enables manual check. | 
|  | let resultStr = fileStr.replace(/^\s*<!DOCTYPE\s[^<>]+>/i, '$&' + headStr); | 
|  | // If no doctype | 
|  | if (resultStr.length === fileStr.length) { | 
|  | resultStr = headStr + fileStr; | 
|  | } | 
|  | return resultStr; | 
|  | }, | 
|  |  | 
|  | xml: xmlAddFn, | 
|  |  | 
|  | xsl: xmlAddFn | 
|  | }; | 
|  |  | 
|  | function addShellLikeHeader(headStr, fileStr) { | 
|  | // Git diff enables manual check. | 
|  | if (/^#\!/.test(fileStr)) { | 
|  | const lines = fileStr.split('\n'); | 
|  | lines.splice(1, 0, headStr); | 
|  | return lines.join('\n'); | 
|  | } | 
|  | else { | 
|  | return headStr + fileStr; | 
|  | } | 
|  | } | 
|  |  | 
|  | function xmlAddFn(headStr, fileStr) { | 
|  | // Git diff enables manual check. | 
|  | let resultStr = fileStr.replace(/^\s*<\?xml\s[^<>]+\?>/i, '$&' + headStr); | 
|  | // If no <?xml version='1.0' ?> | 
|  | if (resultStr.length === fileStr.length) { | 
|  | resultStr = headStr + fileStr; | 
|  | } | 
|  | return resultStr; | 
|  | } | 
|  |  | 
|  | const preambleMap = { | 
|  | ts: cStyleComment, | 
|  | js: cStyleComment, | 
|  | css: cStyleComment, | 
|  | java: cStyleComment, | 
|  | yml: hashComment, | 
|  | yaml: hashComment, | 
|  | sh: hashComment, | 
|  | html: mlComment, | 
|  | xml: mlComment, | 
|  | xsl: mlComment | 
|  | }; | 
|  |  | 
|  | const licenseReg = [ | 
|  | {name: 'Apache', reg: /apache (license|commons)/i}, | 
|  | {name: 'BSD', reg: /BSD/}, | 
|  | {name: 'LGPL', reg: /LGPL/}, | 
|  | {name: 'GPL', reg: /GPL/}, | 
|  | {name: 'Mozilla', reg: /mozilla public/i}, | 
|  | {name: 'MIT', reg: /mit license/i}, | 
|  | {name: 'BSD-d3', reg: /Copyright\s+\(c\)\s+2010-2015,\s+Michael\s+Bostock/i} | 
|  | ]; | 
|  |  | 
|  | function extractLicense(fileStr, fileExt) { | 
|  | let commentText = extractComment(fileStr.trim(), fileExt); | 
|  | if (!commentText) { | 
|  | return; | 
|  | } | 
|  | for (let i = 0; i < licenseReg.length; i++) { | 
|  | if (licenseReg[i].reg.test(commentText)) { | 
|  | return licenseReg[i].name; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | const cStyleCommentReg = /\/\*[\S\s]*?\*\//; | 
|  | const hashCommentReg = /^\s*#.*$/gm; | 
|  | const mlCommentReg = /<\!\-\-[\S\s]*?\-\->/; | 
|  | const commentReg = { | 
|  | ts: cStyleCommentReg, | 
|  | js: cStyleCommentReg, | 
|  | css: cStyleCommentReg, | 
|  | java: cStyleCommentReg, | 
|  | yml: hashCommentReg, | 
|  | yaml: hashCommentReg, | 
|  | sh: hashCommentReg, | 
|  | html: mlCommentReg, | 
|  | xml: mlCommentReg, | 
|  | xsl: mlCommentReg | 
|  | }; | 
|  |  | 
|  | function extractComment(str, fileExt) { | 
|  | const reg = commentReg[fileExt]; | 
|  |  | 
|  | if (!fileExt || !reg || !str) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | reg.lastIndex = 0; | 
|  |  | 
|  | if (fileExt === 'sh' || fileExt === 'yml' || fileExt === 'yaml') { | 
|  | let result = str.match(reg); | 
|  | return result && result.join('\n'); | 
|  | } | 
|  | else { | 
|  | let result = reg.exec(str); | 
|  | return result && result[0]; | 
|  | } | 
|  | } | 
|  |  | 
|  | module.exports = Object.assign({ | 
|  | extractLicense, | 
|  | hasPreamble, | 
|  | addPreamble | 
|  | }, preambleMap); |