text:
<?php

require_once 'phing/Task.php';
require_once 'task/AbstractPropelDataModelTask.php';
require_once 'builder/om/OMBuilder.php';
require_once 'builder/om/ClassTools.php';

/**
 * This Task converts the XML runtime configuration file into a PHP array for faster performance.
 *
 * @author     Hans Lellelid <hans@xmpl.org>
 * @package    propel.generator.task
 */
class PropelConvertConfTask extends AbstractPropelDataModelTask
{

	/**
	 * @var        PhingFile The XML runtime configuration file to be converted.
	 */
	private $xmlConfFile;

	/**
	 * @var        string This is the file where the converted conf array dump will be placed.
	 */
	private $outputFile;

	/**
	 * @var        string This is the file where the classmap manifest converted conf array dump will be placed.
	 */
	private $outputClassmapFile;

	/**
	 * [REQUIRED] Set the input XML runtime conf file.
	 * @param      PhingFile $v The XML runtime configuration file to be converted.
	 */
	public function setXmlConfFile(PhingFile $v)
	{
		$this->xmlConfFile = $v;
	}

	/**
	 * [REQUIRED] Set the output filename for the converted runtime conf.
	 * The directory is specified using AbstractPropelDataModelTask#setOutputDirectory().
	 * @param      string $outputFile
	 * @see        AbstractPropelDataModelTask#setOutputDirectory()
	 */
	public function setOutputFile($outputFile)
	{
		// this is a string, not a file
		$this->outputFile = $outputFile;
	}

	/**
	 * [REQUIRED] Set the output filename for the autoload classmap.
	 * The directory is specified using AbstractPropelDataModelTask#setOutputDirectory().
	 * @param      string $outputFile
	 * @see        AbstractPropelDataModelTask#setOutputDirectory()
	 */
	public function setOutputClassmapFile($outputFile)
	{
		// this is a string, not a file
		$this->outputClassmapFile = $outputFile;
	}

