 # 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
 #
 #     http://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.

#
# Puny - Lightweight content editor for Balance applications
#
# ------------------------------------------------------------------------
#

[ADMINISTRATION CONFIGURATION]
#
# Editor login credentials
# -------------------------------------
# The editor is the user authorized to make content changes to the site
#
puny_editor_username = ''
puny_editor_password = ''


[DATASTORE CONFIGURATION]
#
# Which class will provide connection to the data store?
puny_datastore_classname = Puny_LocalFileDataStore;

# Where is this class in the filesystem?
puny_datastore_classpath = [MODULE_PATH]/classes/data/Puny_LocalFileDataStore.class.php; 

# Connection parameters specific to the Puny_LocalFileDataStore connector
puny_datastore_localfile_dir   = '[MODULE_PATH]/data/resources';

# Connection parameters specific to the Puny_PdoDataStore connector
puny_datastore_pdo_host = 'localhost';
puny_datastore_pdo_username    = '';
puny_datastore_pdo_password    = '';
puny_datastore_pdo_dbname      = '';
puny_datastore_pdo_driver      = 'mysql';
puny_datastore_pdo_tablePrefix = 'puny_';

# Connection parameters specific to the Puny_MongoDataStore connector
puny_datastore_mongo_db         = '';
puny_datastore_mongo_collection = '';

[PARSER CONFIGURATION]
#
# Puny supports an unlimited number of parsers. The only requirement is that
# there be a driver that conforms to ./classes/parsers/Puny_Parser.class.php.
# 
# This array provides a mapping between parser labels and the corresponding
# parser class that will do the work.
#
puny_parser[ 'markdown' ] = [MODULE_PATH]/classes/parsers/Puny_MarkdownParser.class.php



[INTERNAL ROUTING]
#
# These variables are here to provide location independence (so that you can 
# install Puny in ./modules/puny or ./modules/somethingelse without having 
# to change any code. You should never have to edit these.
#
puny_module_path   = [MODULE_PATH]
puny_module_root   = [MODULE_ROOT]
puny_module_static = [MODULE_STATIC] 