forked from tomaz/appledoc
-
Notifications
You must be signed in to change notification settings - Fork 1
/
GBGenerator.m
114 lines (95 loc) · 3.64 KB
/
GBGenerator.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//
// GBGenerator.m
// appledoc
//
// Created by Tomaz Kragelj on 29.9.10.
// Copyright (C) 2010, Gentle Bytes. All rights reserved.
//
#import "GBStore.h"
#import "GBApplicationSettingsProvider.h"
#import "GBHTMLOutputGenerator.h"
#import "GBDocSetOutputGenerator.h"
#import "GBDocSetInstallGenerator.h"
#import "GBDocSetPublishGenerator.h"
#import "GBGenerator.h"
@interface GBGenerator ()
- (void)setupGeneratorStepsWithStore:(id)store;
- (void)runGeneratorStepsWithStore:(id)store;
@property (readonly) NSMutableArray *outputGenerators;
@property (retain) GBStore *store;
@property (retain) GBApplicationSettingsProvider *settings;
@end
#pragma mark -
@implementation GBGenerator
#pragma mark Initialization & disposal
+ (id)generatorWithSettingsProvider:(id)settingsProvider {
return [[[self alloc] initWithSettingsProvider:settingsProvider] autorelease];
}
- (id)initWithSettingsProvider:(id)settingsProvider {
NSParameterAssert(settingsProvider != nil);
GBLogDebug(@"Initializing generator with settings provider %@...", settingsProvider);
self = [super init];
if (self) {
self.settings = settingsProvider;
}
return self;
}
#pragma mark Generation handling
- (void)generateOutputFromStore:(id)aStore {
NSParameterAssert(aStore != nil);
GBLogInfo(@"Generating output from parsed objects...");
[self setupGeneratorStepsWithStore:aStore];
[self runGeneratorStepsWithStore:aStore];
}
- (void)setupGeneratorStepsWithStore:(id)store {
// Setups all output generators. The order of these is crucial as they are invoked in the order added to the list. This forms a dependency where each next generator can use
GBLogDebug(@"Initializing generation steps...");
if (!self.settings.createHTML) return;
[self.outputGenerators addObject:[GBHTMLOutputGenerator generatorWithSettingsProvider:self.settings]];
if (!self.settings.createDocSet) return;
[self.outputGenerators addObject:[GBDocSetOutputGenerator generatorWithSettingsProvider:self.settings]];
if (self.settings.installDocSet) {
[self.outputGenerators addObject:[GBDocSetInstallGenerator generatorWithSettingsProvider:self.settings]];
}
if (!self.settings.publishDocSet) return;
[self.outputGenerators addObject:[GBDocSetPublishGenerator generatorWithSettingsProvider:self.settings]];
}
- (void)runGeneratorStepsWithStore:(id)aStore {
GBLogDebug(@"Running generation steps...");
NSUInteger stepsCount = [self.outputGenerators count];
if (stepsCount == 0) {
GBLogNormal(@"No generation step defined, ending.");
return;
}
__block GBOutputGenerator *previous = nil;
[self.outputGenerators enumerateObjectsUsingBlock:^(GBOutputGenerator *generator, NSUInteger idx, BOOL *stop) {
NSError *error = nil;
NSUInteger index = idx + 1;
GBLogVerbose(@"Generation step %ld/%ld: Running %@...", index, stepsCount, [generator className]);
generator.previousGenerator = previous;
if (![generator copyTemplateFilesToOutputPath:&error]) {
GBLogNSError(error, @"Generation step %ld/%ld failed: %@ failed copying template files to output, aborting!", index, stepsCount, [generator className]);
*stop = YES;
return;
}
if (![generator generateOutputWithStore:aStore error:&error]) {
GBLogNSError(error, @"Generation step %ld/%ld failed: %@ failed generaing output, aborting!", index, stepsCount, [generator className]);
*stop = YES;
return;
}
previous = generator;
}];
}
#pragma mark Template files handling
- (NSMutableArray *)outputGenerators {
static NSMutableArray *result = nil;
if (!result) {
GBLogDebug(@"Initializing output generators array...");
result = [[NSMutableArray alloc] init];
}
return result;
}
#pragma mark Properties
@synthesize settings;
@synthesize store;
@end