Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
7 oz aduki beans
1 wheat free vegetable stock cube
1 onion, peeled and finely chopped
2 carrots, trimmed, peeled and thickly sliced
1 leek, washed, trimmed and finely sliced
Half a butternut squash, peeled, deseeded and cut into chunky pieces
½ tsp of cumin
½ tsp of turmeric
250g curly kale
4tbsp of fresh chervil, chopped
Presoak the beans for 12 hours or overnight in water. Drain the beans and rinse well. Place in a saucepan of water and bring to the boil. Boil hard for 15 minutes to remove toxins. Drain and rinse well.
Return the beans to the pan with a litre of fresh cold water. Add the stock cube and bring to the boil. Lower the heat and simmer for 10 minutes. Add the vegetables, cumin and turmeric and simmer for a further 10-15 minutes.
Add the kale and cook for a few minutes until just tender. Sprinkle with chervil.
Prep and Cook Time: 30 minutes
Ingredients:
1 medium onion cut in half and sliced thin
4 medium cloves garlic, chopped
1 tsp minced fresh ginger
1½ cups sweet potatoes cut in ½ inch cubes
1 cup green peppers, thin julienne
1 cup red peppers, thin julienne
1 tsp garam masala (Can be found in the spice section of your favorite market.)
1 TBS + ½ cup vegetable broth
1 15 oz can black beans, drained
*optional 2 oz Chevre goat cheese
salt and black pepper to taste
4 whole wheat tortillas
Topping
*(optional) prepared salsa
1 head of romaine lettuce, shredded (remove outer leaves and discard)
Chop onions and garlic and let sit for 5-10 minutes to bring out their health-promoting properties.
Prepare vegetables by chopping and slicing.
Heat 1 TBS broth in a 12 inch stainless steel skillet. Healthy Sauté onion, garlic, ginger, and peppers in broth over medium heat for about 5 minutes, stirring frequently. Add garam masala, sweet potatoes and mix well. Add 1/2 cup broth and cook covered on low heat for about 10 minutes, or until potatoes are tender.
Add beans making sure they are rinsed and drained well first and mix. Cook for another 5 minutes and season with salt and pepper.
While vegetables are cooking shred lettuce. You also might want to wrap tortillas in foil and place in the oven to warm while you are preparing the rest of the ingredients.
Place vegetable mixture in tortilla and top with goat cheese. Roll and top with salsa and shredded lettuce.
1 can (15 oz.) black beans, rinsed well
(Nick also used 1 can white beans. I leave out the white beans but use the same amount of other ingredients.)
2 tomatoes, seeded and chopped in 1/4 inch dice (2/3 cup diced tomato)
1/2 cup white onion, chopped in 1/4 inch dice
1/4 cup green pepper, chopped in 1/4 inch dice
1/4 cup red pepper, chopped in 1/4 inch dice
(You can also use 1/2 cup same color peppers)
1 clove garlic, minced (1/2 tsp. minced garlic)
1 can Mexican tomatillos, drained and chopped in 1/4 inch dice
(I used three small fresh tomatillos, can also use green tomatoes)
1/4 tsp. ground Chipotle chile powder (Nick used 1 canned Chipotle pepper, seeds removed and diced small)
chopped cilantro with stems, to taste
(I used the whole bunch, but I love cilantro)
1/4 tsp. hot pepper flakes
3 T olive oil
3 T red wine vinegar
salt/pepper to taste
Drain black beans into a colander and rinse until no more foam appears. Let beans drain while you chop other ingredients. (I blot them dry with a paper towel if they seem very wet.)
Chop tomatoes, onions, peppers, and tomatillos, aiming for same size cut. Put into bowl and add other ingredients and stir a few times to combine. Chill 1 hour before serving. Serve salsa with Chipotle grilled shrimp.
http://kalynskitchen.blogspot.com/2008/04/recipe-for-spicy-mexican-slaw-with-lime.html
(4 servings but could easily be doubled, recipe created by Kalyn with inspiration from a blog that no longer exists)
1 can black beans, rinsed well and drained (about 1 1/2 cups cooked beans)
1 red pepper, chopped
1 yellow pepper, chopped
(could use any combination of colors for the pepper, or use 2 red peppers)
1/2 red onion, chopped
1 bunch cilantro, chopped
Dressing:
2 T lime juice (fresh lime juice recommended)
2 T extra virgin olive oil
1/4 tsp. ground Chipotle pepper (I use Penzeys)
(you could use Green Tabasco in place of the Chipotle pepper)
1/2 tsp. mild chile powder (New Mexico chile powder is best)
1/2 tsp. ground cumin
1/2 tsp. onion powder
zest of one lime (optional, but recommended)
Vege-sal or salt to taste
fresh ground pepper to taste
Put black beans in a colander placed in the sink and rinse with cold water until no more foam appears. Let beans drain, preferably 30 minutes or so, until beans are no longer wet. (If you're rushed for time, you could blot them dry with paper towels.)
Mix dressing ingredients. Put beans and dressing into a plastic bowl with a snap-on lid, put lid on, and turn bowl over a few times until the beans are well coated with the dressing. Let the beans marinate in the dressing for an hour or so if you have time, or at least while you chop the other ingredients.
Chop peppers and onion into pieces about 1/2 inch square. (I was aiming for the beans, peppers, and onions to be approximately the same size.) Wash cilantro, dry well then chop coarsely (I used a salad spinner.)
In large bowl, gently combine beans, peppers, and onion. (If mixture seems dry you can add a tiny bit more olive oil and lime juice at this point.) Season to taste with Vege-sal or salt and fresh ground pepper. Stir in cilantro and serve.
This will keep for a day or two in the refrigerator, although it's best when the cilantro is still crisp.
http://kalynskitchen.blogspot.com/2007/09/recipe-favorites-black-bean-and-pepper.html
3 cans black beans, drained/rinsed
1 can chopped tomatos, drained
1 tbsp butter
2 medium onions, diced
3 cloves garlic, minced
1 tsp pepper
4 tsp cumin
32 oz chicken or veg broth
1 16 oz can pumpkin
Puree beand and pumpkin together. Melt butter and saute onions, garlic, salt, pepper, cumin. Stir in puree. Addd broth. Mix, simmer.
About 8 ounces kale
5 Tbsp. olive oil
1 medium yellow onion, diced
A pinch of dried red pepper flakes
2 large garlic cloves, thinly sliced
3 to 4 cups mild chicken stock, or water, or a combination of the two
To serve:
Thick slices of country bread
Eggs
Olive oil
Prosciutto, torn into bite-sized bits (optional)
Parmigiano Reggiano or Pecorino Romano
First, prepare the kale: trim away any discolored spots, and then remove and discard the ribs and stems, if they are thick or woody. Stack a few leaves at a time; then slice them into ¼-inch-thick ribbons. Dump the sliced kale into a salad spinner, and add plenty of cold water. Swish the kale around to free any trapped dirt. Let stand for a minute or two – this lets the dirt fall to the bottom – and then lift the basket from the spinner. Pour out the dirty water. Replace the basket, add fresh water, and repeat. Spin dry.
In a large (4-quart) saucepan, warm the oil over medium-low heat. Add the onions, and cook, stirring occasionally, until they are translucent but still firm. Add the red pepper flakes and garlic and the kale, and stir until the kale is fully wilted. Add stock to cover by about ½ inch. Bring to a simmer. Cover, and continue to simmer until the kale is tender but not mushy, about 30 minutes. Taste, and salt as needed. This dish needs quite a bit of salt, so don’t be shy.
To serve, toast one slice of bread per person. While still hot, lightly rub both sides of the toast with raw garlic. Place the toast in the bottom of a wide soup bowl. Now, fry some eggs – one per person, probably – in olive oil. Pile some kale onto the toast in each bowl, drizzle with a little bit of olive oil, and top with a fried egg. Strew with prosciutto, if you want. Grate some cheese over the whole thing, and serve.
Yield: about 4 servings
http://orangette.blogspot.com/2008/10/pleasantly-sogged.html
INGREDIENTS
1/4 cup vegetable oil, such as canola or peanut
1/4 cup butter
1 chopped chile pepper, such as a serrano
1 medium yellow or white onion, grated
1 cup bourbon or Tennessee whiskey
1/2 cup ketchup or tomato sauce
1/2 cup lemon juice
1/2 cup apple cider vinegar
1/3 cup dark molasses
1/3 cup Worcestershire sauce
2-3 tablespoons brown sugar
Salt to taste
METHOD
1 Heat the butter and oil in a sauce pan over medium-high heat.
2 Grate the onion through the coarse grate of a box grater, or finely mince the onion if you don't have a grater.
3 Add grated onion and chile to the oil/butter combination and cook over medium heat for 3-4 minutes, or until onions turn translucent. You do not want the onions to turn color.
4 Take the pan off the heat and add the bourbon. Return to the stove, turn up the heat to medium-high again and boil down the bourbon for 5 minutes.
5 Add the ketchup, lemon juice, vinegar, Worcestershire sauce, molasses, and the sugar. Mix well and return to a simmer.
6 Cook the sauce for a few minutes to combine the flavors and then taste test it. Is it salty enough? (It should be from the Worcestershire sauce). If not, add salt. Is it spicy hot enough? If not, add a little cayenne powder. Is it sweet enough? If not, add some molasses.
7 Let the sauce cook down slowly until it thickens, about 20 minutes. Keep it on low heat while your ribs cook. Alternatively, you can make this sauce ahead of time and reheat it when you cook the meat. It will stay good in the fridge at least a week; I've held mine for two weeks with no problem.
Ingredients
* One 3-pound chuck roast, rinsed and dried
* 2 medium onions, chopped
* 1 Tbsp olive oil
* 1 28-ounce can whole tomatoes (preferably plum tomatoes)
* 1 18-ounce bottle of your favorite barbecue sauce (or 2 1/4 cups of your favorite homemade barbecue sauce)
* Salt and freshly ground black pepper
* 12 sandwich or hamburger buns
Method
1 In a large, heavy pot, heat olive oil on medium heat. Add the onions and cook until translucent, about 5 minutes. Add the tomatoes, roughly chopping them in the pot. Add the barbecue sauce, increase heat to medium high and simmer for 10 minutes. Add the chuck roast. Bring to a low simmer, cover and slow cook until meat is very tender, stirring occasionally, about 3 hours.
2 Remove the meat from the pot. Use a fork and knife to separate the roast into small pieces. Set aside.
3 Increase the heat on the pot to medium/medium-high, uncover, and reduce the liquid until thick. Stir often to prevent burning.
4 Return the meat to the liquid in the pan. Warm both thoroughly. Add salt and pepper to taste.
Serve on buns. Makes approximately 12 sandwiches.
http://www.elise.com/recipes/archives/007268braised_bbq_beef_sandwich.php
2 c sour cream
1 c mayo
3/4 c crumbled blue cheese
2 tbsp lowfat milk
2 cloves garlic, minced
1 tbsp Worcestershire sauce
1/2 tsp black pepper
1/4 tsp mustard powder
Mix all ingredients in large bowl. If too thick, add more milk. You want it to be thick enough to stand up a wooden spooon. Refridgerate for 1 hour.
1 whole roasting chicken, 4 lbs
1 tsp black pepper
1 tbsp granulated garlic
3/4 c mayo
1/2 c fresh lemon juice
2 tbsp curry powder
1 medium red onion, diced
2 small apples, finely chopped
1/3 c raisins
1/2 tsp salt
Sandwhich accessories: bread, mayo, lettuce, apple, sweet onion, jicama
Preheat over to 450. Remove gibblets/neck/extra parts. Rinse chicken under cold water. Combine black pepper and garlic and spread over outside of chicken. Place chickne breast down in roasting pan in center of oven, reduce heat to 350, bake 1 hour then turn chicken breast side up and cook additional 30 mins until fully cooked.
When cool enough to handle, remove the skin (save for stock or put in oven for 20 minutes until crisp and add to salad). Remove meat from carcass and chop into bit size pieces. Add all the remaining ingredients. Refriderate for at least 30 minutes.
1 head cabbage
.5 c finely diced onion
1.5 c good mayo
.25 c apple cider vinegar
.5 c white sugar
1 tsp pepper
Grate or shred cabbage very thin. Mix all together.
You have to work it for perfection.
Let it mellow a couple hours before serving.
1/2 cup walnuts
1/4 cup sugar
3 cups mixed greens
1/2 cup dried cranberries
1/2 cup crumbled Gorgonzola
1 tbsp raspberry vinegar
1 tbsp white wine vinegar
1 tbsp olive oil
Heat over medium walnuts and sugar until sugar dissolves and coats walnuts. Cool on aluminum foil.
Then mix remaining ingredients.
Carmelita Bars
Prep: 10 minutesCook: 45 minutesYield: Makes about 24 bars.
INGREDIENTS
1 cup plus 2 Tbsp (separated) all purpose flour
1 cup plus 1/3 cup (separated) quick oats
3/4 cup light brown sugar
1/2 teaspoon baking soda
1/4 teaspoon of salt
3/4 cup melted butter
1/2 cup sweetened shredded coconut
6 ounces semi-sweet chocolate chips
1 cup caramel sauce
METHOD
1 Preheat oven to 350°F.
2 Stir together the flour, oats, baking soda, and salt. Stir in the brown sugar, then the melted butter, then the coconut.
3 Spray a 9x13 baking pan with cooking spray, or spread with butter. Pat the dough into an even layer at the bottom of the pan.
4 Bake at 350°F for 10 minutes. Remove from oven and sprinkle with chocolate chips. Cover with the caramel sauce. Spread out into an even layer. In a small bowl, mix together 2 Tbsp of flour and 1/3 cup of oats. Sprinkle the flour oat mixture over the top of the caramel.
5 Put back in the oven and bake for another 25 minutes.
6 Remove from oven and let cool first for 5 minutes. Cut into bar shapes. Then let cool an additional 20 to 30 minutes before serving. The bars will firm up a bit as they cool, though they should still be rather chewy.
Ingredients
* 2 teaspoons olive or vegetable oil
* 1 cup chopped onion
* 2 boneless chicken breast halves cut into 1 to 2-inch cubes, about 4 cups
* 2 tablespoons all-purpose flour
* 1 teaspoons dried thyme
* 1/2 teaspoon salt
* 1/4 teaspoon ground black pepper
* 1/4 teaspoon paprika
* 2 carrots, peeled and chopped
* 2 celery stalks, chopped
* 4 medium red potatoes cut into 1-inch cubes
* 1 (14 1/2-ounce) can crushed tomatoes
* 1 cup reduced-sodium chicken broth
* 1/4 cup dry white wine
* 1 teaspoon Dijon mustard
* 1/2 cup frozen corn kernels
* 9-inch refrigerated pie crust
* 1 egg, lightly beaten
Directions
Preheat oven to 425 degrees F.
Heat oil in a large Dutch oven or oven-proof stockpot over medium heat. Add onion and saute 2 minutes. Add chicken and saute 5 to 7 minutes, until browned on all sides.
In a small bowl, combine flour, thyme, salt, pepper, and paprika. Add flour mixture to the chicken and stir to coat. Stir in carrots, celery, potatoes, tomatoes, chicken broth, wine, and Dijon mustard and mix well. Bring mixture to a boil. Cook until vegetables are tender.
Transfer stew to a clean 2-quart casserole dish and stir in corn.
Place pie crust on top of casserole and pinch around the edges to seal the crust to the dish. Brush the top with beaten egg and prick the surface 1 or 2 times with a sharp knife or fork to allow steam to escape during cooking.
Place casserole dish on baking sheet and bake 8 to 10 minutes, until crust is golden.
Ingredients
Soup Ingredients:
3 pounds chicken thighs and legs, skin removed, rinsed well
1 large white onion, peeled and cut into quarters
1 leek (white and light green parts only), cut into 1 inch rings, and rinsed thoroughly
1 green bell pepper, seeded and cut into 1-inch pieces
1 handful of green beans, cut into 1 inch pieces
2 ears of fresh corn, cut crosswise into quarters
2 ribs celery, cut into 1 inch pieces
2 large carrots, peeled and cut into 1 inch cubes
2 lbs of potatoes - gold, red, and or Idaho - peeled and cut into 1-inch cubes
6 cloves of garlic, peeled
1/2 cup fresh cilantro leaves
2 chicken bouillion cubes
1 Tbsp of kosher salt; more to taste
1/2 teas of ground pepper
Aji Ingredients:
4 scallions (white and light green parts only)
1 medium tomato, peeled and seeded
1 small white onion, peeled
2 fresh Scotch bonnet or habanero chiles or 2 fresh hot red chiles, stems and seeds removed (wear gloves, do NOT touch your eyes!)
3 Tbsp fresh cilantro leaves
3 Tbsp white vinegar
1/4 teaspoon of kosher salt
Garnish: sour cream, avocados, cilantro
Method
1 Put the chicken in a large (at least 8 quart) stock pot and add 8 cups of water. Bring to a boil over high heat and then reduce the heat to a vigorous simmer. Simmer for 10 minutes, frequently skimming off the foam that floats to the surface.
2 Add all the vegetables, the garlic, the cilantro, and the bouillion cubes to the pot, along with the salt and pepper. Stir a few times to distribute the vegetables and submerge as many of the solids as possible. When the broth returns to a boil, lower the heat, partially cover the pot, and simmer, stirring once or twice for 1 1/2 hours. Taste for salt and add more if needed.
3 Using tongs or a slotted spoon, pick out the chicken pieces and put them on a large plate. Stir the soup with a large spoon, breaking up some of the potatoes to thicken the soup slightly.
4 When the chicken is cool enough to handle, pull the meat off the bones and shred it by hand. Discard the bones and tendons. When the soup is ready to serve, return the chicken to the soup.
5 Pulse all the aji ingredients in a food processor until they're finely minced. Transfer to a serving bowl.
6 Serve the soup with the aji, sliced avocados, sour cream, and cilantro in separate bowls. Let people add garnishes to their own servings.
INGREDIENTS
Chicken and Vegetables:
3 to 3 1/2 pounds chicken thighs and breast parts, skin-on, bone-in, trimmed of excess fat
2 teaspoons butter or olive oil, or a combination of both
Salt
1 quart chicken stock (homemade is best)
2 to 3 celery stalks, trimmed and cut into 1/2-inch pieces (about 2 cups)
3 medium carrots, peeled and cut into 1/2-inch pieces (about 2 cups)
1 large onion, roughly chopped (about 2 cups)
1/3 cup all-purpose flour
1 teaspoon dried thyme
1/4 cup dry sherry or vermouth (optional)
1 Tbsp of heavy cream (optional)
3/4 cup frozen peas, thawed
1/4 cup minced fresh parsley leaves
Ground black or white pepper
Dumplings:
2 cups (250 g) cake flour (can sub all-purpose flour, but use cake flour if you have it, your dumplings will be fluffier)
2 teaspoons baking powder
3/4 teaspoon salt
2 Tbsp butter, melted
3/4 cup milk
1/4 cup minced fresh herb leaves such as parsley, chives, and tarragon (optional)
METHOD
1 Heat the chicken stock to a gentle simmer in a medium pot.
2 In a large (8 qt), thick-bottomed pot, heat the butter or olive oil over medium-high heat. Pat dry the chicken pieces and sprinkle with salt. Working in batches, brown the chicken pieces, placing the pieces skin-side down first; this will render out fat you will use to build the stew later.
3 Once the chicken pieces are browned on all sides, remove them from the large pot, and turn off the heat. Remove and discard the skin from the chicken pieces and put the chicken pieces into the pot of simmering stock. Poach the chicken in the stock until cooked through, about 20 minutes or so. Remove the chicken pieces and set on a tray to cool for a few minutes. When the chicken pieces are cool to touch, pull the meat off the bones and cut into 2-inch chunks. Set aside.
4 Return the heat on the large pot to medium-high. When the pot is hot, add the onion, celery, carrot and thyme and sauté until soft, but not browned, about 4-5 minutes. Add the flour and stir well. The flour will absorb the fat in the pot and will stick a little to the bottom. Reduce the heat to medium-low and stir the flour vegetable mixture constantly for 2-3 minutes. Do not let it burn.
5 Get a ladle ready and have the pot of simmering chicken stock nearby. Add the sherry to the flour vegetable mixture. It will sputter and seize up. Add a ladle of hot chicken stock to and stir well. It will be goopy. Add another ladle, then another, stirring all the while, until the broth comes together. Add the rest of the chicken stock, the reserved chicken meat. Increase the heat and bring to a simmer, then reduce the heat to maintain a gentle simmer while you make the dumplings.
6 Make the dumpling batter by whisking together flour, baking powder, and salt in a medium bowl. Add (optional) chopped fresh herbs. Add melted butter and milk to the dry ingredients. Gently mix with a wooden spoon until mixture just comes together. (Note: do not overmix! or your dumplings will turn out too dense.)
7 Drop dumpling batter into the simmering stew by heaping teaspoonfuls, over the surface of the stew. (Note that the dumplings will easily double in size as they cook.) Cover and simmer until dumplings are cooked through, about 15 minutes. Once you have covered the pan, do not uncover and peek while the dumplings are cooking! In order for the dumplings to be light and fluffy, they must steam, not boil. Uncovering the pan releases the steam. If after 15 minutes they are still not cooked through (use a toothpick or skewer to test) cover pan again, and cook for another 5 to 10 minutes.
8 Gently stir in peas, parsley and cream, if using. Add more salt to taste. Ladle portions of meat, sauce, vegetables, and dumplings into soup plates and serve. Note that the stew will continue to thicken the longer it sits.
1 cup firmly packed fresh flat-leaf parsley, trimmed of thick stems
3-4 garlic cloves
2 Tbsps fresh oregano leaves (can sub 2 teaspoons dried oregano)
1/2 cup olive oil
2 Tbsp red or white wine vinegar
1 teaspoon sea salt
1/4 teaspoon freshly ground black pepper
1/4 teaspoon red pepper flakes
1 Finely chop the parsley, fresh oregano, and garlic (or process in a food processor several pulses). Place in a small bowl.
2 Stir in the olive oil, vinegar, salt, pepper, and red pepper flakes. Adjust seasonings.
Serve immediately or refrigerate. If chilled, return to room temperature before serving. Can keep for a day or two.
Cake
2 c Milk Stout beer (Left Hand)
2 c (4 sticks) unsalted butter
1 1/2 c unsweetened cocoa powder (Dutch processed)
4 c all purpose flour
4 c sugar
1 tbsp baking soda
1 1/2 tsp salt
4 large eggs
1 1/3 c sour cream
Icing
2 c whipping cream
1 lb bittersweet (not unsweetened) or semisweet chocolate, chopped
----
Preheat oven to 350. Butter three 8-inch wound cake pans with 2 inch sides. Line with parchment paper. Butter paper.
Bring stout and butter to simmer in heavy large saucepan over medium heat. Add cocoa powder and whisk until mixture is smooth. Cool slightly.
Whisk flour, sugar, baking soda, and salt in large bowl to blend.
Using electric mixer, beat eggs and sour cream just to combine. Add flour mixture and beat briefly on slow speed. Using rubber spatula, fold batter until completely combined.
Divide batter equally among prepared pans. Bake until toothpick emerges clean, about 35 minutes. Cool on rack before turning out of pans to cool further.
Icing
Bring cream to simmer. Remove from heat. Add chopped chocolate and whisk until melted and smooth. Refrigerate until spreadable, about 2 hours.
Build cake with icing between layers and outside. Serve with milk stout beer.
From http://www.lefthandbrewing.com/
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{
handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,
handler: function(event,src,title) {
this.handler_mptw_orig_closeUnsaved(event,src,title);
if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
story.closeTiddler(title,true);
return false;
}
});
//}}}
Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
¾ lb. sea scallops, tough ligament removed from side of each if attached
Salt
1 cup white fish stock
½ cup dry white wine
1 small shallot, chopped
1 thyme sprig
¾ cup crème fraîche
2 large egg yolks
Black pepper
2 Tbsp. finely chopped chives
Rinse the scallops, and then pat them dry. Quarter them, and season them with 1/8 tsp. salt.
In a heavy medium saucepan, combine the stock, wine, shallot, thyme, and ½ tsp. salt. Bring to a boil over medium-high heat, cover, and boil for 5 minutes. Strain through a fine-mesh sieve into a bowl, pressing on the solids before discarding them. Return the liquid to the saucepan. Bring it to a boil, then stir in the scallops and simmer, covered, stirring occasionally, until the scallops are just cooked through, about 2 minutes. (Do not overcook. If anything, leave them rare; they will continue to cook after you remove them from the heat.) Remove the scallops with a slotted spoon, and keep them warm, covered. Reserve the cooking liquid in the saucepan.
Meanwhile, put the crème fraîche in a small saucepan, and bring it to a simmer over medium-low to medium heat. Simmer until it reduces slightly, about 3 minutes. Add it to the cooking liquid in the medium saucepan, stir well, and simmer together for another 3 minutes.
Fairly expensive
In a small bowl, whisk together the egg yolks, ¼ cup of the crème fraîche-cooking liquid mixture, and ¼ tsp. pepper. Add half of the remaining crème fraîche mixture to the yolk mixture in a slow stream, whisking constantly. Then pour it all back into the medium saucepan, whisking. Cook over very low heat, whisking, until just slightly thickened, about 1 minute. Do not boil. Remove from the heat, taste for seasoning, and salt as needed.
Divide the scallops among 4 small soup bowls, and then ladle the soup on top. Sprinkle with chives. Serve immediately.
Yield: 4 servings
http://orangette.blogspot.com/
Adapted from Gourmet and The Nouvelle Cuisine of Jean & Pierre Troisgros
serves 4 to 6
2 tablespoons unsalted butter
1 small onion, chopped
1 rib celery, chopped
1 1/2 teaspoon dried basil
Pinch of ground cloves
2 tablespoons flour
One 15-ounce can diced tomatoes in puree
Pinch of baking soda
2 cups chicken or vegetable stock, or water
1 cup milk, plus up to 1/2 cup more as needed
Tomato paste, as needed
Salt and freshly ground pepper
Melt the butter in a soup pot and add the chopped onions and celery. Cook for about five minutes, or until the vegetables are soft and wilted. Add the basil and cloves and cook another minute or two until fragrant, then add the flour. Continue cooking for another two minutes, stirring, and then add the tomatoes, followed by the baking soda and the stock.
Lower the heat and simmer for ten minutes or so. Remove the pot from the heat and carefully puree the soup in batches in a blender, or using a stick blender in the pot, off the heat. Return the soup to the heat and add the milk, stirring to blend. Add more milk or stock if the soup seems too thick. Add a little tomato paste if it needs more tomato flavor. Add some freshly ground black pepper and salt, to taste. Serve hot with optional garnishes, listed below.
Absolutely at its best when serves with grilled cheese sandwiches.
[[Recipe]] [[WelcomeToTiddlyspot]] [[GettingStarted]]
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
window.onClickTag_mptw_orig.apply(this,arguments);
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
// Thanks Saq, you're a genius :)
var popup = Popup.stack[Popup.stack.length-1].popup;
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
return false;
}
//}}}
Chicken
Leeks
Cabbage
Soy Sauce
Sesame Oil
Rice Wine
Chili Oil
Rice?
Begin by cutting a chicken into pieces, remove the skin if you like or leave it on. Bring 4 quarts of water to boil and drop the chicken pieces into the water along with 2 or 3 cloves of peeled garlic. Once the water comes back up to a boil turn the temperature down and poach the chicken on a low temp for 30 minutes or until cooked through. Once it’s cooked remove the chicken from the pan, and debone it. Throw the bones back into the poaching liquid and place the chicken in a serving dish and spoon some of the poaching juice over, splash it with soy sauce, sesame oil, rice wine, and chili oil.
Stir fry leeks and cabbage over high heat.
This step only takes a few minutes. Arrange the veggies alongside the chicken and add a spoonful of poaching juice over the chicken again. Serve with a medium grain white rice like Nishiki.
http://www.whatgeekseat.com/wordpress/2008/10/08/free_tibet_chicken/
Serves 4
1/2 cup dried gigante beans (or cannellini beans)
1 bay leaf
1/2 teaspoon salt
1/4 cup extra-virgin olive oil
1/3 cup thinly sliced onion
1/4 cup thinly sliced green bell pepper
1/4 cup thinly sliced red bell pepper
Black pepper, to taste
1 teaspoon minced garlic
2 tablespoons white wine vinegar
2 tablespoons chopped parsley
1. Place the beans in a bowl and cover with water. Let them stand overnight. Drain.
2. Place the beans in a medium pot and cover with 6 inches of water. Add the bay leaf and bring to a boil, skimming any foam that rises to the surface. Reduce the heat to low and simmer 1 1/2 hours or until the beans are tender. Season with the salt and cook an additional 5 minutes. Drain the beans and discard the bay leaf.
3. Meanwhile, heat the olive oil in a large skillet over medium heat. Add the onion and the bell peppers, lightly season with salt and black pepper, and stir frequently until the bell pepper mixture is tender, about 5 to 6 minutes. Add the garlic and vinegar and cook for 1 minute.
4. Add the beans and parsley to the bell pepper mixture. Adjust seasoning if necessary. Serve chilled.
1 cup dried lentils, preferably Green French Lentils de Puy
3 bay leaves
4 large cloves garlic
1/4 tsp. dried oregano (or more, I used about 1/2 tsp.)
1 red onion, chopped into pieces about 1/4 inch
1 red bell pepper, chopped into pieces about 1/4 inch
5 T finely chopped mint (or more, I used about 1/2 cup mint)
salt and fresh ground black pepper to taste
6 oz. Feta cheese, crumbled
(original recipe called for a garnish of chopped Kalamata olives, which I didn't use)
Dressing:
6 T good quality olive oil
6 T red wine vinegar
2 T fresh squeezed lime juice (optional, original recipe didn't use this but I liked the addition of lime)
1/2 tsp. ground cumin (or more, I used about 1 tsp.)
1 tsp. finely minced garlic
Rinse lentils and pick out any broken pieces or debris. Place lentils in a pan with enough water to cover by several inches, then add bay leaves, garlic, and oregano and bring to a boil. Lower heat and simmer gently for 20-25 minutes, until lentils are tender but still firm and slightly chewy. Drain well and cool.
Whisk together the dressing ingredients and season to taste with salt and fresh ground black pepper.
While lentils are cooling, chop onion and red bell pepper Put cooled lentils in a bowl, add red onion and red pepper, then gently stir in dressing. Taste for seasoning and add more salt, pepper, or vinegar if desired. Let salad marinate at room temperature for 20 minutes.
Just before serving, chop mint and add to salad. Sprinkle salad with chopped feta and serve.
1 large rainbow trout ( or 4 individual fish)
coarse sea salt
fresh ground pepper
vegetable oil
Sauce Vierge
1/2 cup extra-virgin olive oil
1 tsp. chopped capers
1 tsp. minced shallot
1/4 tsp. minced garlic
1 Tbsp. finely chopped chives
2 Tbsp. chopped fresh basil
1 Tbsp. fresh lemon juice
salt and pepper to taste
Wash, clean gut your trout and reserve in the fridge for up to 3 days (trout holds up well).
Bring your trout back to room temperature before grilling. Pre-heat your grill and follow my pre-grilling tips above.
Rub vegetable oil inside & out of the fish and season with coarse sea salt and fresh ground pepper.
Place the fish on your well-lubricated fish and grill on each side for 3-6 minutes (depending on thickness). I grilled this fish for 5 minutes per side.
Flip the fish and grill the other side for roughly the same amount of time.
To test for doneness, use your BBQ tongs to gently pinch the top part of the fish, where the dorsal fin is located. Your fish will be cooked perfectly when the upper bone easily comes off the body of the fish.
Using a spatula or two, carefully remove the fish from your grill and place on a platter. Using your hand and a spatula, make a cut into the fish, place the spatula between the piece of fish and the the spine and carefully lift each portion of fish to the plate.
Check for any remaining pin needles and remove them. Remind your guests to still be on the lookout for pin needles but let them know that rainbow trout has a large spinal column and that it makes for a very easy fillet.
Spoon a dollop of Sauce Vierge over each fillet along with a wedge of lemon.
1 cup raw baby spinach (two big handfuls)
1/2 cup berries of some sort (strawberries, mixed berries...mango...banana....frozen is better)
1 cup 8th Continent Light Vanilla Soy milk
Other "add-ins" - 1/3 cup tofu (silken, light, firm whatever...it all seems to work) OR whey powder OR cocoa OR any combination of all those... if it's too thick, thin it with either water OR apple juice
kale leaves, figs, banana, whey, and rice milk is a good combo.
An avocado can be added to most any smoothie.
Blend it up.
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
window.hideWhenLastTest = test;
if (test) {
removeChildren(place);
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place);
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place);
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place);
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place);
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
}},
hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title == params[0], place);
}},
showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title != params[0], place);
}},
'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !window.hideWhenLastTest, place);
}}
});
//}}}
Prep and Cook Time: 30 minutes
Ingredients:
½ lb ground or minced lamb shoulder or leg
1 medium sized onion quartered and sliced thin
2 TBS minced fresh ginger
3 medium cloves garlic, pressed
1 tsp garam masala
5 cups finely chopped kale
3 cups sweet potatoes, peeled and cut in 1 inch cubes (about 1 large potato)
1 cup + 1 TBS chicken broth
salt and white pepper to taste
Prepare all the vegetables by chopping and have ready.
Heat 1 TBS broth in a medium stainless steel large size braising pot or skillet. Healthy Sauté onion, garlic, ginger and lamb in broth over medium heat for about 5 minutes, stirring frequently.
Add garam masala, mixing well for about half a minute. Add 1 cup broth and stir in sweet potatoes and kale. Simmer on medium low heat covered for about 15 minutes, stirring occasionally, or until lamb, potatoes and kale are tender. Season with salt and pepper
Serves 4
http://whfoods.org/genpage.php?tname=recipe&dbid=81
If you don't have whole cardamom pods or stick cinnamon, add a pinch of each ground in with the cumin in step 4.
INGREDIENTS
2 cups long-grain rice, preferably Basmati
8 cups water
2 teaspoons salt
2 cloves
2 cardamom pods
One 2-inch piece of cinnamon
3 Tbsp vegetable oil (or ghee if you have it)
1/2 teaspoon dark mustard seeds
1/2 teaspoon cumin seeds
1/4 teaspoon chile flakes
1 medium onion, chopped
3 chopped garlic cloves
1/4 teaspoon turmeric
METHOD
1 Place rice in a sieve and run cool water through it to rinse it until the water runs clear. Soak the rice in cool water for 30 minutes. Drain.
2 Bring 8 cups of water and the salt to a boil in a large pot. Add the rice and stir. Add the cloves, cardamom and cinnamon and simmer for 10 minutes. Taste the rice, and test if it is done to your taste; rice can take more or less time to cook depending on how old it is. If still too firm, cook a few minutes longer.
3 When the rice is cooked to your liking, drain the rice into a colander and rinse with cold water to stop if from cooking. Remove the cloves, cardamom and cinnamon and discard. Set the rice aside to drain.
4 In a pan large enough to hold the rice, heat the oil over medium-high heat. Add the mustard and cumin seeds and the chile flakes. Cook until the mustard seeds start popping, then add the onion. Sauté until the onion begins to brown, about 5-7 minutes.
5 Add the garlic and sauté another 2-3 minutes. Add the rice and mix well. Sprinkle the turmeric over the rice and mix well. Cook for another 3-4 minutes, stirring often.
Yield: Serves 4-6.
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{
config.InstantTimestamp = {
// adjust to suit
timeFormat: 'DD/0MM/YY 0hh:0mm',
dateFormat: 'DD/0MM/YY',
translations: [
[/^!ts?$/img, "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/^!ds?$/img, "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],
// thanks Adapted Cat
[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
],
excludeTags: [
"noAutoCorrect",
"noTimestamp",
"html",
"CSS",
"css",
"systemConfig",
"systemConfigDisabled",
"zsystemConfig",
"Plugins",
"Plugin",
"plugins",
"plugin",
"javascript",
"code",
"systemTheme",
"systemPalette"
],
excludeTiddlers: [
"StyleSheet",
"StyleSheetLayout",
"StyleSheetColors",
"StyleSheetPrint"
// more?
]
};
TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
tags = tags ? tags : []; // just in case tags is null
tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
var conf = config.InstantTimestamp;
if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {
var now = new Date();
var trans = conf.translations;
for (var i=0;i<trans.length;i++) {
newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
}
}
// TODO: use apply() instead of naming all args?
return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}
// you can override these in StyleSheet
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");
//}}}
.5 lb ground beef
.5 lb bacon - browned, diced
2 tbsp chopped onion
1 can white kidney beans
1 can pork and beans
1 can red kidney beans
.5 c sugar
.25 c ketchup
.5 c bbq sauce
2 tbsp prepared mustard
pepper
salt
chili powder
Brown the beef; brown diced bacon and onion; drain fat.
Mix beans, sugar, ketchup, bbq sauce, and seasonings; add meats.
Bake 45 minutes.
olive oil or clarified butter
1 bunch of kale, destemmed, chopped/shredded, or other green
~3 cups cooked brown rice
To serve:
- capers, rinsed, dried, and pan-fried until blistered in butter
- a poached egg
- a dollop of salted greek yogurt
- a big drizzle of good extra-virgin olive oil
- lot's of za'atar
- toasted sesame seeds
In a large skillet or pot, heat the olive oil over medium heat. Add the kale and a couple pinches of salt. Saute until the kale softens a bit and brightens, just a minute or so. Stir in the rice, and cook until the rice is hot. If your rice is on the dry side, you might have to add a small splash of water.
Serve the kale rice topped with (preferably) all of the following: the capers, poached egg, yogurt drizzled with olive oil, and plenty of za'atar.
Serves 2-3.
Prep time: 5 min - Cook time: 5 min
http://www.101cookbooks.com/archives/kale-rice-bowl-recipe.html
*************************
za'atar
4 tablespoons fresh thyme leaves, stripped from stems (or equivalent dried)
2 teaspoons ground sumac*
scant 1/2 teaspoon fine sea salt, or to taste
1 tablespoon toasted sesame seeds
Place thyme leaves on a baking sheet in a 300F oven until dry, just ten minutes or so. Just long enough that they'll crumble between pinched fingers. Let cool.
Use a mortar and pestle to grind the thyme leave finely. If your thyme is at all stem-y or fibrous, sift to remove any larger particles. Transfer to a small bowl, and aside.
Crush the sumac finely with the mortar and pestle, add the salt and crush with the sumac. Add the thyme back, and grind together a bit. Stir in the sesame seeds, taste, and adjust to your liking, perhaps with a bit more salt, or sumac, or sesame seeds. Any za'atar you might not use in the coming days keeps best refrigerated (or in the freezer) if you make a double or triple batch.
Ingredients
* Olive oil
* 3 lbs of lamb shanks, each shank cut into a couple of pieces
* Salt and freshly ground pepper
* 6 garlic cloves, unpeeled
* 2 celery ribs, coarsely chopped
* 4 carrots, 2 coarsely chopped, 2 cut into 2-inch segments, and quartered lengthwise
* 1 large onion, coarsely chopped
* 1/2 cup tomato paste
* 1 cup dry red wine
* 3 cups chicken stock
* Two 1x3-inch strips of orange zest
* 1 medium rutabaga, roughly chopped (1 1/2 inch pieces)
* 1 medium turnip, roughly sliced or chopped (1 inch pieces)
* 2 parsnips, chopped
Gremolata
* 2 Tbsp chopped parsley
* 2 cloves of garlic, peeled and minced
* 2 teaspoons finely grated lemon zest
Method
1 Heat 2 Tbsp of olive oil in a large Dutch oven on medium high heat. Season the lamb shanks with salt and pepper, add them to the casserole and brown well on all sides, working in batches if necessary. Transfer the shanks to a plate.
2 Add the unpeeled garlic cloves, celery, chopped carrots (half of your carrots, the other half are cut lengthwise to be used later in the recipe) and onion to the pan. Cook over medium heat, stirring occasionally, until golden brown, about 10 minutes. Add the tomato paste and cook, stirring, about 2 minutes. Add the wine; boil over high heat until the liquid is very syrupy, about 5 minutes.
3 Return the shanks to the pot and add the stock and orange zest. Bring to a simmer. Cover the pan, reduce the heat to low, and braise the shank for 3 hours, or until the meat is falling off the bone tender; turn the shanks from time to time as they cook.
4 Preheat oven to 350°F. Put the root vegetables (turnip, rutabaga, parsnips, and lengthwise-cut carrots) in a large baking pan and toss with enough olive oil to coat. Season with salt and pepper and bake in the oven for about an hour, or until tender.
5 In a small bowl, mix the minced garlic with the parsley and lemon zest (the "gremolata"). Set aside.
6 Remove the shanks from the pot and transfer to a plate. Pass the sauce through a coarse strainer, pressing hard on the vegetables. Discard the vegetable pulp. Skim the fat from the surface of the sauce.
7 Return the sauce to the pan, season with salt and pepper and bring to a boil over moderately high heat. Separate the lamb meat from the bones. Add the lamb meat and root vegetables; simmer just until warmed through.
Garnish with the gremolata and serve.
Serves 4.
http://www.elise.com/recipes/archives/007380lamb_shank_stew_with_root_vegetables.php
Ingredients
6 Tbsp olive oil
4 Lamb shanks (1 lb each)
Salt and freshly ground pepper
Cloves separated from an entire head of garlic, unpeeled
6 celery ribs, coarsely chopped
4 carrots, coarsely chopped
1 large onion, coarsely chopped
1/2 cup tomato paste
3 cups dry red wine
6 cups chicken stock
Two 1x3-inch strips of orange zest
3 lbs butternut squash, peeled and cut into 1 inch cubes
4 Tbsp chopped parsley
4 cloves of garlic, peeled and minced
4 teaspoons finely grated lemon zest
1 1/3 cups cooked cannellini beans
Method
1 Heat 4 Tbsp of olive oil in a large cast-iron enameled casserole. Season the lamb shanks with salt and pepper, add them to the casserole and brown well on all sides, working in batches if necessary, about 8 minutes. Transfer the shanks to a plate.
2 Preheat the oven to 350°F and arrange two racks in the oven, one to hold the casserole and one to hold a baking sheet with the squash. Add the unpeeled garlic cloves, celery, carrots and onion to the casserole. Cook over moderate heat, stirring occasionally, until golden brown, about 8 minutes. Add the tomato paste and cook, stirring, until glossy, about 2 minutes. Add the wine; boil over high heat until the liquid is very syrupy, about 15 minutes.
3 Return the shanks to the casserole and add the stock and orange zest. Bring to a simmer. Cover the casserole and braise the shanks in the oven for about 2 hours, or until the meat is very tender (when we cooked this dish it took 3 hours); turn the shanks from time to time as they cook.
4 Meanwhile, on a large rimmed baking sheet, toss the squash with the remaining 2 Tbsp of olive oil. Season with salt and pepper and bake in the oven (along with the lamb) for about an hour, or until tender.
5 In a small bowl, mix the minced garlic with the parsley and lemon zest (the "gremolata"). Set aside.
6 Remove the shanks from the oven and transfer to a plate. Pass the sauce through a coarse strainer, pressing hard on the vegetables. Discard the vegetable pulp. Skim the fat from the surface of the sauce.
7 Return the sauce to the casserole, season with salt and pepper and bring to a boil over moderately high heat. Add the lamb shanks and squash; simmer just until warmed through. Add the cannellini beans, cover and remove from heat. Let stand for a few minutes to allow for the flavors to blend.
8 Spoon the vegetables and sauce into large shallow bowls and set the lamb shanks on top. Garnish with the gremolata and serve.
Serves 4 (or up to 6 if you remove the bones from the shanks before serving).
http://simplyrecipes.com/recipes/lamb_shanks_with_butternut_squash/
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second. So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only. Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{
var MINS = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS = 24 * HOURS;
if (!config.lessBackups) {
config.lessBackups = {
// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
modes: [
["YYYY", 365*DAYS], // one per year for ever
["MMM", 31*DAYS], // one per month
["ddd", 7*DAYS], // one per weekday
//["d0DD", 1*DAYS], // one per day of month
["h0hh", 24*HOURS], // one per hour
["m0mm", 1*HOURS], // one per minute
["s0ss", 1*MINS], // one per second
["latest",0] // always keep last version. (leave this).
]
};
}
window.getSpecialBackupPath = function(backupPath) {
var now = new Date();
var modes = config.lessBackups.modes;
for (var i=0;i<modes.length;i++) {
// the filename we will try
var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')
// open the file
try {
if (config.browser.isIE) {
var fsobject = new ActiveXObject("Scripting.FileSystemObject")
var fileExists = fsobject.FileExists(specialBackupPath);
if (fileExists) {
var fileObject = fsobject.GetFile(specialBackupPath);
var modDate = new Date(fileObject.DateLastModified).valueOf();
}
}
else {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(specialBackupPath);
var fileExists = file.exists();
if (fileExists) {
var modDate = file.lastModifiedTime;
}
}
}
catch(e) {
// give up
return backupPath;
}
// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
// June file on disk that's more than an month old then it must be stale so overwrite
// note that "latest" should be always written because the expiration period is zero (see above)
var expiry = new Date(modDate + modes[i][1]);
if (!fileExists || now > expiry)
return specialBackupPath;
}
}
// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}
//}}}
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
major: 1, minor: 1, revision: 0,
date: new Date("mar 17, 2007"),
source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};
if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};
bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){
url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
}
return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.
[[Recipes|Recipe]][[WelcomeToTiddlyspot]] [[GettingStarted]]
Prep and Cook Time: 20 - 35 min depending on marinating time
Ingredients:
4 medium beets, about 3" in diameter
1 TBS extra virgin olive oil
1 TBS balsamic vinegar
1 TBS fresh minced chives
salt and cracked black pepper to taste
Fill the bottom of a steamer with 2 inches of water.
While the water is coming to a boil, wash beets, leaving 2 inches of tap root and 1 inch of the stem on the beets. Cut beets into quarters. Do not peel.
Steam covered for 15 minutes. Beets are cooked when you can easily insert a fork on the tip of a knife into the beet. Although some of their colorful phytonutrients are lost to the stemaing water, there is plenty of color and nutrients left in the beets.
Peel beets by setting them on a cutting board and rubbing skin off with a paper towel. Wearing kitchen gloves will help prevent staining your hands.
Transfer to a bowl. It is best to toss the beets with the remaining ingredients while they are still hot.
Let them marinate for at least 15 minutes for fuller flavor.
Serves 4
http://www.whfoods.com/genpage.php?tname=recipe&dbid=98
Prep and Cook Time: 15 minutes
Ingredients:
2 medium bunches kale, chopped about 12 cups
2 TBS lemon juice
1 tsp soy sauce
3 medium cloves garlic, pressed
extra virgin olive oil to taste
salt & black pepper to taste
Bring lightly salted water to a boil in a steamer with a tight fitting lid. The salt helps to enhance flavor and color of vegetables.
While water is coming to a boil, fold each kale leaf in half and pull or cut out stem. Chop leaf and rinse in colander.
When water comes to a boil add kale to steamer basket and cover. Steam for 7-10 minutes, until tender.
Toss with rest of ingredients and serve.
http://whfoods.org/genpage.php?tname=recipe&dbid=95
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300
This is in progress. Help appreciated.
Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/***
|Name:|MptwConfigPlugin|
|Description:|Miscellaneous tweaks used by MPTW|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
***/
//{{{
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;
config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit
readOnly = false; // needed because the above doesn't work any more post 2.1 (??)
showBackstage = true; // show backstage for same reason
config.options.chkInsertTabs = true; // tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = ""; // don't need message when a tiddler doesn't exist
config.views.editor.defaultText = ""; // don't need message when creating a new tiddler
config.options.chkSaveBackups = true; // do save backups
config.options.txtBackupFolder = 'twbackup'; // put backups in a backups folder
config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file
config.mptwVersion = "2.5.2";
config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};
if (config.options.txtTheme == '')
config.options.txtTheme = 'MptwTheme';
// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";
// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see AdvancedOptions)/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");
// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';
//}}}
Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
|Name|MptwRounded|
|Description|Mptw Theme with some rounded corners (Firefox only)|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|PageTemplate|MptwTheme##PageTemplate|
|StyleSheet|##StyleSheet|
!StyleSheet
/*{{{*/
[[MptwTheme##StyleSheet]]
.tiddler,
.sliderPanel,
.button,
.tiddlyLink,
.tabContents
{ -moz-border-radius: 1em; }
.tab {
-moz-border-radius-topleft: 0.5em;
-moz-border-radius-topright: 0.5em;
}
#topMenu {
-moz-border-radius-bottomleft: 2em;
-moz-border-radius-bottomright: 2em;
}
/*}}}*/
Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|
http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)
!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
!ViewTemplate
<!--{{{-->
[[MptwTheme##ViewTemplateToolbar]]
<div class="tagglyTagged" macro="tags"></div>
<div class='titleContainer'>
<span class='title' macro='view title'></span>
<span macro="miniTag"></span>
</div>
<div class='subtitle'>
(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
by <span macro='view modifier link'></span>)
<!--
(<span macro='message views.wikified.createdPrompt'></span>
<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
-->
</div>
<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
<div class='viewer' macro='view text wikified'></div>
</div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<!--}}}-->
!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>
<span macro="showWhenTagged systemConfig">
<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
</span>
<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
<span style="padding:1em;"></span>
<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
</div>
<!--}}}-->
!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<!--}}}-->
!StyleSheet
/*{{{*/
/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
background: [[ColorPalette::TertiaryLight]];
}
/* sexy colours and font for the header */
.headerForeground {
color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
color: [[ColorPalette::PrimaryMid]];
}
/* separate the top menu parts */
.headerForeground, .headerShadow {
padding: 1em 1em 0;
}
.headerForeground, .headerShadow {
font-family: 'Trebuchet MS' sans-serif;
font-weight:bold;
}
.headerForeground .siteSubtitle {
color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
color: [[ColorPalette::PrimaryMid]];
}
/* make shadow go and down right instead of up and left */
.headerShadow {
left: 1px;
top: 1px;
}
/* prefer monospace for editing */
.editor textarea, .editor input {
font-family: 'Consolas' monospace;
background-color:[[ColorPalette::TertiaryPale]];
}
/* sexy tiddler titles */
.title {
font-size: 250%;
color: [[ColorPalette::PrimaryLight]];
font-family: 'Trebuchet MS' sans-serif;
}
/* more subtle tiddler subtitle */
.subtitle {
padding:0px;
margin:0px;
padding-left:1em;
font-size: 90%;
color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
color: [[ColorPalette::TertiaryMid]];
}
/* a little bit of extra whitespace */
.viewer {
padding-bottom:3px;
}
/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
background-color: transparent;
color: [[ColorPalette::Foreground]];
}
/* give tiddlers 3d style border and explicit background */
.tiddler {
background: [[ColorPalette::Background]];
border-right: 2px [[ColorPalette::TertiaryMid]] solid;
border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
margin-bottom: 1em;
padding:1em 2em 2em 1.5em;
}
/* make options slider look nicer */
#sidebarOptions .sliderPanel {
border:solid 1px [[ColorPalette::PrimaryLight]];
}
/* the borders look wrong with the body background */
#sidebar .button {
border-style: none;
}
/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
display:inline;
}
/* horizontal main menu stuff */
#displayArea {
margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
display: none;
}
#topMenu {
background: [[ColorPalette::PrimaryMid]];
color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
margin-left: 0.5em;
margin-right: 0.5em;
padding-left: 3px;
padding-right: 3px;
color: [[ColorPalette::PrimaryPale]];
font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
background: [[ColorPalette::PrimaryDark]];
}
/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
visibility:hidden;
}
.selected .toolbar {
visibility:visible;
}
/* experimental. this is a little borked in IE7 with the button
* borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }
/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
display:inline;
}
/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
padding:0.5em;
display:block;
}
#sidebarOptions .sliderPanel .select br {
display:none;
}
/* make it print a little cleaner */
@media print {
#topMenu {
display: none ! important;
}
/* not sure if we need all the importants */
.tiddler {
border-style: none ! important;
margin:0px ! important;
padding:0px ! important;
padding-bottom:2em ! important;
}
.tagglyTagging .button, .tagglyTagging .hidebutton {
display: none ! important;
}
.headerShadow {
visibility: hidden ! important;
}
.tagglyTagged .quickopentag, .tagged .quickopentag {
border-style: none ! important;
}
.quickopentag a.button, .miniTag {
display: none ! important;
}
}
/* get user styles specified in StyleSheet */
[[StyleSheet]]
/*}}}*/
|Name|MptwTrim|
|Description|Mptw Theme with a reduced header to increase useful space|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|StyleSheet|MptwTheme##StyleSheet|
|PageTemplate|##PageTemplate|
!PageTemplate
<!--{{{-->
<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
</div>
<div id='sidebar'>
<div id='sidebarOptions'>
<div refresh='content' tiddler='SideBarOptions'></div>
<div style="margin-left:0.1em;"
macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
</div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
/***
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
***/
//{{{
// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';
// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';
// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';
// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;
//}}}
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
newHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
},
newJournalHere: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
}
}
});
//}}}
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{
// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;
String.prototype.getNextFreeName = function() {
var numberRegExp = / \(([0-9]+)\)$/;
var match = numberRegExp.exec(this);
if (match) {
var num = parseInt(match[1]) + 1;
return this.replace(numberRegExp," ("+num+")");
}
else {
return this + " (1)";
}
}
config.macros.newTiddler.checkForUnsaved = function(newName) {
var r = false;
story.forEachTiddler(function(title,element) {
if (title == newName)
r = true;
});
return r;
}
config.macros.newTiddler.getName = function(newName) {
while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
newName = newName.getNextFreeName();
return newName;
}
config.macros.newTiddler.onClickNewTiddler = function()
{
var title = this.getAttribute("newTitle");
if(this.getAttribute("isJournal") == "true") {
title = new Date().formatString(title.trim());
}
// ---- these three lines should be the only difference between this and the core onClickNewTiddler
if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
title = config.macros.newTiddler.getName(title);
var params = this.getAttribute("params");
var tags = params ? params.split("|") : [];
var focus = this.getAttribute("newFocus");
var template = this.getAttribute("newTemplate");
var customFields = this.getAttribute("customFields");
if(!customFields && !store.isShadowTiddler(title))
customFields = String.encodeHashMap(config.defaultCustomFields);
story.displayTiddler(null,title,template,false,null,null);
var tiddlerElem = story.getTiddler(title);
if(customFields)
story.addCustomFields(tiddlerElem,customFields);
var text = this.getAttribute("newText");
if(typeof text == "string")
story.getTiddlerField(title,"text").value = text.format([title]);
for(var t=0;t<tags.length;t++)
story.setTiddlerTag(title,tags[t],+1);
story.focusTiddler(title,focus);
return false;
};
//}}}
Best Buttermilk Pancakes
The key to fluffy pancakes is not to overmix the batter; it should not be beaten smooth. If serving these pancakes with bacon, reserve half a teaspoon of bacon drippings to grease the griddle instead of butter.
Makes nine 6-inch pancakes
Ingredients
2 cups all-purpose flour
2 teaspoons baking powder
1 teaspoon baking soda
1/2 teaspoon salt
3 tablespoons sugar
2 large eggs, lightly beaten
3 cups buttermilk
4 tablespoons unsalted butter, melted, plus 1/2 teaspoon for griddle
Directions
Heat griddle to 375 degrees. Whisk together flour, baking powder, baking soda, salt, and sugar in a medium bowl. Add eggs, buttermilk, and 4 tablespoons butter; whisk to combine. Batter should have small to medium lumps.
Heat oven to 175 degrees. Test griddle by sprinkling a few drops of water on it. If water bounces and spatters off griddle, it is hot enough. Using a pastry brush, brush remaining 1/2 teaspoon of butter or reserved bacon fat onto griddle. Wipe off excess.
Using a 4-ounce ladle, about 1/2 cup, pour pancake batter, in pools 2 inches away from one other. When pancakes have bubbles on top and are slightly dry around edges, about 2 1/2 minutes, flip over. Cook until golden on bottom, about 1 minute.
Repeat with remaining batter, keeping finished pancakes on a heatproof plate in oven. Serve warm.
http://www.marthastewart.com/318689/best-buttermilk-pancakes
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
(Makes 4 side-dish servings, recipe created by Kalyn)
1 can pinto beans, rinse and drain very well
4-5 tsp. white balsamic vinegar or champagne vinegar
1 avocado, diced into pieces 1/2 inch square
2 tsp. fresh lime juice
1 cup chopped tomatoes (cherry tomatoes cut in half would be great too, but I had medium tomatoes which I cut in eighths)
1/2 cup finely chopped red onion
1/2 cup finely chopped cilantro
1-2 T olive oil, or a bit more
fresh ground black pepper and sea salt to taste
Pour beans into a colander placed in the sink and rinse well until no more foam appears. Let beans drain well for at least 15 minutes. Then blot beans dry with paper towel, place in plastic bowl, and toss with white balsamic vinegar. Let beans marinate in the vinegar while you prep other ingredients.
Cut avocado into 1/2 inch pieces and place in small bowl. Toss with lime juice. Chop tomatoes, or if using cherry tomatoes, cut in half.
Chop red onion and cilantro. (I like to chop with a chef's knife, but you could use a mini-chopper or food processor for this.) Mix onions and cilantro into marinating beans. Then use a large spoon to gently fold in avocado and tomato. Drizzle olive oil over salad and season to taste with fresh ground black pepper and sea salt, and gently toss again. Serve immediately, at room temperature.
Variations: I think other varieties of beans would also be tasty in this combination. Tonight I'm making the salad for my dad and stepmother, and I'm using black beans because my dad loves them.
Pasted from <http://kalynskitchen.blogspot.com/2008/03/pinto-bean-salad-recipe-with-avocado.html>
Ingredients:
4 free range chicken eggs
1 tsp apple cider vinegar, or any other light vinegar
about 4 cups water
3 + 1 TBS chicken or vegetable broth
2 cans of black beans, drained
1 medium onion, minced
4 medium cloves garlic, chopped
2 tsp ground cumin
1 1/2 TBS red chili powder
2 TBS chopped fresh cilantro
salt and black pepper to taste
prepared salsa
2 cups shredded romaine lettuce
1 large avocado, cubed
Mince onion and chop garlic and let sit for 5 minutes to bring out their health-promoting benefits.
Bring water and vinegar to a light boil in a shallow pan. Make sure there is enough water to cover eggs.
In a separate stainless steel skillet heat 1 TBS broth. Healthy Sauté onion in broth over medium heat for about 3 minutes stirring frequently, until translucent. Add garlic, beans, red chili powder, cumin, and rest of broth while egg water is coming to a boil. Cook beans for about 10 minutes on medium low heat, stirring occasionally. Add cilantro, salt and pepper.
To poach eggs, crack into water and cook about 5 minutes, just until the white is set and the yolk have filmed over. Remove with a slotted spoon, and place eggs over beans. Serve with salsa, shredded romaine lettuce and avocado.
Serves 4
http://whfoods.org/genpage.php?tname=recipe&dbid=56
3 lb pork shoulder (butt)
1 tsp oil
3/4 c flour
3 c chicken stock
5 c roasted green peppers
1 tbsp fresh orgenao
5 jalepeno
1 tsp minced garlic
4 oz can chopped tomato
cumin
clili powder
Cut pork in cubes. Brown in oil. Add flower and spices. Stir to avoid lumps. Slowly add broth, then remaining ingredients. Boil, then simmer 2 hours.
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
var diff = (((new Date()).getTime() - this.getTime()) / 1000);
var day_diff = Math.floor(diff / 86400);
if (isNaN(day_diff)) return "";
else if (diff < 0) return "in the future";
else if (diff < 60) return "just now";
else if (diff < 120) return "1 minute ago";
else if (diff < 3600) return Math.floor(diff/60) + " minutes ago";
else if (diff < 7200) return "1 hour ago";
else if (diff < 86400) return Math.floor(diff/3600) + " hours ago";
else if (day_diff == 1) return "Yesterday";
else if (day_diff < 7) return day_diff + " days ago";
else if (day_diff < 14) return "a week ago";
else if (day_diff < 31) return Math.ceil(day_diff/7) + " weeks ago";
else if (day_diff < 62) return "a month ago";
else if (day_diff < 365) return "about " + Math.ceil(day_diff/31) + " months ago";
else if (day_diff < 730) return "a year ago";
else return Math.ceil(day_diff/365) + " years ago";
}
Date.prototype.formatString_orig_mptw = Date.prototype.formatString;
Date.prototype.formatString = function(template) {
return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}
// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)';
config.mptwDateFormat = 'pppp';
//}}}
Prep and Cook Time: 15 minutes
Ingredients:
2 cans navy beans, drained
1 medium onion, chopped
6 cloves garlic, chopped
1 tsp chopped fresh rosemary
1 + 2 TBS vegetable broth
salt and black pepper to taste
Chop onions and garlic and let sit for 5 minutes to bring out their health-promoting properties
Heat 1 TBS broth in a 10-inch stainless steel skillet. Healthy Sauté onions in broth over medium heat for 5 minutes stirring frequently, until translucent. Add garlic and continue to sauté for another minute stirring constantly.
Add beans, rosemary and the remaining 2 TBS of broth. Cook for another 5 minutes.
Puree in blender making sure you don't fill more than half full, and start on low speed. You will have to stop the blender a couple times and scrape the sides with a rubber spatula. Season with salt and pepper.
http://whfoods.org/genpage.php?tname=recipe&dbid=143
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {
dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?
createTagButton: function(place,tag,excludeTiddler) {
// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
var splitTag = tag.split("|");
var pretty = tag;
if (splitTag.length == 2) {
tag = splitTag[1];
pretty = splitTag[0];
}
var sp = createTiddlyElement(place,"span",null,"quickopentag");
createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tag]),onClickTag);
theTag.setAttribute("tag",tag);
if (excludeTiddler)
theTag.setAttribute("tiddler",excludeTiddler);
return(theTag);
},
miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tagged = store.getTaggedTiddlers(tiddler.title);
if (tagged.length > 0) {
var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
theTag.setAttribute("tag",tiddler.title);
theTag.className = "miniTag";
}
},
allTagsHandler: function(place,macroName,params) {
var tags = store.getTags(params[0]);
var filter = params[1]; // new feature
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
for(var t=0; t<tags.length; t++) {
var title = tags[t][0];
if (!filter || (title.match(new RegExp('^'+filter)))) {
var info = getTiddlyLinkInfo(title);
var theListItem =createTiddlyElement(ul,"li");
var theLink = createTiddlyLink(theListItem,tags[t][0],true);
var theCount = " (" + tags[t][1] + ")";
theLink.appendChild(document.createTextNode(theCount));
var theDropDownBtn = createTiddlyButton(theListItem," " +
config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
theDropDownBtn.setAttribute("tag",tags[t][0]);
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
" { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
""].join("\n"),
init: function() {
// we fully replace these builtins. can't hijack them easily
window.createTagButton = this.createTagButton;
config.macros.allTags.handler = this.allTagsHandler;
config.macros.miniTag = { handler: this.miniTagHandler };
config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
store.addNotification("QuickOpenTagStyles",refreshStyles);
}
}
config.quickOpenTag.init();
//}}}
Makes 6 servings, Recipe adapted from Regina Schrambling's Collard Squares.)
1 bunch Red Russian Kale, chopped, or use any other variety of kale
1/2 red onion, chopped
2 cloves garlic, minced (1/2 tsp. teaspoon minced garlic)
1/2 tsp. olive oil
1 tsp. Tamari or other soy sauce
1 C grated cheese (I used a blend of low-fat cheese called Pizza Cheese which has mozarella, provolone, romano, and parmesan)
1/4 cup 100% whole wheat bread crumbs (optional; I've made this successfully without the bread crumbs)
6 eggs, beaten well
1/2 tsp. Spike Seasoning
Preheat oven to 350F. Cut off kale stems and discard, then wash kale leaves and dry well. (I used a salad spinner.) Pile kale leaves up on top of each other and cut into strips about 3/4 inch wide, then turn cutting board the other way and cut again so you have squares just under an inch square. Chop onion into pieces about 1/2 inch.
Heat olive oil in large heavy frying pan, then add onions and saute 3 minutes. Add garlic and saute about 2 more minutes, then add kale, turning over as it wilts and sauteeing about 5 minutes, or until kale is significantly wilted and softened.
Put sauteed vegetables into large bowl and add Tamari, cheese, bread crumbs, beaten eggs, and Spike seasoning. Stir gently until ingredients are well distributed. Spray pen with olive oil or nonstick spray and pour in egg mixture. (I was cooking it in my Oster Toaster Oven, and used a pan that's 11.5 X 7.5 inches.) Bake 20-25 minutes until eggs are well set and the top is lightly browned. Serve hot. This is good with low-fat sour cream or salsa.
1 lb dried pinto beans
2 tbsp minced garlic
1 tomato
2 tbsp cumin
1 tbsp chili powder
2 tbsp oil
Put beans in pot and cover with water by 1 inch, boil; drain; rinse. Cover by 2 inches and boil then simmer 4 hours. Mash, add garlic and olive oil. Cook 30 minutes.
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {
prompts: {
rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
remove: "Remove the tag '%0' from %1 tidder%2?"
},
removeTag: function(tag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,tag);
}
store.resumeNotifications();
store.notifyAll();
},
renameTag: function(oldTag,newTag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new
}
store.resumeNotifications();
store.notifyAll();
},
storeMethods: {
saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,
saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
if (title != newTitle) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0) {
// then we are renaming a tag
if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
config.renameTags.renameTag(title,newTitle,tagged);
if (!this.tiddlerExists(title) && newBody == "")
// dont create unwanted tiddler
return null;
}
}
return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
},
removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,
removeTiddler: function(title) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0)
if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
config.renameTags.removeTag(title,tagged);
return this.removeTiddler_orig_renameTags(title);
}
},
init: function() {
merge(TiddlyWiki.prototype,this.storeMethods);
}
}
config.renameTags.init();
//}}}
Roasted Curried Leg of Lamb
Ingredients:
7 to 5 lbs leg of lamb (bone-in)
Dry ingredients:
1 large onion (chopped)
6 cloves garlic
2 inch piece ginger (chopped)
1 serrano pepper
1 cup cilantro (30 g)
2 limes (juice and zest)
Wet Ingredients:
¼ cup coconut milk
¼ cup olive oil
Spice Mix:
2 Tbsp. curry powder
1 tsp. garam masala
1 tsp. cumin
1 tsp. chili powder
½ tsp. red pepper flakes
¼ tsp. cinnamon
2 tsp. salt
Directions:
1. Add all the dry ingredients and the spice mix into a blender or food processor. Slowly add both the wet ingredients until a paste is formed. You may need to modify the amount of liquid suggested.
2. Coat the leg of lamb in the paste.
3. Preheat oven to 325.
4. Roast for approximately 90 minutes or until the meat reaches an internal temperature of 135-140F at the thickest point. This is medium and you can safely eat it at cooler temperature, but this is our suggested temperature.
5. Cover with aluminum foil and let rest for 20 min.
6. Slice and serve.
Yogurt-Mint Sauce
Ingredients:
1 cup plain yogurt (can substitute sour cream)
½ cup mint leaves (chopped)
¼ tsp. salt
juice of ½ lime
Directions:
1. Combine all ingredients and mix thoroughly. Adjust seasoning to taste.
Prep and Cook Time: 15 minutes
Ingredients:
12 lamb chops
6 TBS fresh lemon juice
3 TBS chopped fresh rosemary,
3 medium cloves garlic pressed, ¼ tsp salt
¼ tsp black pepper
Press garlic and let sit for at least 5 minutes to bring out its hidden health benefits.
Mix together lemon juice, rosemary, pressed garlic, salt and pepper. Rub lamb chops with mixture. Set aside on plate.
Preheat broiler on high heat, and place a stainless steel or cast iron skillet large enough to hold the lamb chops under the heat for about 10 minutes to get very hot (about 5-7 inches from the heat source). Be sure that the handle is also metal.
Once pan is hot, place lamb chops in pan, and return to broiler for about 4-5 minutes, depending on thickness of lamb. Lamb is cooked quickly as it is cooking on both sides at the same time. This is our Quick Broil cooking method.
Serves 4
Serve with [[Pureed Navy Beans]]
[[Mediterranean Kale]]
http://whfoods.org/genpage.php?tname=recipe&dbid=18
2 c water
2 oz dehydrated milk
4 oz poatao flakes
1 can salmon, 14.5 oz
bread crumbs
8 tbsp bread crumbs
fat for frying
Combine water, milk, potato flakes. Heat to thicken potatos. Add salmon and 2 tbsp crumbs, salt and pepper. Form into patties. Dredge in 6 tbsp crumbs. Pan fry for 3 minutes per side.
Serve with [[Sundried Tomato Pasta]] or pasta with a packaged alfredo.
Sausage and kale stew with mashed potatoes
1 lb sausage
1 lg onion chopped
1 28 oz can diced tomatoes
2 tbsp tomato paste
2 chopped garlic cloves
2 large russet potatoes
1 bunch kale, stems discarded and leaves torn (about 7 cups)
1/2 cup milk
1/2 cup olive oil
Combine sausage, onion, tomatoes, paste, garlic, 1 cup water, 3/4 tsp salt and pepper in slow cooker. Nestlé potatoes in liquid and top with kale
Cook on low for 7-8 hrs or on high for 4-5 hrs.
Transfer potatoes to medium bowl. Add milk, oil and salt and pepper to taste. Mash.
Serve stew topped with potatoes.
Serves 6
1lb brussels sprouts, halved
4 slices bacon, sliced
1/2 red onion, sliced
Splash of lemon juice
Salt to taste
To the skillet or cast iron pan, add the bacon and cook until most of its fat has rendered out.
Add the brussels sprouts and onion and saute until they begin to brown and soften. 8-10 minutes.
Finish with a splash of lemon juice, and salt to taste.
/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{
saveCloseTiddler: {
text: 'done/close',
tooltip: 'Save changes to this tiddler and close it',
handler: function(ev,src,title) {
var closeTitle = title;
var newTitle = story.saveTiddler(title,ev.shiftKey);
if (newTitle)
closeTitle = newTitle;
return config.commands.closeTiddler.handler(ev,src,closeTitle);
}
},
cancelCloseTiddler: {
text: 'cancel/close',
tooltip: 'Undo changes to this tiddler and close it',
handler: function(ev,src,title) {
// the same as closeTiddler now actually
return config.commands.closeTiddler.handler(ev,src,title);
}
}
});
//}}}
Seared Jumbo Scallops with Cauliflower Puree & Grilled Asparagus
(serves 2)
1 lb jumbo sea scallops (about 10)
1 small head cauliflower
2 cloves garlic
1 bunch asparagus
2-4 tbs snipped fresh chives
1/2 c Greek yogurt
1/2 tbs butter
Olive oil spray (or you can brush/drizzle)
Salt and pepper to taste
Seasoning salt
Directions:
Bring a large stockpot of water to boil. Add chopped cauliflower and whole cloves garlic. Simmer until cauliflower is fork-tender. Drain and remove from heat, mash with a fork until cauliflower and garlic are completely pureed. Add chives and Greek yogurt, stir to incorporate.
Meanwhile, heat a grill pan over medium heat. Spray or drizzle asparagus with olive oil, salt and pepper. Grill until just done and still crisp.
Meanwhile, in a saute pan, heat butter until foam subsides. Season scallops on both sides with seasoning salt. Place scallops in pan and do not move until they can be moved freely (not sticking at all). Turn over and remove from heat. The heat of the pan will continue to cook until perfect.
To serve, mound approx 1 c cauliflower puree in the center of the plate. Top with asparagus spears, then scallops. Garnish with chives and serve immediately.
Pasted from <http://homecookkirsten.blogspot.com/2008/03/seared-jumbo-scallops-with-cauliflower.html>
/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0.1 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware.
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{
config.macros.selectTheme = {
label: {
selectTheme:"select theme",
selectPalette:"select palette"
},
prompt: {
selectTheme:"Select the current theme",
selectPalette:"Select the current palette"
},
tags: {
selectTheme:'systemTheme',
selectPalette:'systemPalette'
}
};
config.macros.selectTheme.handler = function(place,macroName)
{
var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
// want to handle palettes and themes with same code. use mode attribute to distinguish
btn.setAttribute('mode',macroName);
};
config.macros.selectTheme.onClick = function(ev)
{
var e = ev ? ev : window.event;
var popup = Popup.create(this);
var mode = this.getAttribute('mode');
var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
// for default
if (mode == "selectPalette") {
var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',"(default)");
btn.setAttribute('mode',mode);
}
for(var i=0; i<tiddlers.length; i++) {
var t = tiddlers[i].title;
var name = store.getTiddlerSlice(t,'Name');
var desc = store.getTiddlerSlice(t,'Description');
var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',t);
btn.setAttribute('mode',mode);
}
Popup.show();
return stopEvent(e);
};
config.macros.selectTheme.onClickTheme = function(ev)
{
var mode = this.getAttribute('mode');
var theme = this.getAttribute('theme');
if (mode == 'selectTheme')
story.switchTheme(theme);
else // selectPalette
config.macros.selectTheme.updatePalette(theme);
return false;
};
config.macros.selectTheme.updatePalette = function(title)
{
if (title != "") {
store.deleteTiddler("ColorPalette");
if (title != "(default)")
store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
config.options.txtUserName,undefined,"");
refreshAll();
if(config.options.chkAutoSave)
saveChanges(true);
}
};
config.macros.applyTheme = {
label: "apply",
prompt: "apply this theme or palette" // i'm lazy
};
config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var useTiddler = params[0] ? params[0] : tiddler.title;
var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
btn.setAttribute('theme',useTiddler);
btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}
config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;
config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};
//}}}
½ white or Savoy cabbage
¼ - 1/3 C extra virgin olive oil
125g finely grated parmigiano reggiano
aged balsamic vinegar (preferably >8 years old)
Discard outer leaves of your cabbage and then get to work shaving as finely as you can with a sharp knife, discarding any thick ribs as you go. Place in a large bowl, drizzle over 1/4 C oil and toss. If the salad seems a little dry, toss through some more oil. Allow to stand for at least 15mins or up to a couple of hours.
Toss though cheese and season with s&p. Arrange on a serving platter or salad bowl and drizzle over a sparing amount of balsamic. Great as a side dish to pasta especially if it happens to be served alongside fresh tagliatelle al ragu cooked by a cute Irishman.
2 onions, diced
2 ribs celery, diced
1 cup diced green bell pepper
3-4 cloves garlic, minced
2 cups dried black-eyed peas, picked over and rinsed
6 cups water
1 pound collard greens, tough stems removed and greens chopped
1 1/2 teaspoons dried thyme (divided)
1 teaspoon oregano (divided)
1 16-ounce can tomatoes (fire-roasted preferred)
2 cups water (or vegetable broth)
1 tablespoon hot sauce
1/4 teaspoon cayenne (to taste)
1/2 teaspoon chipotle pepper -- (to taste)
1/2 teaspoon smoked Spanish paprika
1 -2 teaspoons salt (to taste)
1 tablespoon double strength tomato paste (or 2 tbsp. regular)
1/4 teaspoon black pepper
Spray a large pot with a light coating of olive oil. Heat it and add the onions. Sauté for about 5 minutes, until they begin to brown. Add the celery, green pepper, and garlic, and cook, stirring, for 3 more minutes.
Add the black-eyed peas, water, 1 teaspoon of the thyme, and 1/2 teaspoon of oregano.
Cook until peas are tender, about 45-55 minutes.
Once the peas are tender, add all remaining ingredients and cook for at least 25 minutes to allow flavors to develop. Serve with brown rice with additional hot sauce. (Garnishing with fresh oregano is optional.)
4 cups thinly sliced green cabbage
2 cups thinly sliced red cabbage
(You can use all green or all red cabbage.)
2 green onions, thinly sliced
1/2 cup chopped cilantro (or more)
4 T mayo
3 T fresh lime juice (more or less to taste)
hot sauce to taste (I used about 1/2 tsp. green Tabasco sauce)
salt to taste (I used Vege-Sal)
Thinly slice cabbage, using a mandoline or food processor if desired. Slice green onions, and wash, dry and chop cilantro. (I use a Mini salad spinner to wash herbs and spin them dry.) Combine cabbage, green onions and cilantro in large salad bowl.
In small bowl, wisk together, mayo, lime juice, and hot sauce. (You may want to start with less than the full amount of lime juice and hot sauce and keep adding until you have the desired blend of sour/hot flavor.)
Use a wooden spoon to mix dressing into cabbage mixture. Season to taste with salt and serve immediately, or chill for a few hours.
This salad will keep well overnight in the refrigerator, but the lime juice will cause the red cabbage to bleed color and turn the salad slightly pink. If you're making extra you might want to use all green cabbage, although I didn't mind the pink color at all when I ate the leftovers!
http://kalynskitchen.blogspot.com/2008/04/recipe-for-spicy-mexican-slaw-with-lime.html
Per Serving
Olive oil
Chopped onion
Chopped garlic
Handful of fresh chopped spinach, stems removed if tough
Salt & pepper to taste
Cream or half & half, just enough to bind the spinach
1 egg
Seasoning (I used Lawry's)
Heat a non-stick skillet on MEDIUM HIGH. Add the olive oil til it shimmers. Add the onion and garlic and cook til just softened. Add the spinach, stir to coat with fat. Let cook, stirring often, til spinach softens. Season the spinach. With a spatula, arrange the spinach into a donut shape, with the center left open clear to the bottom of the skillet. Reduce heat to MEDIUM or MEDIUM LOW. Drop in an egg. While the egg cooks, drizzle a little cream over the spinach, use the tip of the skillet to press inward to compact a bit. Cover the skillet so the egg will cook evenly from both sides. When the egg is nearly cooked, sprinkle it with a seasoning salt or more salt and pepper. Gently slip the egg onto a plate for serving.
Serves 6
Several quarts of water
8 cups fresh spinach leaves, stemmed (1 pound)
Vegetable oil spray, if needed
15-ounce can black beans, drained and rinsed
1/2 cup low-sodium salsa
1/4 teaspoon ground cumin
1/4 teaspoon chili powder
6 6-inch corn tortillas or nonfat or low-fat flour tortillas
1/2 cup nonfat or low-fat sour cream
1 1/2 to 2 teaspoons lime juice
4 ounces shredded nonfat or low-fat Monterey Jack cheese (about 1 cup)
2 Italian plum tomatoes, diced
2 green onions (green and white parts), thinly sliced
In a large pot, bring water to a boil
over high heat.
While water heats, thoroughly rinse spinach. Add spinach to boiling water and cook for 1 minute. Remove with a slotted spoon and drain well in a colander. Press out as much liquid as possible with the back of a large spoon. (Discard water or save for vegetable stock.)
Preheat oven to 350° F. If using a casserole dish, spray it with vegetable oil spray and set aside.
In a medium bowl, combine spinach, black beans, salsa, cumin, and chili powder.
Spoon 1/4 of the mixture down the middle of one tortilla. Roll the tortilla around the filling (jelly-roll style). Place tortilla seam side down in a shallow nonstick baking pan or prepared casserole dish. Repeat process with remaining tortillas.
Bake enchiladas, uncovered, for 15 minutes.
Meanwhile, combine sour cream and lime juice. Remove enchiladas from oven and spread sour cream mixture evenly over enchiladas. Top with cheese, tomatoes, and green onions and bake for 5 minutes.
Cook’s Tip: This dish freezes so well that you might want to make a batch to keep on hand for unexpected guests or evenings when you just don’t want to cook. After rolling the enchiladas, place them in a container and cover tightly with foil or put them in an airtight plastic freezer bag. Increase baking time to 35 to 40 minutes.
You can substitute a 10-ounce package of no-salt-added frozen spinach for the fresh spinach. Cook according to package directions, omitting salt and oil, then continue with the recipe.
BUTTERNUT SQUASH and BARTLETT PEAR SOUP
Serves 6
3 Tbs. olive oil
2 medium leeks, white and tender green parts finely chopped (3 cups)
1 small butternut squash, peeled and cut into 1-inch pieces (2 lb.)
3 Bartlett pears, peeled, cored, and cut into 1-inch pieces (1½ lb.)
5 cups low-sodium vegetable broth
1 14-oz. can light coconut milk
1 tsp. chopped fresh thyme
Pumpkin seeds for garnish, optional
1. Heat oil in saucepan over medium-low heat. Add leeks, and cook 10 minutes, or until soft, stirring often.
2. Add squash and pears, and sauté 5 minutes. Stir in vegetable broth, and bring to a boil. Reduce heat to medium-low, and add salt, if desired. Simmer 20 minutes, or until squash is fork-tender.
3. Remove from heat, and stir in coconut milk. Purée soup in batches in blender or food processor, or use immersion blender in saucepan; blend until smooth. Return soup to saucepan, and stir in thyme. Reheat over medium-low heat 2 to 3 minutes, or until warmed through. Season with salt and white pepper, if desired. Serve garnished with pumpkin seeds, if using.
1 Tbs. vegetable oil
4 cups thinly sliced onions
4 sprigs fresh thyme
2 cloves garlic, minced
8 cups cubed, peeled butternut squash (1/2" cubes)
2 Tbs. finely chopped fresh sage leaves (or 2 tsp. dried)
2 Tbs. finely chopped fresh parsley leaves
Salt and pepper to taste
1/2 cup vegetable broth or water
1/2 cup shredded Swiss cheese
1 cup fresh bread crumbs
Preparation
Preheat oven to 350 degrees. Spray a 2-quart oval casserole with
vegetable cooking spray. Set aside.
Heat oil in a large skillet over medium-high heat. Add onions and thyme.
Sauté for 15 to 20 minutes, or until onions are golden brown. Stir in
garlic. Sauté 1 more minute. Spread onion mixture in bottom of prepared
casserole. Remove and discard thyme sprigs, if desired.
In a large bowl, combine squash, sage, parsley, and salt and pepper to
taste. Spoon mixture evenly over onion mixture in casserole. Pour stock
or water into casserole. Sprinkle top evenly with cheese, then crumbs.
Cover tightly with foil.
Bake for 35 minutes. Remove foil. Bake for 25 more minutes, until top is
browned and squash is tender. Makes 6 to 8 servings.
Helpful Hint: A 2-1/2 lb. squash yields about 8 cups cubed.
Per Serving: 233 Cal.; 7g Prot.; 6g Fat; 43g Carb.; 9mg Chol.; 280mg
Sod.; 10g Fiber.
8 oz linguine
4 oz sliced sundried tomatos
1/4 oz dehydrated onion
1/4 oz dried basil
olive oil
Cook pasta. Do not drain. Add other ingredients and set aside 10 minutes. Drain, add olive oil.
Serve with [[Salmon Croquets]].
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
merge(String.prototype,{
parseTagExpr: function(debug) {
if (this.trim() == "")
return "(true)";
var anyLogicOp = /(!|&&|\|\||\(|\))/g;
var singleLogicOp = /^(!|&&|\|\||\(|\))$/;
var spaced = this.
// because square brackets in templates are no good
// this means you can use [(With Spaces)] instead of [[With Spaces]]
replace(/\[\(/g," [[").
replace(/\)\]/g,"]] ").
// space things out so we can use readBracketedList. tricky eh?
replace(anyLogicOp," $1 ");
var expr = "";
var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!
for (var i=0;i<tokens.length;i++)
if (tokens[i].match(singleLogicOp))
expr += tokens[i];
else
expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think
if (debug)
alert(expr);
return '('+expr+')';
}
});
merge(TiddlyWiki.prototype,{
getTiddlersByTagExpr: function(tagExpr,sortField) {
var result = [];
var expr = tagExpr.parseTagExpr();
store.forEachTiddler(function(title,tiddler) {
if (eval(expr))
result.push(tiddler);
});
if(!sortField)
sortField = "title";
result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return result;
}
});
config.taggly = {
// for translations
lingo: {
labels: {
asc: "\u2191", // down arrow
desc: "\u2193", // up arrow
title: "title",
modified: "modified",
created: "created",
show: "+",
hide: "-",
normal: "normal",
group: "group",
commas: "commas",
sitemap: "sitemap",
numCols: "cols\u00b1", // plus minus sign
label: "Tagged as '%0':",
exprLabel: "Matching tag expression '%0':",
excerpts: "excerpts",
descr: "descr",
slices: "slices",
contents: "contents",
sliders: "sliders",
noexcerpts: "title only",
noneFound: "(none)"
},
tooltips: {
title: "Click to sort by title",
modified: "Click to sort by modified date",
created: "Click to sort by created date",
show: "Click to show tagging list",
hide: "Click to hide tagging list",
normal: "Click to show a normal ungrouped list",
group: "Click to show list grouped by tag",
sitemap: "Click to show a sitemap style list",
commas: "Click to show a comma separated list",
numCols: "Click to change number of columns",
excerpts: "Click to show excerpts",
descr: "Click to show the description slice",
slices: "Click to show all slices",
contents: "Click to show entire tiddler contents",
sliders: "Click to show tiddler contents in sliders",
noexcerpts: "Click to show entire title only"
},
tooDeepMessage: "* //sitemap too deep...//"
},
config: {
showTaggingCounts: true,
listOpts: {
// the first one will be the default
sortBy: ["title","modified","created"],
sortOrder: ["asc","desc"],
hideState: ["show","hide"],
listMode: ["normal","group","sitemap","commas"],
numCols: ["1","2","3","4","5","6"],
excerpts: ["noexcerpts","excerpts","descr","slices","contents","sliders"]
},
valuePrefix: "taggly.",
excludeTags: ["excludeLists","excludeTagging"],
excerptSize: 50,
excerptMarker: "/%"+"%/",
siteMapDepthLimit: 25
},
getTagglyOpt: function(title,opt) {
var val = store.getValue(title,this.config.valuePrefix+opt);
return val ? val : this.config.listOpts[opt][0];
},
setTagglyOpt: function(title,opt,value) {
if (!store.tiddlerExists(title))
// create it silently
store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
// if value is default then remove it to save space
return store.setValue(title,
this.config.valuePrefix+opt,
value == this.config.listOpts[opt][0] ? null : value);
},
getNextValue: function(title,opt) {
var current = this.getTagglyOpt(title,opt);
var pos = this.config.listOpts[opt].indexOf(current);
// a little usability enhancement. actually it doesn't work right for grouped or sitemap
var limit = (opt == "numCols" ? store.getTiddlersByTagExpr(title).length : this.config.listOpts[opt].length);
var newPos = (pos + 1) % limit;
return this.config.listOpts[opt][newPos];
},
toggleTagglyOpt: function(title,opt) {
var newVal = this.getNextValue(title,opt);
this.setTagglyOpt(title,opt,newVal);
},
createListControl: function(place,title,type) {
var lingo = config.taggly.lingo;
var label;
var tooltip;
var onclick;
if ((type == "title" || type == "modified" || type == "created")) {
// "special" controls. a little tricky. derived from sortOrder and sortBy
label = lingo.labels[type];
tooltip = lingo.tooltips[type];
if (this.getTagglyOpt(title,"sortBy") == type) {
label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
onclick = function() {
config.taggly.toggleTagglyOpt(title,"sortOrder");
return false;
}
}
else {
onclick = function() {
config.taggly.setTagglyOpt(title,"sortBy",type);
config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
return false;
}
}
}
else {
// "regular" controls, nice and simple
label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
onclick = function() {
config.taggly.toggleTagglyOpt(title,type);
return false;
}
}
// hide button because commas don't have columns
if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
},
makeColumns: function(orig,numCols) {
var listSize = orig.length;
var colSize = listSize/numCols;
var remainder = listSize % numCols;
var upperColsize = colSize;
var lowerColsize = colSize;
if (colSize != Math.floor(colSize)) {
// it's not an exact fit so..
upperColsize = Math.floor(colSize) + 1;
lowerColsize = Math.floor(colSize);
}
var output = [];
var c = 0;
for (var j=0;j<numCols;j++) {
var singleCol = [];
var thisSize = j < remainder ? upperColsize : lowerColsize;
for (var i=0;i<thisSize;i++)
singleCol.push(orig[c++]);
output.push(singleCol);
}
return output;
},
drawTable: function(place,columns,theClass) {
var newTable = createTiddlyElement(place,"table",null,theClass);
var newTbody = createTiddlyElement(newTable,"tbody");
var newTr = createTiddlyElement(newTbody,"tr");
for (var j=0;j<columns.length;j++) {
var colOutput = "";
for (var i=0;i<columns[j].length;i++)
colOutput += columns[j][i];
var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
wikify(colOutput,newTd);
}
return newTable;
},
createTagglyList: function(place,title,isTagExpr) {
switch(this.getTagglyOpt(title,"listMode")) {
case "group": return this.createTagglyListGrouped(place,title,isTagExpr); break;
case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
}
},
getTaggingCount: function(title,isTagExpr) {
// thanks to Doug Edmunds
if (this.config.showTaggingCounts) {
var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
if (tagCount > 0)
return " ("+tagCount+")";
}
return "";
},
getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
},
getExcerpt: function(inTiddlerTitle,title,indent) {
if (!indent)
indent = 1;
var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
var t = store.getTiddler(title);
if (t && displayMode == "excerpts") {
var text = t.text.replace(/\n/," ");
var marker = text.indexOf(this.config.excerptMarker);
if (marker != -1) {
return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
}
else if (text.length < this.config.excerptSize) {
return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
}
else {
return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
}
}
else if (t && displayMode == "contents") {
return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
}
else if (t && displayMode == "sliders") {
return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
}
else if (t && displayMode == "descr") {
var descr = store.getTiddlerSlice(title,'Description');
return descr ? " {{excerpt{" + descr + "}}}" : "";
}
else if (t && displayMode == "slices") {
var result = "";
var slices = store.calcAllSlices(title);
for (var s in slices)
result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
return result ? "\n{{excerpt excerptIndent{\n" + result + "}}}" : "";
}
return "";
},
notHidden: function(t,inTiddler) {
if (typeof t == "string")
t = store.getTiddler(t);
return (!t || !t.tags.containsAny(this.config.excludeTags) ||
(inTiddler && this.config.excludeTags.contains(inTiddler)));
},
// this is for normal and commas mode
createTagglyListNormal: function(place,title,useCommas,isTagExpr) {
var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);
if (this.getTagglyOpt(title,"sortOrder") == "desc")
list = list.reverse();
var output = [];
var first = true;
for (var i=0;i<list.length;i++) {
if (this.notHidden(list[i],title)) {
var countString = this.getTaggingCount(list[i].title);
var excerpt = this.getExcerpt(title,list[i].title);
if (useCommas)
output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
else
output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");
first = false;
}
}
return this.drawTable(place,
this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
useCommas ? "commas" : "normal");
},
// this is for the "grouped" mode
createTagglyListGrouped: function(place,title,isTagExpr) {
var sortBy = this.getTagglyOpt(title,"sortBy");
var sortOrder = this.getTagglyOpt(title,"sortOrder");
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list = list.reverse();
var leftOvers = []
for (var i=0;i<list.length;i++)
leftOvers.push(list[i].title);
var allTagsHolder = {};
for (var i=0;i<list.length;i++) {
for (var j=0;j<list[i].tags.length;j++) {
if (list[i].tags[j] != title) { // not this tiddler
if (this.notHidden(list[i].tags[j],title)) {
if (!allTagsHolder[list[i].tags[j]])
allTagsHolder[list[i].tags[j]] = "";
if (this.notHidden(list[i],title)) {
allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";
leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
}
}
}
}
}
var allTags = [];
for (var t in allTagsHolder)
allTags.push(t);
var sortHelper = function(a,b) {
if (a == b) return 0;
if (a < b) return -1;
return 1;
};
allTags.sort(function(a,b) {
var tidA = store.getTiddler(a);
var tidB = store.getTiddler(b);
if (sortBy == "title") return sortHelper(a,b);
else if (!tidA && !tidB) return 0;
else if (!tidA) return -1;
else if (!tidB) return +1;
else return sortHelper(tidA[sortBy],tidB[sortBy]);
});
var leftOverOutput = "";
for (var i=0;i<leftOvers.length;i++)
if (this.notHidden(leftOvers[i],title))
leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";
var output = [];
if (sortOrder == "desc")
allTags.reverse();
else if (leftOverOutput != "")
// leftovers first...
output.push(leftOverOutput);
for (var i=0;i<allTags.length;i++)
if (allTagsHolder[allTags[i]] != "")
output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);
if (sortOrder == "desc" && leftOverOutput != "")
// leftovers last...
output.push(leftOverOutput);
return this.drawTable(place,
this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
"grouped");
},
// used to build site map
treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list.reverse();
var indent = "";
for (var j=0;j<depth;j++)
indent += "*"
var childOutput = "";
if (depth > this.config.siteMapDepthLimit)
childOutput += indent + this.lingo.tooDeepMessage;
else
for (var i=0;i<list.length;i++)
if (list[i].title != title)
if (this.notHidden(list[i].title,this.config.inTiddler))
childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);
if (depth == 0)
return childOutput;
else
return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
},
// this if for the site map mode
createTagglyListSiteMap: function(place,title,isTagExpr) {
this.config.inTiddler = title; // nasty. should pass it in to traverse probably
var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
return this.drawTable(place,
this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
"sitemap"
);
},
macros: {
tagglyTagging: {
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var parsedParams = paramString.parseParams("tag",null,true);
var refreshContainer = createTiddlyElement(place,"div");
// do some refresh magic to make it keep the list fresh - thanks Saq
refreshContainer.setAttribute("refresh","macro");
refreshContainer.setAttribute("macroName",macroName);
var tag = getParam(parsedParams,"tag");
var expr = getParam(parsedParams,"expr");
if (expr) {
refreshContainer.setAttribute("isTagExpr","true");
refreshContainer.setAttribute("title",expr);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("isTagExpr","false");
if (tag) {
refreshContainer.setAttribute("title",tag);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("title",tiddler.title);
refreshContainer.setAttribute("showEmpty","false");
}
}
this.refresh(refreshContainer);
},
refresh: function(place) {
var title = place.getAttribute("title");
var isTagExpr = place.getAttribute("isTagExpr") == "true";
var showEmpty = place.getAttribute("showEmpty") == "true";
removeChildren(place);
addClass(place,"tagglyTagging");
var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
if (countFound > 0 || showEmpty) {
var lingo = config.taggly.lingo;
config.taggly.createListControl(place,title,"hideState");
if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
createTiddlyElement(place,"span",null,"tagglyLabel",
isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
config.taggly.createListControl(place,title,"title");
config.taggly.createListControl(place,title,"modified");
config.taggly.createListControl(place,title,"created");
config.taggly.createListControl(place,title,"listMode");
config.taggly.createListControl(place,title,"excerpts");
config.taggly.createListControl(place,title,"numCols");
config.taggly.createTagglyList(place,title,isTagExpr);
if (countFound == 0 && showEmpty)
createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
}
}
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
" margin-bottom:0.5em; }",
".tagglyTagging .indent1 { margin-left:3em; }",
".tagglyTagging .indent2 { margin-left:4em; }",
".tagglyTagging .indent3 { margin-left:5em; }",
".tagglyTagging .indent4 { margin-left:6em; }",
".tagglyTagging .indent5 { margin-left:7em; }",
".tagglyTagging .indent6 { margin-left:8em; }",
".tagglyTagging .indent7 { margin-left:9em; }",
".tagglyTagging .indent8 { margin-left:10em; }",
".tagglyTagging .indent9 { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
""].join("\n"),
init: function() {
merge(config.macros,this.macros);
config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
store.addNotification("TagglyTaggingStyles",refreshStyles);
}
};
config.taggly.init();
//}}}
/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin
// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed
***/
//{{{
config.formatters.unshift( {
name: "inlinesliders",
// match: "\\+\\+\\+\\+|\\<slider",
match: "\\<slider",
// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
handler: function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
wikify(lookaheadMatch[3],panel);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
onClickSlider : function(e) {
if(!e) var e = window.event;
var n = this.nextSibling;
n.style.display = (n.style.display=="none") ? "block" : "none";
return false;
}
});
//}}}
Makes 11/2 cups
1/4 cup lowfat yogurt
1/4 tsp curry powder
2 TB green onion, chopped
1/2 tsp lemon zest (use an organic lemon)
1 TB fresh dill, minced
1/4 cup celery, chopped
1–2 TB raisins
1 can Tongol or Albacore Tuna (salted or unsalted)
salt, to taste (optional)
your favorite bread
Combine salad ingredients and chill at least 30 minutes before making sandwiches. Garnish sandwiches with fresh butter lettuce.
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{
if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;
merge(config.macros,{
toggleTag: {
createIfRequired: true,
shortLabel: "[[%0]]",
longLabel: "[[%0]] [[%1]]",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tiddlerTitle = tiddler ? tiddler.title : '';
var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
label = (label == '-' ? '' : label); // dash means no label
var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
if (!store.tiddlerExists(title)) {
if (config.macros.toggleTag.createIfRequired) {
var content = store.getTiddlerText(title); // just in case it's a shadow
store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
}
else
return false;
}
if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
theTiddler.modified = new Date();
store.setTiddlerTag(title,this.checked,tag);
return true;
});
}
}
});
//}}}
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'pwef';
// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too
// disable autosave in d3
if (window.location.protocol != "file:")
config.options.chkGTDLazyAutoSave = false;
// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}
// create some shadow tiddler content
merge(config.shadowTiddlers,{
'WelcomeToTiddlyspot':[
"This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
"<<tiddler TspotControls>>",
"See also GettingStarted.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),
'TspotControls':[
"| tiddlyspot password:|<<option pasUploadPassword>>|",
"| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
"| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),
'TspotSidebar':[
"<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),
'TspotOptions':[
"tiddlyspot password:",
"<<option pasUploadPassword>>",
""
].join("\n")
});
//}}}
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 08/09/2013 21:17:47 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 23/11/2013 11:13:50 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . | ok |
| 23/11/2013 11:15:12 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 13/12/2013 16:10:18 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 02/01/2014 21:00:57 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 05/01/2014 13:31:46 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . | ok |
| 05/01/2014 13:35:05 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 16/03/2014 15:15:16 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 19/06/2014 22:13:26 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
| 20/06/2014 23:16:47 | pwef | [[/|http://pwef.tiddlyspot.com/#Recipe]] | [[store.cgi|http://pwef.tiddlyspot.com/store.cgi]] | . | [[index.html | http://pwef.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 3,
date: new Date("Feb 24, 2008"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
if (!params) params = {};
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
options: [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine"
],
refreshOptions: function(listWrapper) {
var opts = [];
for(i=0; i<this.options.length; i++) {
var opt = {};
opts.push();
opt.option = "";
n = this.options[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
};
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
var rssString = generateRss();
// no UnicodeToUTF8 conversion needed when location is "file" !!!
if (document.location.toString().substr(0,4) != "file")
rssString = convertUnicodeToUTF8(rssString);
bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == 404)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
if (responseText.charAt(0) != '0')
status = null;
callback(status,params,responseText,url,xhr);
};
// do httpUpload
var boundary = "---------------------------"+"AaB03x";
var uploadFormName = "UploadPlugin";
// compose headers data
var sheader = "";
sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
sheader += uploadFormName +"\"\r\n\r\n";
sheader += "backupDir="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
sheader += "Content-Length: " + data.length + "\r\n\r\n";
// compose trailer data
var strailer = new String();
strailer = "\r\n--" + boundary + "--\r\n";
data = sheader + data + strailer;
if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; ;charset=UTF-8; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
Ingredients
MEATBALLS
1 lb. lean ground turkey
1/4 cup unseasoned dry bread crumbs
1/4 cup chopped onion
1/4 tsp. seasoned salt
1 egg
CHILI
1 medium zucchini, cut into 1- by 1/4- by 1/4-inch strips
2 garlic cloves, minced
1 (28-oz.) can whole tomatoes, undrained, cut up
1 (15.5-oz.) can great northern beans, drained
1 (14.5-oz.) can ready-to-serve chicken broth
1 tsp. sugar
1 tsp. cumin
3 tsp. chili powder
1/4 tsp. pepper
1/8 tsp. salt
Instructions
In medium bowl, combine all meatball ingredients; mix well. Shape into 24 (1 1/2-inch) balls.
Spray large skillet with non-stick cooking spray. Heat over medium heat until hot. Add meatballs. Cook 8 to 10 minutes or until browned on all sides and no longer pink in center.
In Dutch oven or large saucepan. Combine all chili ingredients. Mix well.
Bring to a boil. Reduce heat. Add meatballs.
Simmer 10 to 15 minutes or until thoroughly heated.
White Beans and Greens with Garlic and Olive Oil
TOTAL TIME: 1 to 2 ½ hours, largely unattended
INGREDIENTS
1 pound dried white beans
1 medium onion, unpeeled
Several bay leaves (optional)
2 teaspoons salt
1 teaspoon pepper
2 bunches (about 3 pounds) escarole, broccoli rabe, or other greens, with no stem over 1/4 inch thick, well washed and roughly chopped
2 tablespoons minced garlic, or more to taste
1/4 cup extra virgin olive oil, or more to taste
1 cup freshly grated Parmesan or toasted breadcrumbs (or both) for garnish
PREPARATION
1. Rinse the beans under running water, picking through them for stones or debris. Soak them if you have time, and put them in a large pot with enough cold water to cover by about three inches. Add the onion and bay leaves if you’re using them. Bring the water to a boil, then reduce the heat so bubbles are barely visible. Cover the pot tightly and let the beans cook undisturbed for 45 minutes.
2. Try a bean. If it’s at all tender, add the salt and pepper. Make sure the beans are still covered by about an inch of water; add a little more if necessary. If the beans are still hard, don’t add the seasonings yet and make sure they’re covered by about two inches of water; if not, add some.
3. Return the liquid to its very gentle bubble and cover. Now start checking for doneness every 10 to 15 minutes and, if necessary, add enough water to keep the beans just submerged. Small beans will take as little as 15 minutes or more; older or larger beans can take up to an hour or more. If you haven’t added salt and pepper yet, add them when the beans are just turning tender.
4. Add the greens and cook until they are tender, 10 to 30 minutes depending on the thickness of the stems. If you want a soupy mixture, add more water. Remove the onion and bay leaves, taste and adjust the seasoning. A few minutes before serving, stir in the garlic and olive oil. Spoon the beans and greens into bowls, and garnish with the Parmesan and/or breadcrumbs.
YIELD: About 8 servings
2 pieces skin-on wild salmon (about 8 oz. each)
2 T olive oil
chopped fresh herbs or dried herbs of your choice, enough to cover salmon (Recipe suggested fresh chervil, parsley, or dill but said basil or thyme could be substituted. I used Claudia's Fantastic Fish Blend which is a dried blend of lemon basil, chives, dill, thyme, and celery.)
salt and fresh ground black pepper to taste
Remove salmon pieces from refrigerator and let come to room temperature. Turn on oven to 450F and coat the roasting pan with olive oil and place it in the oven. (Bittman recommended 475F, but I was using my toaster oven which only goes to 450F.) While it heats, rub the fleshy side of the salmon with herbs and let sit at room temperature.
When oil in the pan is sizzling (about 5 minutes) remove pan and place salmon on it, skin side up. Put pan back in the oven and roast 4-5 minutes, or until skin lifts off easily. Pull off skin carefully, and season skin side of fish with salt and pepper.
Turn salmon over with herb side up and roast about 3 more minutes, or until it's as done as you like it. (Total roasting time of about 7 minutes seemed perfect to me.)
Serve hot, with Tomatillo and [[Black Bean Salsa]] if desired.