react-native-macos/website/server/extractDocs.js

228 строки
6.6 KiB
JavaScript
Исходник Обычный вид История

2015-03-23 20:55:49 +03:00
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
2015-03-20 00:05:07 +03:00
var docgen = require('react-docgen');
var docgenHelpers = require('./docgenHelpers');
var fs = require('fs');
var path = require('path');
var slugify = require('../core/slugify');
var jsDocs = require('../jsdocs/jsdocs.js');
function getNameFromPath(filepath) {
var ext = null;
while (ext = path.extname(filepath)) {
filepath = path.basename(filepath, ext);
}
2015-05-07 22:16:48 +03:00
2015-03-24 01:22:47 +03:00
if (filepath === 'LayoutPropTypes') {
return 'Flexbox';
2015-05-07 22:16:48 +03:00
} else if (filepath === 'TransformPropTypes') {
return 'Transforms';
} else if (filepath === 'TabBarItemIOS') {
2015-04-21 20:19:36 +03:00
return 'TabBarIOS.Item';
2015-03-24 01:22:47 +03:00
}
return filepath;
}
function getExample(componentName) {
var path = '../Examples/UIExplorer/' + componentName + 'Example.js';
if (!fs.existsSync(path)) {
2015-04-01 00:05:15 +03:00
path = '../Examples/UIExplorer/' + componentName + 'Example.ios.js';
if (!fs.existsSync(path)) {
return;
}
}
return {
2015-03-31 22:31:37 +03:00
path: path.replace(/^\.\.\//, ''),
content: fs.readFileSync(path).toString(),
};
}
// Hide a component from the sidebar by making it return false from
// this function
function shouldDisplayInSidebar(componentName) {
if (componentName === 'Transforms') {
return false;
}
return true;
}
function getNextComponent(i) {
var next;
var filepath = all[i];
if (all[i + 1]) {
var nextComponentName = getNameFromPath(all[i + 1]);
if (shouldDisplayInSidebar(nextComponentName)) {
return slugify(nextComponentName);
} else {
return getNextComponent(i + 1);
}
} else {
return 'network';
}
}
2015-03-20 00:05:07 +03:00
function componentsToMarkdown(type, json, filepath, i, styles) {
var componentName = getNameFromPath(filepath);
var docFilePath = '../docs/' + componentName + '.md';
if (fs.existsSync(docFilePath)) {
json.fullDescription = fs.readFileSync(docFilePath).toString();
}
2015-03-12 21:03:32 +03:00
json.type = type;
json.filepath = filepath.replace(/^\.\.\//, '');
json.componentName = componentName;
2015-03-20 00:05:07 +03:00
if (styles) {
json.styles = styles;
}
json.example = getExample(componentName);
// Put Flexbox into the Polyfills category
var category = (type === 'style' ? 'Polyfills' : type + 's');
var next = getNextComponent(i);
var res = [
'---',
'id: ' + slugify(componentName),
'title: ' + componentName,
2015-03-05 05:10:12 +03:00
'layout: autodocs',
'category: ' + category,
'permalink: docs/' + slugify(componentName) + '.html',
'next: ' + next,
'sidebar: ' + shouldDisplayInSidebar(componentName),
'---',
2015-03-05 05:10:12 +03:00
JSON.stringify(json, null, 2),
].filter(function(line) { return line; }).join('\n');
return res;
}
2015-03-25 07:13:55 +03:00
var n;
function renderComponent(filepath) {
var json = docgen.parse(
fs.readFileSync(filepath),
docgenHelpers.findExportedOrFirst,
docgen.defaultHandlers.concat(docgenHelpers.stylePropTypeHandler)
);
2015-03-25 07:13:55 +03:00
return componentsToMarkdown('component', json, filepath, n++, styleDocs);
}
function renderAPI(type) {
return function(filepath) {
var json;
try {
json = jsDocs(fs.readFileSync(filepath).toString());
} catch(e) {
console.error('Cannot parse file', filepath);
json = {};
}
return componentsToMarkdown(type, json, filepath, n++);
};
}
function renderStyle(filepath) {
var json = docgen.parse(
fs.readFileSync(filepath),
docgenHelpers.findExportedObject,
[docgen.handlers.propTypeHandler]
);
// Remove deprecated transform props from docs
if (filepath === "../Libraries/StyleSheet/TransformPropTypes.js") {
['rotation', 'scaleX', 'scaleY', 'translateX', 'translateY'].forEach(function(key) {
delete json['props'][key];
});
}
2015-03-25 07:13:55 +03:00
return componentsToMarkdown('style', json, filepath, n++);
}
var components = [
'../Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js',
'../Libraries/Components/DatePicker/DatePickerIOS.ios.js',
2015-03-03 04:31:26 +03:00
'../Libraries/Image/Image.ios.js',
'../Libraries/CustomComponents/ListView/ListView.js',
'../Libraries/Components/MapView/MapView.js',
2015-03-26 16:43:45 +03:00
'../Libraries/CustomComponents/Navigator/Navigator.js',
'../Libraries/Components/Navigation/NavigatorIOS.ios.js',
'../Libraries/Picker/PickerIOS.ios.js',
'../Libraries/Components/ScrollView/ScrollView.js',
2015-03-19 23:55:42 +03:00
'../Libraries/Components/SliderIOS/SliderIOS.js',
'../Libraries/Components/SwitchIOS/SwitchIOS.ios.js',
'../Libraries/Components/TabBarIOS/TabBarIOS.ios.js',
2015-04-21 20:19:36 +03:00
'../Libraries/Components/TabBarIOS/TabBarItemIOS.ios.js',
2015-03-03 04:31:26 +03:00
'../Libraries/Text/Text.js',
2015-03-31 19:46:45 +03:00
'../Libraries/Components/TextInput/TextInput.js',
'../Libraries/Components/Touchable/TouchableHighlight.js',
'../Libraries/Components/Touchable/TouchableOpacity.js',
'../Libraries/Components/Touchable/TouchableWithoutFeedback.js',
'../Libraries/Components/View/View.js',
'../Libraries/Components/WebView/WebView.ios.js',
];
var apis = [
'../Libraries/Utilities/AlertIOS.js',
'../Libraries/AppRegistry/AppRegistry.js',
'../Libraries/AppStateIOS/AppStateIOS.ios.js',
'../Libraries/Storage/AsyncStorage.ios.js',
2015-03-12 21:03:32 +03:00
'../Libraries/CameraRoll/CameraRoll.js',
'../Libraries/Interaction/InteractionManager.js',
2015-03-12 21:03:32 +03:00
'../Libraries/Animation/LayoutAnimation.js',
'../Libraries/LinkingIOS/LinkingIOS.js',
'../Libraries/Network/NetInfo.js',
2015-03-25 06:38:29 +03:00
'../Libraries/vendor/react/browser/eventPlugins/PanResponder.js',
2015-03-12 21:03:32 +03:00
'../Libraries/Utilities/PixelRatio.js',
2015-03-25 06:38:29 +03:00
'../Libraries/PushNotificationIOS/PushNotificationIOS.js',
2015-03-12 21:03:32 +03:00
'../Libraries/Components/StatusBar/StatusBarIOS.ios.js',
'../Libraries/StyleSheet/StyleSheet.js',
'../Libraries/Vibration/VibrationIOS.ios.js',
];
2015-03-20 00:05:07 +03:00
var styles = [
'../Libraries/StyleSheet/LayoutPropTypes.js',
2015-05-07 22:16:48 +03:00
'../Libraries/StyleSheet/TransformPropTypes.js',
2015-03-20 00:05:07 +03:00
'../Libraries/Components/View/ViewStylePropTypes.js',
'../Libraries/Text/TextStylePropTypes.js',
'../Libraries/Image/ImageStylePropTypes.js',
];
2015-03-25 07:13:55 +03:00
var polyfills = [
2015-04-24 23:14:24 +03:00
'../Libraries/GeoLocation/Geolocation.js',
2015-03-25 07:13:55 +03:00
];
var all = components
.concat(apis)
2015-05-07 22:16:48 +03:00
.concat(styles.slice(0, 2))
2015-03-25 07:13:55 +03:00
.concat(polyfills);
2015-05-07 22:16:48 +03:00
var styleDocs = styles.slice(2).reduce(function(docs, filepath) {
2015-03-20 00:05:07 +03:00
docs[path.basename(filepath).replace(path.extname(filepath), '')] =
docgen.parse(
fs.readFileSync(filepath),
docgenHelpers.findExportedObject,
[docgen.handlers.propTypeHandler]
);
2015-03-20 00:05:07 +03:00
return docs;
}, {});
2015-03-12 21:03:32 +03:00
module.exports = function() {
2015-03-25 07:13:55 +03:00
n = 0;
2015-03-12 21:03:32 +03:00
return [].concat(
2015-03-25 07:13:55 +03:00
components.map(renderComponent),
apis.map(renderAPI('api')),
2015-05-07 22:16:48 +03:00
styles.slice(0, 2).map(renderStyle),
2015-03-25 07:13:55 +03:00
polyfills.map(renderAPI('Polyfill'))
2015-03-12 21:03:32 +03:00
);
};