	/**
	 * The main method does the work of the task.
	 */
	public function main()
	{
		// Check to make sure the input and output files were specified and that the input file exists.

		if (!$this->xmlConfFile || !$this->xmlConfFile->exists()) {
			throw new BuildException("No valid xmlConfFile specified.", $this->getLocation());
		}

		if (!$this->outputFile) {
			throw new BuildException("No outputFile specified.", $this->getLocation());
		}

		$this->log('Loading XML configuration file...');

		// Create a PHP array from the runtime-conf.xml file
		$xmlDom = new DOMDocument();
		$xmlDom->load($this->xmlConfFile->getAbsolutePath());
		$xml = simplexml_load_string($xmlDom->saveXML());
		$phpconf = self::simpleXmlToArray($xml);
		$this->log(sprintf('Loaded "%s" successfully', $this->xmlConfFile->getAbsolutePath()), Project::MSG_VERBOSE);

		/* For some reason the array generated from runtime-conf.xml has separate
		 * 'log' section and 'propel' sections. To maintain backward compatibility
		 * we need to put 'log' back into the 'propel' section.
		 */
		$log = array();
		if (isset($phpconf['log'])) {
			$phpconf['propel']['log'] = $phpconf['log'];
			unset($phpconf['log']);
		}

		if(isset($phpconf['propel'])) {
			$phpconf = $phpconf['propel'];
		}

		// add generator version
		$phpconf['generator_version'] = $this->getGeneratorConfig()->getBuildProperty('version');

		if (!$this->outputClassmapFile) {
			// We'll create a default one for BC
			$this->outputClassmapFile = 'classmap-' . $this->outputFile;
		}

		// Write resulting PHP data to output file
		$outfile = new PhingFile($this->outputDirectory, $this->outputFile);
		$output = "<?php\n";
		$output .= "// This file generated by Propel " . $phpconf['generator_version'] . " convert-conf target".($this->getGeneratorConfig()->getBuildProperty('addTimestamp') ? " on " . strftime("%c") : '') . "\n";
		$output .= "// from XML runtime conf file " . $this->xmlConfFile->getPath() . "\n";
		$output .= "\$conf = ";
		$output .= var_export($phpconf, true);
		$output .= ";\n";
		$output .= "\$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . '".$this->outputClassmapFile."');\n";
		$output .= "return \$conf;";

		$mustWriteRuntimeConf = true;
		if (file_exists($outfile->getAbsolutePath())) {
			$currentRuntimeConf = file_get_contents($outfile->getAbsolutePath());
			if ($currentRuntimeConf == $output) {
				$this->log(sprintf('No change in PHP runtime conf file "%s"', $outfile->getPath()), Project::MSG_VERBOSE);
				$mustWriteRuntimeConf = false;
			} else {
				$this->log(sprintf('Updating PHP runtime conf file "%s"', $outfile->getPath()));
			}
		} else {
			$this->log(sprintf('Creating PHP runtime conf file "%s"', $outfile->getPath()));
		}
		if ($mustWriteRuntimeConf && !file_put_contents($outfile->getAbsolutePath(), $output)) {
			throw new BuildException("Error writing output file: " . $outfile->getAbsolutePath(), $this->getLocation());
		}

		// add classmap
		$phpconfClassmap = $this->getClassMap();
		$outfile = new PhingFile($this->outputDirectory, $this->outputClassmapFile);
		$output = '<' . '?' . "php\n";
		$output .= "// This file generated by Propel " . $phpconf['generator_version'] . " convert-conf target".($this->getGeneratorConfig()->getBuildProperty('addTimestamp') ? " on " . strftime("%c") : '') . "\n";
		$output .= "return ";
		$output .= var_export($phpconfClassmap, true);
		$output .= ";";

		$mustWriteClassMap = true;
		if (file_exists($outfile->getAbsolutePath())) {
			$currentClassmap = file_get_contents($outfile->getAbsolutePath());
			if ($currentClassmap == $output) {
				$this->log(sprintf('No change in PHP classmap file "%s"', $outfile->getPath()), Project::MSG_VERBOSE);
				$mustWriteClassMap = false;
			} else {
				$currentPhpconfClassmap = include $outfile->getAbsolutePath();
				if ($addedMaps = array_diff_assoc($phpconfClassmap, $currentPhpconfClassmap)) {
					$this->log('Added classmap for the following classes:', Project::MSG_VERBOSE);
					$this->logClassMap($addedMaps);
				}
				if ($removedMaps = array_diff_assoc($currentPhpconfClassmap, $phpconfClassmap)) {
					$this->log('Removed classmap for the following classes:', Project::MSG_VERBOSE);
					$this->logClassMap($removedMaps);
				}
				$this->log(sprintf('Updating PHP classmap file "%s"', $outfile->getPath()));
			}
		} else {
			$this->log(sprintf('Creating PHP classmap file "%s"', $outfile->getPath()));
			$this->logClassMap($phpconfClassmap);
		}
		if ($mustWriteClassMap && !file_put_contents($outfile->getAbsolutePath(), $output)) {
			throw new BuildException("Error writing output file: " . $outfile->getAbsolutePath(), $this->getLocation());
		}

		if (!$mustWriteRuntimeConf && !$mustWriteClassMap) {
			$this->log('No change in compiled configuration files');
		}

	} // main()

	protected function logClassMap($classMap)
	{
		foreach ($classMap as $className => $classPath) {
			$this->log(sprintf('  %-15s => %s', $className, $classPath), Project::MSG_VERBOSE);
		}
	}
	/**
	 * Recursive function that converts an SimpleXML object into an array.
	 * @author     Christophe VG (based on code form php.net manual comment)
	 * @param      object SimpleXML object.
	 * @return     array Array representation of SimpleXML object.
	 */
	protected static function simpleXmlToArray($xml)
	{
		$ar = array();

		foreach ( $xml->children() as $k => $v ) {

			// recurse the child
			$child = self::simpleXmlToArray( $v );

			//print "Recursed down and found: " . var_export($child, true) . "\n";

			// if it's not an array, then it was empty, thus a value/string
			if ( count($child) == 0 ) {
				$child = self::getConvertedXmlValue($v);

			}

			// add the childs attributes as if they where children
			foreach ( $v->attributes() as $ak => $av ) {

				// if the child is not an array, transform it into one
				if ( !is_array( $child ) ) {
					$child = array( "value" => $child );
				}

				if ($ak == 'id') {
					// special exception: if there is a key named 'id'
					// then we will name the current key after that id
					$k = self::getConvertedXmlValue($av);
				} else {
					// otherwise, just add the attribute like a child element
					$child[$ak] = self::getConvertedXmlValue($av);
				}
			}

			// if the $k is already in our children list, we need to transform
			// it into an array, else we add it as a value
			if ( !in_array( $k, array_keys($ar) ) ) {
				$ar[$k] = $child;
			} else {
				// (This only applies to nested nodes that do not have an @id attribute)

				// if the $ar[$k] element is not already an array, then we need to make it one.
				// this is a bit of a hack, but here we check to also make sure that if it is an
				// array, that it has numeric keys.  this distinguishes it from simply having other
				// nested element data.

				if ( !is_array($ar[$k]) || !isset($ar[$k][0]) ) { $ar[$k] = array($ar[$k]); }
				$ar[$k][] = $child;
			}

		}

		return $ar;
	}

