All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.saygoer.gradle.tasks.CombineExtJsTask.groovy Maven / Gradle / Ivy

The newest version!
package com.saygoer.gradle.tasks

import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.SourceTask
import org.gradle.api.tasks.TaskAction

class CombineExtJsTask extends SourceTask {

    @OutputFile
    def dest

    @Input
    String encoding = 'UTF-8'

    File getDest() {
        project.file(dest)
    }

    //合并extjs
    @TaskAction
    def run() {
        //处理 ExtJs js文件顺序
        def jsMap = new HashMap()
        def jsNames = new ArrayList()
        source.each {
            if (it.isFile()) {
                def map = new HashMap()
                map.put('file', it)

                def dependencies = new ArrayList()
                def lines = it.readLines()


                def size = lines.size()
                for (def i = 0; i < size; i++) {
                    def l = lines.get(i);
                    if (l.contains('extend:')) {
                        while (i < size && !l.contains(',')) {
                            l += lines.get(++i)
                        }
                        l = l.replaceAll(' ', '')
                        l.eachMatch(/extend:['|"](.*)['|"],/, { all, dependency ->
                            dependencies.add(dependency)
                        })
                    }
                    if (l.contains('requires:')) {
                        while (i < size && (!l.contains('],') && l.contains('[') || !l.contains(',') && !l.contains('['))) {
                            l += lines.get(++i)
                        }
                        l = l.replaceAll(' ', '')
                        l.eachMatch(/requires:\[?(.*)\]?,/, { all, dependencyText ->
                            dependencyText.splitEachLine(',', {
                                it.each {
                                    it.replaceAll(/['|"](.*)['|"]/) { dependencyTexts, dependency ->
                                        dependencies.add(dependency)
                                    }
                                }

                            })
                        })
                    }
                }

                map.put('dependencies', dependencies)

                it.getText(encoding).replaceAll(' ', '').eachMatch(/Ext\.define\('(.*)',/, { all, name ->
                    name = name.trim()
                    jsNames.add(name)
                    jsMap.put(name, map)
                })
            }

        }

        def jsList = new ArrayList()


        jsNames.toArray().each {
            jsList.addAll(getOrderedJs(it, jsMap))
        }
        //合并js
        def printWriter = (dest as File).newPrintWriter(encoding);
        jsList.each {
            def lines = it.readLines()


            int size = lines.size()
            for (int i = 0; i < size; i++) {
                def l = lines.get(i);

                if (l.contains('extend:')) {
                    while (i < size && !l.contains(',')) {
                        l += lines.get(++i)
                    }
                    l = l.replaceAll(' ', '')
                    l = l.replaceAll(/extend:['|"](.*)['|"],/, { all, text ->
                        "    extend: ${text},"
                    })
                } else if (l.contains('requires:')) {
                    while (i < size && (!l.contains('],') && l.contains('[') || !l.contains(',') && !l.contains('['))) {
                        l += lines.get(++i)
                    }
                    l = l.replaceAll(' ', '')
                    l = l.replaceAll(/requires:\[?(.*)\]?,/, '    requires: [],')
                }
                printWriter.println(l)
            }
        }
        printWriter.flush()
        printWriter.close()
    }

    def getOrderedJs(name, jsMap) {
        def jsList = new ArrayList()
        def js = jsMap.get(name)
        if (js == null)
            return jsList
        def file = js.get('file')
        def dependencies = js.get('dependencies')
        if (!dependencies.isEmpty()) {
            dependencies.each {
                jsList.addAll(getOrderedJs(it, jsMap))
            }
        }
        jsList.add(file)
        jsMap.remove(name)
        return jsList
    }


}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy