123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- 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.
- */
- 'use strict';
-
- const fs = require('fs-extra');
- const CordovaError = require('cordova-common').CordovaError;
-
- function BridgingHeader (bridgingHeaderPath) {
- this.path = bridgingHeaderPath;
- this.bridgingHeaders = null;
- if (!fs.existsSync(this.path)) {
- throw new CordovaError('BridgingHeader.h is not found.');
- }
- this.bridgingHeaders = this.__parseForBridgingHeader(fs.readFileSync(this.path, 'utf8'));
- }
-
- BridgingHeader.prototype.addHeader = function (plugin_id, header_path) {
- this.bridgingHeaders.push({ type: 'code', code: `#import "${header_path}"\n` });
- };
-
- BridgingHeader.prototype.removeHeader = function (plugin_id, header_path) {
- this.bridgingHeaders = this.bridgingHeaders.filter(function (line) {
- if (this.found) {
- return true;
- }
- if (line.type === 'code') {
- const re = new RegExp(`#import\\s+"${preg_quote(header_path)}"(\\s*|\\s.+)(\\n|$)`);
- if (re.test(line.code)) {
- this.found = true;
- return false;
- }
- }
- return true;
- }, { found: false });
- };
-
- BridgingHeader.prototype.write = function () {
- const text = this.__stringifyForBridgingHeader(this.bridgingHeaders);
- fs.writeFileSync(this.path, text, 'utf8');
- };
-
- BridgingHeader.prototype.__stringifyForBridgingHeader = function (bridgingHeaders) {
- return bridgingHeaders.map(obj => obj.code).join('');
- };
-
- BridgingHeader.prototype.__parseForBridgingHeader = function (text) {
- let i = 0;
- const list = [];
- let type = 'code';
- let start = 0;
- while (i < text.length) {
- switch (type) {
- case 'comment':
- if (i + 1 < text.length && text[i] === '*' && text[i + 1] === '/') {
- i += 2;
- list.push({ type, code: text.slice(start, i) });
- type = 'code';
- start = i;
- } else {
- i += 1;
- }
- break;
- case 'line-comment':
- if (i < text.length && text[i] === '\n') {
- i += 1;
- list.push({ type, code: text.slice(start, i) });
- type = 'code';
- start = i;
- } else {
- i += 1;
- }
- break;
- case 'code':
- default:
- if (i + 1 < text.length && text[i] === '/' && text[i + 1] === '*') { // comment
- if (start < i) {
- list.push({ type, code: text.slice(start, i) });
- }
- type = 'comment';
- start = i;
- } else if (i + 1 < text.length && text[i] === '/' && text[i + 1] === '/') { // line comment
- if (start < i) {
- list.push({ type, code: text.slice(start, i) });
- }
- type = 'line-comment';
- start = i;
- } else if (i < text.length && text[i] === '\n') {
- i += 1;
- list.push({ type, code: text.slice(start, i) });
- start = i;
- } else {
- i += 1;
- }
- break;
- }
- }
- if (start < i) {
- list.push({ type, code: text.slice(start, i) });
- }
- return list;
- };
-
- function preg_quote (str, delimiter) {
- return (`${str}`).replace(new RegExp(`[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\${delimiter || ''}-]`, 'g'), '\\$&');
- }
-
- module.exports.BridgingHeader = BridgingHeader;
|