	/**
	 * Process XML value, handling boolean, if appropriate.
	 * @param      object The simplexml value object.
	 * @return     mixed
	 */
	private static function getConvertedXmlValue($value)
	{
		$value = (string) $value; // convert from simplexml to string
		// handle booleans specially
		$lwr = strtolower($value);
		if ($lwr === "false") {
			$value = false;
		} elseif ($lwr === "true") {
			$value = true;
		}
		return $value;
	}

	/**
	 * Lists data model classes and builds an associative array className => classPath
	 * To be used for autoloading
	 * @return array
	 */
	protected function getClassMap()
	{
		$phpconfClassmap = array();

		$generatorConfig = $this->getGeneratorConfig();

		foreach ($this->getDataModels() as $dataModel) {

			foreach ($dataModel->getDatabases() as $database) {

				$classMap = array();

				foreach ($database->getTables() as $table) {

					if (!$table->isForReferenceOnly()) {

						// -----------------------------------------------------
						// Add TableMap class,
						//     Peer, Object & Query stub classes,
						// and Peer, Object & Query base classes
						// -----------------------------------------------------
						// (this code is based on PropelOMTask)

						foreach (array('tablemap', 'peerstub', 'objectstub', 'querystub', 'peer', 'object', 'query') as $target) {
							$builder = $generatorConfig->getConfiguredBuilder($table, $target);
							$classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath();
						}

						// -----------------------------------------------------
						// Add children classes for object and query,
						// as well as base child query,
						// for single tabel inheritance tables.
						// -----------------------------------------------------

						if ($col = $table->getChildrenColumn()) {
							if ($col->isEnumeratedClasses()) {
								foreach ($col->getChildren() as $child) {
									foreach (array('objectmultiextend', 'queryinheritance', 'queryinheritancestub') as $target) {
										$builder = $generatorConfig->getConfiguredBuilder($table, $target);
										$builder->setChild($child);
										$classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath();
									}
								}
							}
						}

						// -----------------------------------------------------
						// Add base classes for alias tables (undocumented)
						// -----------------------------------------------------

						$baseClass = $table->getBaseClass();
						if ( $baseClass !== null ) {
							$className = ClassTools::classname($baseClass);
							if (!isset($classMap[$className])) {
								$classPath = ClassTools::getFilePath($baseClass);
								$classMap[$className] = $classPath;
							}
						}

						$basePeer = $table->getBasePeer();
						if ( $basePeer !== null ) {
							$className = ClassTools::classname($basePeer);
							if (!isset($classMap[$className])) {
								$classPath = ClassTools::getFilePath($basePeer);
								$classMap[$className] = $classPath;
							}
						}

						// ----------------------------------------------
						// Add classes for interface
						// ----------------------------------------------

						if ($table->getInterface()) {
							$builder = $generatorConfig->getConfiguredBuilder($table, 'interface');
							$classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath();
						}

						// ----------------------------------------------
						// Add classes from old treeMode implementations
						// ----------------------------------------------

						if ($table->treeMode() == 'MaterializedPath') {
							foreach (array('nodepeerstub', 'nodestub', 'nodepeer', 'node') as $target) {
								$builder = $generatorConfig->getConfiguredBuilder($table, $target);
								$classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath();
							}
						}
						if ($table->treeMode() == 'NestedSet') {
							foreach (array('nestedset', 'nestedsetpeer') as $target) {
								$builder = $generatorConfig->getConfiguredBuilder($table, $target);
								$classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath();
							}
						}

						// ----------------------------------
						// Add classes added by behaviors
						// ----------------------------------
						if ($table->hasAdditionalBuilders()) {
							foreach ($table->getAdditionalBuilders() as $builderClass) {
								$builder = new $builderClass($table);
								$builder->setGeneratorConfig($generatorConfig);
								$classMap[$builder->getFullyQualifiedClassname()] = $builder->getClassFilePath();
							}
						}

					} // if (!$table->isReferenceOnly())
				}

				$phpconfClassmap = array_merge($phpconfClassmap, $classMap);
			}
		}

		// sort the classmap by class name, to avoid discrepancies between OS
		ksort($phpconfClassmap);

		return $phpconfClassmap;
	}
}


