protected void readShaderNodeDefinition(List<Statement> statements, ShaderNodeDefinitionKey key) throws IOException {
        boolean isLoadDoc = key instanceof ShaderNodeDefinitionKey && key.isLoadDocumentation();
        for (Statement statement : statements) {
            try {
                String[] split = statement.getLine().split("[ \\{]");
                String line = statement.getLine();

                if (line.startsWith("Type")) {
                    String type = line.substring(line.lastIndexOf(':') + 1).trim();
                    shaderNodeDefinition.setType(ShaderType.valueOf(type));
                } else if (line.startsWith("Shader ")) {
                    readShaderStatement(statement);
                    shaderNodeDefinition.getShadersLanguage().add(shaderLanguage);
                    shaderNodeDefinition.getShadersPath().add(shaderName);
                } else if (line.startsWith("Documentation")) {
                    if (isLoadDoc) {
                        String doc = "";
                        for (Statement statement1 : statement.getContents()) {
                            doc += "\n" + statement1.getLine();
                        }
                        shaderNodeDefinition.setDocumentation(doc);
                    }
                } else if (line.startsWith("Input")) {
                    varNames.clear();
                    for (Statement statement1 : statement.getContents()) {
                        try {
                            shaderNodeDefinition.getInputs().add(readVariable(statement1));
                        } catch (RuntimeException e) {
                            throw new MatParseException(e.getMessage(), statement1, e);
                        }
                    }
                } else if (line.startsWith("Output")) {
                    varNames.clear();
                    for (Statement statement1 : statement.getContents()) {
                        try {
                            if (statement1.getLine().trim().equals("None")) {
                                shaderNodeDefinition.setNoOutput(true);
                            } else {
                                shaderNodeDefinition.getOutputs().add(readVariable(statement1));
                            }
                        } catch (RuntimeException e) {
                            throw new MatParseException(e.getMessage(), statement1, e);
                        }
                    }
                } else {
                    throw new MatParseException("one of Type, Shader, Documentation, Input, Output", split[0], statement);
                }
            } catch (RuntimeException e) {
                throw new MatParseException(e.getMessage(), statement, e);
            }
        }
    }
effectively reads the ShaderNodesDefinitions block

@param statements the list of statements to parse
@param key the ShaderNodeDefinitionKey
@throws IOException if an I/O error occurs
jme3-core/src/plugins/java/com/jme3/material/plugins/ShaderNodeLoaderDelegate.java