/*
 *  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
 *
 *    https://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.
 */

plugins {
    id 'groovy' // For groovydoc task
}

ext {
    apiDocsProjects = [
            'ui-plugin': [
                    docTitle: "Grails Spring Security UI Plugin - $projectVersion",
                    windowTitle: "spring-security-ui $projectVersion API"
            ]
    ]
    asciidoctorAttributes = [
            copyright            : 'Apache License, Version 2.0',
            docinfo1             : 'true',
            doctype              : 'book',
            encoding             : 'utf-8',
            'front-cover-image'  : 'image:cover.png[Front Cover,800,600]',
            icons                : 'font',
            id                   : "$rootProject.name:$projectVersion",
            idprefix             : '',
            idseparator          : '-',
            lang                 : 'en',
            linkattrs            : true,
            numbered             : '',
            producer             : 'Asciidoctor',
            revnumber            : projectVersion,
            setanchors           : true,
            'source-highlighter' : 'prettify',
            toc                  : 'left',
            toc2                 : '',
            toclevels            : '2',
            projectVersion       : projectVersion
    ]
}

// because the groovy plugin is being applied, a version of groovy must be provided
dependencies {
    implementation platform("org.apache.grails:grails-bom:${grailsVersion}")
    implementation 'org.apache.groovy:groovy'
}

apply {
    from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
    from rootProject.layout.projectDirectory.file('gradle/reproducible-config.gradle')
}