I don't freakin' get it – Part 2 | Harder. Better. Faster. Stronger.
You don't buy a cream that promises to enlarge your junk by 3 inches in 3 weeks… but you buy a product that promises 6 pack abs in 6 weeks.
You don't fill your car with crude oil… but you fill your body with junk food.
You don't buy a camera without reading reviews… but you buy foods without reading nutritional data on the back.
You don't feed your dog sugar, dough and rancid oil every morning… but you load yourself up with donut/muffin/cereal bar and fruit juice/soda every morning.
You don't dress like its your birthday everyday… but you eat like its your birthday everyday.
You don't believe Santa Claus will bring you gifts… but you believe sit-ups will give you a flat stomach.
You don't trust a medicine that was manufactured in your kitchen… but you trust a food that was made in a lab.
You don't think apple flavored candy is better than a real apple… but you think ultra-processed sodium-loaded soy meat is better than real meat.
You understand 1+1 = 2… but you do not understand bad diet + sedentary lifestyle = early death.
Pretty sad state of affairs indeed!
You don't think a $1000 purse is expensive but $5/doz for pastured eggs are.
The saddest part is many people believe that their bad diet is actually healthy, thanks to the media.
If we ate more like the little guy above, we'd be in better health… good post.
hahahahahah the first one had me laughing out loud already, i love these posts!!!!!


text:
China's Warren Buffett called one of country's fastest-growing industries 'basically a scam'
Ben Moshinsky
A man takes pictures of a collapsed road in Kunming, Yunnan province, April 16, 2014.
Billionaire Guo Guangchang, known as China's Warren Buffett, says the country's fast-growing peer-to-peer lending industry is "basically a scam."
Guo, who with a net worth of $5.6 billion is China's 17th-richest person, made the comment in response to a question at a post-earnings briefing for his conglomerate Fosun.
Fosun's chief financial officer, Robin Wang, had said "we never invested in any P2P projects," until Guo jumped in and added that most peer-to-peer lending was "rogue," according to a report by Bloomberg News.
The growth of peer-to-peer lending in China has been meteoric. By the end of 2015 lending topped $150 billion, or 982 billion yuan, which is four times the 253 billion yuan recorded in 2014.
Guo's comments follow a crackdown by Chinese authorities on P2P lending, after authorities discovered 1,778 "problematic" lenders, according to Bloomberg. Last month, China limited the amount an individual could borrow on peer-to-peer lending sites to 1 million yuan ($150,000), with corporate borrowers capped at 5 million yuan.
Billionaire Guo Guangchang, Executive Director and Chairman of Fosun International.
REUTERS/Bobby Yip
Lenders were also barred from taking general retail deposits and selling wealth-management products to customers.
China's peer-to-peer lending industry was also the source of its biggest Ponzi scheme. In December, Ezubo, a lender, was found to have defrauded more than 900,000 people out of the equivalent of $7.6 billion.
Guo, the chairman of Fosun Group, one of China's biggest privately held conglomerates, went missing for several days while participating in an investigation with Chinese authorities into market volatility at the end of last year.
Fosun has been building up its portfolio of foreign assets, buying the French holiday company Club Med in 2015. It also owns a stake in the British tour operator Thomas Cook.
More: China Peer-to-Peer Lending

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: How can i add a date/calender widget to django forms? I tried following these links and this but it didn't work. the widget doesn't load in the form and the js files gives 404 error in the console while it's accessible from the link. I use crispy forms to render my form.
forms.py
       DateInput = partial(forms.DateInput, {'class': 'datepicker'})

    # patient Form
    class PatientForm(ModelForm):

        birth_date = forms.DateField(label='Birth Date',widget=DateInput())
        class Meta:
            model = Patient
            exclude = ['user',]

