diff --git a/aio/package.json b/aio/package.json
index e7f1a02e78..a9d0d17e50 100644
--- a/aio/package.json
+++ b/aio/package.json
@@ -107,7 +107,7 @@
"cross-spawn": "^5.1.0",
"css-selector-parser": "^1.3.0",
"dgeni": "^0.4.7",
- "dgeni-packages": "^0.24.0",
+ "dgeni-packages": "^0.25.0",
"entities": "^1.1.1",
"eslint": "^3.19.0",
"eslint-plugin-jasmine": "^2.2.0",
diff --git a/aio/tools/transforms/angular-api-package/index.js b/aio/tools/transforms/angular-api-package/index.js
index 26a6e6e220..0c5b2365ac 100644
--- a/aio/tools/transforms/angular-api-package/index.js
+++ b/aio/tools/transforms/angular-api-package/index.js
@@ -131,6 +131,6 @@ module.exports = new Package('angular-api', [basePackage, typeScriptPackage])
]);
convertToJsonProcessor.docTypes = convertToJsonProcessor.docTypes.concat(DOCS_TO_CONVERT);
postProcessHtml.docTypes = convertToJsonProcessor.docTypes.concat(DOCS_TO_CONVERT);
- autoLinkCode.docTypes = DOCS_TO_CONVERT;
+ autoLinkCode.docTypes = DOCS_TO_CONVERT.concat(['member']);
autoLinkCode.codeElements = ['code', 'code-example', 'code-pane'];
});
diff --git a/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js
index 2519d22870..f36a8d4809 100644
--- a/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js
+++ b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.js
@@ -5,15 +5,21 @@
*/
module.exports = function simplifyMemberAnchors() {
return {
- $runAfter: ['extra-docs-added'],
- $runBefore: ['computing-paths'],
+ $runAfter: ['paths-computed'],
+ $runBefore: ['rendering-docs'],
$process: function(docs) {
return docs.forEach(doc => {
if (doc.members) {
- doc.members.forEach(member => member.anchor = computeAnchor(member));
+ doc.members.forEach(member => {
+ member.anchor = computeAnchor(member);
+ member.path = doc.path + '#' + member.anchor;
+ });
}
if (doc.statics) {
- doc.statics.forEach(member => member.anchor = computeAnchor(member));
+ doc.statics.forEach(member => {
+ member.anchor = computeAnchor(member);
+ member.path = doc.path + '#' + member.anchor;
+ });
}
});
}
diff --git a/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.spec.js b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.spec.js
new file mode 100644
index 0000000000..b857af196d
--- /dev/null
+++ b/aio/tools/transforms/angular-api-package/processors/simplifyMemberAnchors.spec.js
@@ -0,0 +1,72 @@
+const testPackage = require('../../helpers/test-package');
+const processorFactory = require('./simplifyMemberAnchors');
+const Dgeni = require('dgeni');
+
+describe('simplifyMemberAnchors processor', () => {
+
+ it('should be available on the injector', () => {
+ const dgeni = new Dgeni([testPackage('angular-api-package')]);
+ const injector = dgeni.configureInjector();
+ const processor = injector.get('simplifyMemberAnchors');
+ expect(processor.$process).toBeDefined();
+ expect(processor.$runAfter).toEqual(['paths-computed']);
+ expect(processor.$runBefore).toEqual(['rendering-docs']);
+ });
+
+ describe('$process', () => {
+ describe('docs without members', () => {
+ it('should ignore the docs', () => {
+ const processor = processorFactory();
+ const docs = [
+ { id: 'some-doc' },
+ { id: 'some-other' }
+ ];
+ processor.$process(docs);
+ expect(docs).toEqual([
+ { id: 'some-doc' },
+ { id: 'some-other' }
+ ]);
+ });
+ });
+
+ describe('docs with members', () => {
+ it('should compute an anchor for each instance member', () => {
+ const processor = processorFactory();
+ const docs = [
+ { id: 'some-doc', members: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] }
+ ];
+ processor.$process(docs);
+ expect(docs[0].members.map(member => member.anchor)).toEqual(['foo', 'new', 'call']);
+ });
+
+ it('should compute a path for each instance member', () => {
+ const processor = processorFactory();
+ const docs = [
+ { id: 'some-doc', path: 'a/b/c', members: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] }
+ ];
+ processor.$process(docs);
+ expect(docs[0].members.map(member => member.path)).toEqual(['a/b/c#foo', 'a/b/c#new', 'a/b/c#call']);
+ });
+ });
+
+ describe('docs with static members', () => {
+ it('should compute an anchor for each static member', () => {
+ const processor = processorFactory();
+ const docs = [
+ { id: 'some-doc', statics: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] }
+ ];
+ processor.$process(docs);
+ expect(docs[0].statics.map(member => member.anchor)).toEqual(['foo', 'new', 'call']);
+ });
+
+ it('should compute a path for each static member', () => {
+ const processor = processorFactory();
+ const docs = [
+ { id: 'some-doc', path: 'a/b/c', statics: [ { name: 'foo' }, { name: 'new' }, { name: '' } ] }
+ ];
+ processor.$process(docs);
+ expect(docs[0].statics.map(member => member.path)).toEqual(['a/b/c#foo', 'a/b/c#new', 'a/b/c#call']);
+ });
+ });
+ });
+});
diff --git a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js
index baf114aaaa..fae9ba475e 100644
--- a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js
+++ b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.js
@@ -45,7 +45,7 @@ module.exports = function autoLinkCode(getDocFromAlias) {
parent.children.splice(index, 1, createLinkNode(docs[0], node.value));
} else {
// Parse the text for words that we can convert to links
- const nodes = textContent(node).split(/([A-Za-z0-9_-]+)/)
+ const nodes = textContent(node).split(/([A-Za-z0-9_.-]+)/)
.filter(word => word.length)
.map((word, index, words) => {
// remove docs that fail the custom filter tests
diff --git a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js
index c37b2165df..f300487aed 100644
--- a/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js
+++ b/aio/tools/transforms/angular-base-package/post-processors/auto-link-code.spec.js
@@ -9,7 +9,7 @@ describe('autoLinkCode post-processor', () => {
const dgeni = new Dgeni([testPackage]);
const injector = dgeni.configureInjector();
autoLinkCode = injector.get('autoLinkCode');
- autoLinkCode.docTypes = ['class', 'pipe', 'function', 'const'];
+ autoLinkCode.docTypes = ['class', 'pipe', 'function', 'const', 'member'];
aliasMap = injector.get('aliasMap');
processor = injector.get('postProcessHtml');
processor.docTypes = ['test-doc'];
@@ -31,6 +31,13 @@ describe('autoLinkCode post-processor', () => {
expect(doc.renderedContent).toEqual('foo.MyClass
');
});
+ it('should match code items within a block of code that contain a dot in their identifier', () => {
+ aliasMap.addDoc({ docType: 'member', id: 'MyEnum.Value', aliases: ['Value', 'MyEnum.Value'], path: 'a/b/myenum' });
+ const doc = { docType: 'test-doc', renderedContent: 'someFn(): MyEnum.Value
' };
+ processor.$process([doc]);
+ expect(doc.renderedContent).toEqual('someFn(): MyEnum.Value
');
+ });
+
it('should ignore code items that do not match a link to an API doc', () => {
aliasMap.addDoc({ docType: 'guide', id: 'MyClass', aliases: ['MyClass'], path: 'a/b/myclass' });
const doc = { docType: 'test-doc', renderedContent: 'MyClass
' };
diff --git a/aio/yarn.lock b/aio/yarn.lock
index 4acead46b1..7545c27601 100644
--- a/aio/yarn.lock
+++ b/aio/yarn.lock
@@ -2312,9 +2312,9 @@ devtools-timeline-model@1.1.6:
chrome-devtools-frontend "1.0.401423"
resolve "1.1.7"
-dgeni-packages@^0.24.0:
- version "0.24.0"
- resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.24.0.tgz#2f995f78fecd6a9ded72d7bdccbbc4c46360c1ea"
+dgeni-packages@^0.25.0:
+ version "0.25.0"
+ resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.25.0.tgz#380f0b569ae36d82959252604b729e85e0cd7d4a"
dependencies:
canonical-path "0.0.2"
catharsis "^0.8.1"