| /* | 
| * 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); |