The Template

Add Patient

            <form method="POST" action="{% url 'patients:patient_create' %}">

                {% csrf_token %}
                 {{ form|crispy }}
                <button type="submit" class="btn btn-primary" >Add Patients</button>

            </form>

    {% endblock %}

The links of js files + CSS

<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

The errors in the console
Not Found: /patients/"https://code.jquery.com/jquery-1.12.4.js"
Not Found: /patients/"https://code.jquery.com/ui/1.12.1/jquery-ui.js"
[18/Jul/2019 15:29:09] "GET /patients/%E2%80%9Dhttps://code.jquery.com/jquery-1.12.4.js%E2%80%9D HTTP/1.1" 404 6742
[18/Jul/2019 15:29:09] "GET /patients/%E2%80%9Dhttps://code.jquery.com/ui/1.12.1/jquery-ui.js%E2%80%9D HTTP/1.1" 404 6760
Not Found: /patients/"https://code.jquery.com/jquery-1.12.4.js"
[18/Jul/2019 15:29:10] "GET /patients/%E2%80%9Dhttps://code.jquery.com/jquery-1.12.4.js%E2%80%9D HTTP/1.1" 404 6742
Not Found: /patients/"https://code.jquery.com/ui/1.12.1/jquery-ui.js"
[18/Jul/2019 15:29:10] "GET /patients/%E2%80%9Dhttps://code.jquery.com/ui/1.12.1/jquery-ui.js%E2%80%9D HTTP/1.1" 404 6760
Not Found: /favicon.ico

in my code i have many jquery versions can that cause the problem.I want a widget that's more user friendly than jquery ui so is there any other method that i can use to add a widget with the same way of jquery ui ?

A: in your forms.py:
class DateInput(forms.DateInput):
     input_type = 'date'

class PatientForm(ModelForm):

        class Meta:
            model = Patient
            exclude = ['user',]
            widgets = {
                'birth_date':DateInput,
               }

Try this

A: The problem was that the modern browsers won't show a select date without making the type to date
here's what solved it for me
DateInput = partial(forms.DateInput, {'class': 'datepicker','type': 'date'})
# patient Form
class PatientForm(ModelForm):

    birth_date = forms.DateField(label='Birth Date',widget=DateInput())
    class Meta:
        model = Patient
        exclude = ['user',]

redpajama_set_name: RedPajamaStackExchange


Optimal Workshop welcomes WebSort and PlainFrame users!
Today we have exciting and emotional news. Optimal Workshop has acquired WebSort and PlainFrame, two tools for card sorting and tree testing respectively. We're really excited to be welcoming so many new users to Optimal Workshop on one day. Welcome!
On Monday the 3rd of March, we will retire the WebSort and PlainFrame UIs—everyone will be upgraded to Optimal Workshop. Read on to find out what it means for you, why we've made the change, and why we're excited. We also hear from WebSort founder and sole developer Jed Wood.
You'll find that OptimalSort truly is an 'upgrade', mostly due to the more usable sorting interface and more comprehensive analytics tools. All WebSort users will be able to log into their Optimal Workshop accounts on the 03/03/14. You'll find that all your existing surveys, credits and subscriptions will be moved across, and should be fully intact.
The WebSort user interface for survey administrators and participants alike was built using Adobe Flash, an outdated technology choice for online applications, and changing this would require an entire rebuild. Now that OptimalSort sports hybrid card sorting and a pay-per-use pricing model there's every reason to use OptimalSort.
We've made a decision to migrate all WebSort data into OptimalSort in one hit. WebSort has almost no traffic on a late Sunday, early Monday. We'd realized that there would be no other substantial "quiet time" to migrate the data. There's no notice period that wouldn't end in the middle of someone's survey. So we plan to make the change as quick and painlessly as possible. If you have questions about the migration, please see our UX Punk Q&A.
The most exciting part about this move for us and for everyone is that it allows us to focus future support and development efforts on one cohesive codebase. And we'll be able to deliver new features much faster for both Optimal Workshop and UX Punk customers. Maintaining two codebases is hard, so I'm really excited about the focus we now have within our team. We're enthusiastic about the fantastic opportunities this focus will bring for user research efforts internationally.
Let's hear it for WebSort founder Jed Wood!
"When my father Larry and I built the first version of WebSort 12 years ago, we thought there were maybe a dozen people that would be interested in online card sorting. WebSort's accidental commercial success put me on a detour from my straight UX career path and into the world of web development. I never imagined I'd become so comfortable with command line Linux, DNS, and SQL.
WebSort was always a part-time gig for me, and Larry eventually retired. The fellows at Optimal Workshop released some great tools. Then the explosion of iPhones and iPads all but killed the Flash platform, which WebSort has relied on since the beginning. Optimal continued to revise and improve their toolset, moving away from Flash. Rebuilding WebSort (and PlainFrame) didn't seem worth it. It had been years since I personally had done any card sorting. It was time to end my production web development detour and return to my UX Roots.
I recently joined the UX team at Ancestry.com as a prototyper. The role is perfect for me; those dev skills help me create complex mockups, but I'm not responsible for production applications. As WebSort users move to Optimal Workshop, they'll be in good hands. Optimal has an entire team working full time to continue improving the tools. I'm excited and a bit relieved that we can close WebSort while immediately providing a new home for our users and their sorting studies.
Thank you Jed, we sincerely respect all the love that you put into WebSort and we're proud to offer this path to your valued customers.
If you have any nice comments for Jed please leave them in the comment section below so he can review them here.
To help you feel at home, your friend Sarah from WebSort will show you around OptimalSort. Sarah has joined the Optimal Workshop Better Experience Bureau and is available on support@optimalworkshop.com if you have any detailed questions that aren't covered by our UX Punk Q&A.


A conversation about our community here in Laugarnes using OST.
where participants have been invited in order to focus on a specific, important task or purpose.
OST is a participant-driven process whose agenda is created by people attending.


An easily adjustable trimming tool for precisely cutting the edge of carpeting and other types of sheet material. The tool is an easily grippable block that is constructed as a two-part molded plastic block, each part having molded ribs and reinforcing fastener bores that make for a lightweight, yet sturdy device that is economical to manufacture. Cutter assemblies and an adjustable heel allow for an easy adjustment to the length of the blade, so as to enable a long cut, standard cut, or short cut.
1: A wall trimming device for cutting sheet material to fit against a wall, the trimmer tool comprising: a plastic molded block having a top half and a bottom half that are fastenable to each other, wherein the block has an inside that is essentially a hollow construction with fastener holes and reinforcing ribs that provide rigidity and also reinforce the fastener holes; a cutter assembly that is mounted on a front face of the block and that has a blade that is adjustable in length; and a tool angle modifier that is mounted on a rear face of the block for adjusting an angle of the block to the sheet material, so as to accommodate various thicknesses of the sheet material.
2.: The wall trimming device of claim 1, wherein the molded block has a number of grip recesses.
3: The wall trimming device of claim 1, wherein the cutter assembly includes two blade recesses for holding two cutter assemblies, each having a blade, a blade hold-down, and a stop edge for use in adjusting the blade.
4: The wall trimming device of claim 1, wherein the angle modifier is adjustably fastened to the block by a threaded insert.
 The invention relates to wall trimming devices.
 U.S. Pat. No. 5,450,672 discloses a wall trimming tool for trimming flexible material, such as carpet, so that the material lies flat up against the wall. That disclosure is incorporated herein by reference, in its entirety. This prior art wall trimming tool is constructed of a solid block of wood, with a slot built in it to receive a blade and a blade holder that enables the length of the blade to be adjusted. The flexible material, such as, for example, floor covering, is placed in position to be cut and the trimming tool placed on top of the material, and is then pushed against the floor and simultaneously against the wall. The bottom of the block has a curved contour, and the flexible material conforms somewhat to this contour as the tool is pushed along the material. Moving the trimming tool along the flexible material while pushing against the wall provides the desired cut of the material, a cut that closely follows the contour of the wall.
 The trimming device also includes a tool angle adjustment device that allows the user to change the angle of the trimming device relative the floor and wall surfaces, referred to as a "heel" adjuster. This adjuster allows the user to change the contact angle and position of the blade on the sheet material, thereby allowing a "standard cut" precisely along the wall, or a "short cut" that is in front of the wall. It cannot accommodate a "long cut", i.e. one in which the material extends under a baseboard or a wall. In some situations, for example, it is desirable to cut the sheet material just slightly short of the perfect fit. This is done to accommodate swelling of the sheet material in a humid environment.
 The prior art device, being machined from a block of wood, is comparatively expensive to manufacture. The block material is expensive, as is the extensive machining that is required. A further disadvantage is that it is difficult to precisely adjust the blade. The process is cumbersome. First the blade is adjusted so that it just touches the floor, then the heel adjuster is set for the desired standard or short cut, which then may require that the length of the blade be adjusted again.
 What is needed is a device that that is less expensive to manufacture and that is quickly and easily adjustable. What is further needed is such a device that enables a cut to be made with the desired closeness to the wall, whether that be a short cut, a standard cut, or a long cut.
 The invention is an adjustable trimming tool that is used to cut an edge of carpeting or other type of sheet material, so that the material fits perfectly against a wall or other fixture. The tool is configured so that a user can easily adjust the length of the cut, whether it be for a short cut, a long cut, or a standard cut against a wall. It is constructed of a two-part molded plastic component having a top half and a bottom half. Molded ribs and reinforcing bores are provided on each half. This construction produces a tool that is strong and durable, yet also economical to manufacture.
 FIG. 1 is a top plan view of the wall trimming tool according to the invention.
 FIG. 2 is a perspective view of the tool.
 FIG. 3 is a front plan view of the tool.
 FIG. 4 is a side plan view of the tool.
 FIG. 5 is a rear plan view of the tool.
 FIG. 6 is a perspective view of the mating surface of top half of block.
 FIG. 7 is a plan view of the inside of the top half of the block.
 FIG. 8 is a plan view of the front of the block without blade adjusters.
 FIG. 9 is a side view of the top half of the block.
 FIG. 10 is a perspective view of the top half of the block.
 FIG. 11 is a perspective view of the bottom of the block.
 FIG. 12 is a perspective view of the bottom of the block.
 FIG. 13 is a perspective view of the mating surface of the bottom half of the block.
 FIG. 14 is a plan view of the blade.
 FIG. 15 is a perspective view of the blade hold-down.
 FIG. 16 is a plan view of the tool angle modifier.
 FIG. 17 is a plan view of the front of the tool.
 FIG. 18 is a perspective view of the tool angle modifier.
 FIG. 19 is a side plan view of the tool.
 FIG. 20 is a front plan view of the tool.
 FIG. 21 illustrates a method of adjusting the blade in the blade hold-down.
 FIGS. 1, 2, 4, 5, 17, 19 and 20 illustrate an adjustable wall trimming tool 100 according to the invention that is used to cut an edge of carpeting or other type of sheet material, so that the carpet or sheet material fits perfectly whether the cut be a long cut that allows the sheet material to extend under the wall, a standard cut that is precisely along the wall, or a short cut that is a slight distance away from the wall. The wall trimming tool 100 is an easily grippable block 10 comprising a cutter assembly 30 with a blade and a tool angle modifier 40 that allows the user to adjust the tool 100 for a desired cut, such as a short or a long cut. The block 10 is constructed as a two-part molded plastic component having a top half 12 and a bottom half 14 that are fastened together by conventional fastening means. The block 10 has an ergonomic design that includes a number of grip recesses 17 that allow a user to comfortably hold and use the tool 100 with one hand and that also accommodates either a left or right hand grip. The block 10 is molded with ribs 16 and reinforced fastener bores 18, as shown in FIGS. 6, 7, and 13. The top and bottom halves 12, 14 have mating surfaces that are fastened together with fasteners (not shown). This construction is cost-effective, yet provides a tool that is lightweight and, therefore, easy to use, yet has the stiffness, ruggedness and durability that are desirable for cutting carpet or other types of thick sheet material.
 FIGS. 6-10 illustrate various views of the top half 12 of the block 10, without the cutter assemblies 30. As can be seen in FIGS. 6 and 7, the top half 12 is a cored-out plastic molded component that is to a large extent hollow on the inside, with molded fastener holes 18 and reinforcing ribs 16. The reinforcing ribs 16 provide the necessary strength and rigidity and are designed to also reinforce the fastener bores 18. The fastener holes 18 receive fasteners that fasten the top and bottom halves together along with the fasteners for the cutter assembly 30, shown in FIGS. 1, 17 and 20.
 FIGS. 11-13 illustrate the bottom half 14 of the tool 100, which is constructed similarly to the top half 12, described above, with reinforcing ribs 16 and mating fastener bores 18, including an insert bore 44 for receiving a threaded insert (not shown).
 The block 10 has a blade recess 35, shown in FIGS. 2 and 20, to receive the cutter assembly 30, which includes a blade 32 and a blade hold-down 34. In the embodiment shown, the block 10 includes two blade recesses 35. One or the other of the recesses is used, depending on whether the tool 100 is being pushed along the floor to the right or to the left. FIGS. 14 and 15 illustrate the blade 32 and the blade hold-down 34. The blade hold-down 34 has a recessed surface 34A with a stop edge 34B that, when assembled in the blade recess 35 forms a stop edge. The user is able to set the length of the blade 32 to the proper cutting length by inserting a flathead screwdriver or other suitably shaped tool into the blade recess 35, as shown in FIG. 21, and pushing the blade 32 until the screwdriver comes into contact with the stop edge 34B and then tightening the fastener to fix the blade hold-down 34 in that position. This blade adjustment is described below in greater detail, in the section describing use of the tool.
 FIGS. 2, 4, 5, 16, 18 and 19 illustrate the tool angle modifier or heel adjuster 40, which is fastened to a rear side of the block 10 by means of a threaded insert 44. This heel adjuster 40 is adjustable in the vertical plane, which, if set lower than the bottom surface of the block 10, changes the angle of the block relative the floor and the wall and, in this way, changes slightly the angle and position of the cut on the sheet material. The heel adjuster 40 is shown in FIG. 19 adjusted to be flush with the bottom surface of the block 10. Lowering the heel adjuster 40, so that it extends below the bottom of the block causes the tool 100 to tip forward. This in effect changes the angle of the blade 32 to a more vertical orientation and results in a "short" cut of the sheet material. It is also noted that the front surface of the block 10 has an angle that slants slightly inward toward the block, to allow the tool 100 to be tipped forward, without changing the distance of the block from the wall.
 Use of the tool 100: As mentioned above, cutting flooring isn't just a matter of cutting along the contour of the wall. Depending on the material, the ambient conditions, and the configuration of the wall, with or without baseboard, it may be desirable to make a standard cut, i.e., follow the contour of the wall exactly, or a short cut, i.e., cut slightly short of the wall, or a long cut, i.e., cut so that the material may extend under a baseboard or wall. The blade is adjusted accordingly. It is noted that the vertical distance between the front edge of the recess 35 and the flat bottom of the block 10 has been increased over that of the prior art device First, the user inserts the blade 32 into the recess 35 and loosely assembles the hold-down 34. The tip of a flat screwdriver is inserted into the space between the hold-down 34 and the recess 35, and pushed into the recess until the tip of the screwdriver hits the stop edge 34B on the hold-down 34. This sets the blade 32 so that the tip of the blade is just above the floor. Because of the greater vertical distance, this is the only adjustment needed for a long cut. If a short or standard cut is desired, then a second adjustment step is needed. The angle of the tool 100 may be modified to accommodate a short or-standard cut, without having to re-adjust the length of the blade 32. This simplifies the process of setting the tool for the perfect professional cut. If the sheet material is to be cut long, then no further adjustment is required, because the blade 32 is initially set to the correct length for a "long" cut. If the material is to be cut shorter, then the fastener securing the heel adjuster 40 is loosened and the heel dropped down so that it protrudes a small distance beyond the lower surface of the block 10. This tips the tool forward slightly, without changing the distance of the tool 100 to the wall, in other words, the user will always push the tool 100 up against the wall to make a cut, regardless of whether the cut is a short standard, or a long cut. Tipping the tool forward moves the cutting tip of the blade 32 away from its initial position slightly, thereby effecting a "shorter" cut. Once these two steps are completed, the tool 100 according to the invention is ready to be used. If the base of the wall includes molding, such as cove base, that must be cut at the same time as the sheet material then the user may extend the blade an additional 1/8 of an inch or so.
 It is understood that the embodiments described herein are merely illustrative of the present invention. Variations in the construction of the wall trimming tool may be contemplated by one skilled in the art without limiting the intended scope of the invention herein disclosed and as defined by the following claims.