Сегодня 18 мая, суббота ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7273
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Flash Ripper | ru - flash, flex, air, swf, flv, mpeg4, fla, ruby
Flash Ripper | ru - flash, flex, air, swf, flv, mpeg4, fla, ruby
Голосов: 1
Адрес блога: http://flash-ripper.com/
Добавлен: 2008-06-12 21:16:04 блограйдером ZaiSL
 

Онлайн-трансляция дня мобильных технологий с WebCamp Odessa‬

2014-07-22 11:46:28 (читать в оригинале)

Пишет Дмитрий Сподарец из Одессы, организатор проходящей сейчас в рамках Odessa Innovation Week конференции WebCamp2014: "Сегодня говорим о мобильных технологиях." Онлайн-трансляция — на http://webcamp.in.ua

WebCamp Odessa

 

 

Тэги: 
‎geekslab‬
webcampodessa‬
odessa


Бесплатный шрифт Shket

2014-07-21 16:55:12 (читать в оригинале)

Shket is a modern sans serif typeface that comes with more than 460 glyphs to support a variety of languages. It also includes 471 kerning pairs, mathematical characters, and more. It's meant for use at large sizes, and is ideal for posters, headlines, and more. It's regularly updated and improved, too.

Download Free Shket font

Тэги: 
fonts
free


Как изменить все шрифты в файле FLA

2014-07-18 14:32:27 (читать в оригинале)

JSFL всех нас переживет: получил благодарность в твиттере за пост 2007 года на ActionScript.org — до сих пор актуальная инструкция. Так что перевожу на русский и делюсь по новой.

Задача: есть масса чужих FLA файлов с кучей анимации на таймлайне. Нужно изменить все шрифты на новые.

Решение: сценарий на JSFL. Он заменяет шрифты, строит и сохраняет отчет о каждой замене. Скрипт рекурсивно обходит весь документ, пока не найдет все текстовые элементы. Для каждого текстового элемента строится его путь, создается массив текстовых элементов документа для будущего использования.

Итак, в первом JSFL-файле по адресу "\Documents and Settings\[]\Local Settings\Application Data\Adobe\Flash X\en\Configuration\Commands\[FR] Replace Fonts.jsfl" происходит замена и создание отчета:

var dom = fl.getDocumentDOM();

dom.editScene(0);
//dom.selection = dom.getTimeline().layers[0].frames[0].elements;

fl.outputPanel.clear();
fl.trace("********************************************************************");
fl.trace("  START OF FONT REPLACEMENT REPORT\n");
fl.trace("  FONT REPLACEMENT UTILITY");
fl.trace("  v 1.0.2");
fl.trace("  Author: Rostislav Siryk");
fl.trace("  http://flash-ripper.com/");
fl.trace("********************************************************************");

fl.trace("\nFILE NAME:\t" + dom.name + ".fla");
fl.trace("FILE PATH:\t" + dom.path + "\n");

//fl.saveDocumentAs(.documents[0].path);

// Font to be replaced
var font_select = new Array("MyLifeSans", 
							"MyLifeSer",
							"Myriad",
							"Myriad-Bold",
							"Myriad-Roman",
							"Frutiger 45 Light",
							"Frutiger 55 Roman",
							"Garamond Book",
							"ArialNarrow-Bold",
							"Avenir LT Std 65 Medium",
							"Helvetica",
							"Verdana",
							"Arial Black",
							"Arial Narrow",
							"Myriad Roman"
							);

var textElements = new Array();

var numTotalRuns = 0;
var strOutput = "";
var fontsFound = new Array();
var strFoundFonts = "";
var numTextItemsTotal = 0;
var numTextItemsReplaced = 0;

var strLayerName = "";
var strItemFullPath = "";
var strItemHumanPath = "";


// Delimiters used to create element paths
var strTimelinesDelimiter = ".libraryItem.timeline";
var strLayerDelimiter = ".layers";
var strFrameDelimiter = ".frames";
var strElementDelimiter = ".elements";
var BR_O = "[";
var BR_C = "]";

findTextElements = function(theTimeline) 
{
	if(theTimeline && theTimeline.layers.length > 0)
	{
	var theLayers = theTimeline.layers;
	for(var numLayer = 0; numLayer < theLayers.length; numLayer++)
	{
		// Parse FRAMES of the LAYER
		var theFrames = theLayers[numLayer].frames;
		for(var numFrame = 0; numFrame < theFrames.length; numFrame++)
		{
			// Parse only KEY Frames. I said PARSE ONLY \KEY/ FRAMES.
			if (numFrame == theFrames[numFrame].startFrame)
			{
				// Parse ELEMENTS of the KEYFRAME
				var theElements = theFrames[numFrame].elements;
				for(var numElement=0; numElement < theElements.length; numElement++) 
				{
					numTotalRuns ++;
					
					var foundElement = theElements[numElement];

					// if element is not text but instance
					if(foundElement.elementType == "instance")
					{
						// Add LAYER to the item full path
						strItemFullPath += strLayerDelimiter + BR_O + numLayer + BR_C;

						strLayerName = "." + theLayers[numLayer].name;
						strItemHumanPath += strLayerName;
						
						// Add FRAME, ELEMENT and TIMELINE to the item full path
						strItemFullPath += strFrameDelimiter + BR_O + numFrame + BR_C + strElementDelimiter + BR_O + numElement + BR_C + strTimelinesDelimiter;
						strItemHumanPath += "[fr" + numFrame + "]" + (foundElement.name || "(unnamed)");
						
						findTextElements(foundElement.libraryItem.timeline);
					}
					else if	(foundElement.elementType == "text")
					{
						// Add LAYER to the item full path
						strItemFullPath += strLayerDelimiter + BR_O + numLayer + BR_C;

						strLayerName = "." + theLayers[numLayer].name;
						strItemHumanPath += strLayerName;
						
						// Add FRAME and ELEMENT to the full path and FINALIZE path
						strItemFullPath += strFrameDelimiter + BR_O + numFrame + BR_C + strElementDelimiter + BR_O + numElement + BR_C;
						strItemHumanPath += "[fr" + numFrame + "]" + (foundElement.name || "(unnamed)");

						textElements.push({theElement:		foundElement, 
										  	itemID:			numTextItemsTotal, 
											itemPath:		strItemFullPath,
											itemHumanPath:	strItemHumanPath
											});
						
						// Reset the paths for the next iteration 
						strItemFullPath = "";//strLayerDelimiter + BR_O + numLayer + BR_C;
						strItemHumanPath = "";
						
						numTextItemsTotal++;
						
/*						numElement = theElements.length;
						numFrame = theFrames.length;
						numLayer = theLayers.length;
						break;*/
					}
				}
			}
			else
			{
				// NO KEYFRAME ACTION
			}
		}
	}
	}
}
/*for(var i=0; i < dom.library.items.length; i++) 
{
	fl.trace("LIBITITEM.");
	findTextElements(dom.library.items[i].timeline)
}*/

function enumerateAllTextElements()
{
	for(var numTe = 0; numTe < textElements.length; numTe++)
	{
		var te = textElements[numTe];
		strOutput += "\n\tTEXT #" + te.itemID
			+ "\n\tFont:\t" + te.theElement.getTextAttr("face")
			+ "\n\tPath:\t" + te.itemPath
			//+ "\n\tSeek:\t" + te.itemHumanPath
			+ "\n\tText:\t" + te.theElement.getTextString()
			+ "\n";
	}
}

function replaceAllFonts()
{
	for(i=0; i < font_select.length; i++)
	{
		font_replaced = font_select[i];
		font_replacement = "Arial";
		if(font_replaced == "Garamond Book") 
			{
				font_replacement = "Times New Roman";
			}
		for(var te = 0; te < textElements.length; te++)
		{
			replaceFont(textElements[te]);
		}
	}
}

function replaceFont(objText)
{
	var textElement = objText.theElement;
	//fl.trace("TE= " + textElement.theElement);
	if(textElement.getTextAttr("face"))
	{
		var oldFont = textElement.getTextAttr("face");
		var oldSize = textElement.getTextAttr("size");
		var txt = textElement.getTextString();
		
		addFoundFont(oldFont);
		
		if(oldFont == font_replaced) 
		{
			numTextItemsReplaced++;
			textElement.setTextAttr("face", font_replacement);
			
			var strSizeChange = "";
			if(!isNaN(oldSize) && (oldFont == "FullLifeSans" || oldFont == "FullLifeSer"))
			{
				newSize = oldSize * 0.85 || Math.floor(oldSize * 0.85);
				textElement.setTextAttr("size", newSize);
				strSizeChange = 
					"\n\tOLD Size:\t" + oldSize
					+ "\n\tNEW Size:\t" + newSize;
			}

			strOutput += "\n\tREPLACE #" + objText.itemID
				+ "\n\tOLD Font:\t" + oldFont
				+ "\n\tNEW Font:\t" + font_replacement
				+ strSizeChange
				+ "\n\tPath:\t" + objText.itemPath
				//+ "\n\tSeek:\t" + objText.itemHumanPath
				+ "\n\tText:\t" + txt
				+ "\n"
		}
		else
		{
				//strOutput += "\t[NO CHANGES TO FONT]\n"; 	
		}
	}
}

function addFoundFont(fontName)
{
	isInFontsFoundAlready = false;
	for(var i=0; i < fontsFound.length; i++)
	{
		if(fontsFound[i] == fontName)
		{
			isInFontsFoundAlready = true;
			break;
		}
	}
	if(!isInFontsFoundAlready)
	{
		fontsFound.push(fontName);
		strFoundFonts += "\n\t" + fontsFound.length + "\t" + fontName;
	}
}

/*font_replaced = "FullLifeSer";
font_replacement = "Arial";*/

findTextElements(dom.getTimeline());

strOutput += "FOUND TEXT FIELDS:\t" + numTextItemsTotal + "\n";
strOutput += "******************\n";
enumerateAllTextElements();

strOutput += "\n\nREPLACEMENTS MADE:\t" /*+ numTextItemsReplaced*/ + "\n";
strOutput += "******************\n";

replaceAllFonts();

fl.trace("TOTAL RUNS:\t" + numTotalRuns);
fl.trace("ITEMS FOUND:\t" + numTextItemsTotal);
fl.trace("ITEMS REPLACED:\t" + numTextItemsReplaced);
fl.trace("FONTS FOUND:\t" + fontsFound.length + strFoundFonts + "\n");

fl.trace("DETAILS:");
fl.trace("********");
fl.trace("\n" + strOutput + "\n\n");

fl.trace("********************************************************************");
fl.trace("  END OF FONT REPLACEMENT REPORT");
fl.trace("********************************************************************");

// Saving created report to as file
fl.outputPanel.save("file:///d|/Projects/eLearn2/reports/" + dom.name + "-report.txt");

fl.outputPanel.clear();
// NOW WRITE SOME INFO JUST ABOUT FONTS FOR STATISTICS
fl.trace("\n==========================");
fl.trace("FONTS INFO FOR FILE:\t" + dom.name + ".fla");
fl.trace("FILE PATH:\t" + dom.path + "\n");
fl.trace("FONTS FOUND:\t" + fontsFound.length + strFoundFonts + "\n");

// Append font report to file
fl.outputPanel.save("file:///d|/Projects/eLearn2/reports/global-font-report.txt", true);

dom.publish();
dom.saveAndCompact();
dom.close();

Второй JSFL-файл управляет работой первого для процессинга нескольких FLA

Он запускает первый на каждом из исходных FLA:

2. "\Documents and Settings\[]\Local Settings\Application Data\Adobe\Flash X\en\Configuration\Commands\[FR] Batch Replace Fonts.jsfl"
fl.outputPanel.clear();

fl.trace("******************************************************");
fl.trace("  BATCH REPLACE FONTS IN MULTIPLE FILES");
fl.trace("  Author: Rostislav Siryk");
fl.trace("  http://flash-ripper.com/");
fl.trace("******************************************************\n");

function getDuration(tEnd, tStart)
{
	var msecsDur = tEnd - tStart;
	
	var msecs = String(msecsDur).substr(String(msecsDur).length - 3);
	var secs = Math.floor(msecsDur / 1000);
	var mins = Math.floor(msecsDur / 60000);
	var hrs = Math.floor(msecsDur / 3600000);

	if (hrs < 10) hrs = "0" + hrs;
	if (mins < 10) mins = "0" + mins
	if (secs < 10) secs = "0" + secs;
	if (msecs < 10) msecs = "00" + msecs;
	else if (msecs < 100) msecs = "0" + msecs;
	
	
	return {durString: hrs + ":" + mins + ":" + secs + "." + msecs, durValue:msecsDur};
}

function getTimeString(aDate)
{
	time = aDate.getTime();
	hours = aDate.getHours();
	minutes = aDate.getMinutes();
	seconds = aDate.getSeconds();
	milliseconds = aDate.getMilliseconds();
	if (minutes < 10) minutes = "0" + minutes
	if (seconds < 10) seconds = "0" + seconds;
	if (milliseconds < 10) milliseconds = "00" + milliseconds;
	else if (milliseconds < 100) milliseconds = "0" + milliseconds;

	return hours + ":" + minutes + ":" + seconds + ":" + milliseconds;
}

function getCurrentTime()
{
	var dateNow = new Date();
	return {timeString: getTimeString(dateNow), timeValue:time};
}

var timeStart = getCurrentTime().timeString;
var timeStartValue = getCurrentTime().timeValue;

var numErrors = 0;

scriptFile="file:///c|/Documents and Settings/rost/Local Settings/Application Data/Macromedia/Flash 8/en/Configuration/Commands/[FR] Replace Fonts.jsfl"

// ADVANCED COURSE FILES LIST
strPathsAdv = 
"file:///d|/Projects/eLearn2/Fla/sec01/s02_01_01.fla#" +
"file:///d|/Projects/eLearn2/Fla/sec01/s02_01_02.fla#" +
"file:///d|/Projects/eLearn2/Fla/sec01/s02_01_03.fla#" +
"file:///d|/Projects/eLearn2Fla/site_files/ssecondary_4.fla#";


// BASIC COURSE FILES LIST
strPathsBasic = 
"file:///d|/Projects/eLearn2/Fla/sec01/s01_01_01.fla#"+
"file:///d|/Projects/eLearn2/Fla/sec01/s01_01_02.fla#"+
"file:///d|/Projects/eLearn2/Fla/sec01/s01_01_03.fla#"+
"file:///d|/Projects/eLearn2/Fla/site_files/ssecondary_4.fla"

fileStr = strPathsAdv + strPathsBasic;

if(fileStr.length > 0 && scriptFile.length > 0)
{
	var files = fileStr.split("#")
	var numFiles = files.length
	
	for(var f = 0; f < numFiles; ++f)
	{
		if(fl.fileExists(files[f]))
		{
			var tStart = getCurrentTime().timeString;
			var tStartValue = getCurrentTime().timeValue;
			fl.trace("Open File:\t" + files[f]);
			fl.openDocument(files[f])
			fl.runScript(scriptFile)
			fl.trace("\tFILE COMPLETE");
			fl.trace("\tSTART TIME:\t" + tStart + "\t(" + tStartValue + " msec)");
			fl.trace("\tEND TIME:\t" + getCurrentTime().timeString + "\t(" + getCurrentTime().timeValue + " msec)");
			fl.trace("\tDURATION:\t" + getDuration(getCurrentTime().timeValue, tStartValue).durString + "\t(" + getDuration(getCurrentTime().timeValue, tStartValue).durValue + " msec)\n");
		}
		else
		{
			fl.trace("ERROR OPENING FILE: File doesn't exist:\t"+ files[f] + "\n");
			numErrors++;
		}
	}
}

fl.trace("\n******************************************************");
fl.trace("FILES TOTAL:\t" + numFiles);
fl.trace("ERRORS TOTAL:\t" + numErrors);

fl.trace("\nSTART TIME:\t" + timeStart + "\t(" + timeStartValue + " msec)");
fl.trace("END TIME:\t" + getCurrentTime().timeString + "\t(" + getCurrentTime().timeValue + " msec)");
fl.trace("DURATION TOTAL:\t" + getDuration(getCurrentTime().timeValue, timeStartValue).durString + "\t(" + getDuration(getCurrentTime().timeValue, timeStartValue).durValue + " msec)");
fl.trace("******************************************************");

// Save report to file
fl.outputPanel.save("file:///d|/Projects/eLearn2/reports/batch-font-replace-report.txt");

Когда-то JSFL стал моим первым шагом в JavaScript :)

Тэги: 
jsfl
Automation
fonts
FLA
javascript


Зачем в JavaScript используют return !0

2014-07-17 14:50:17 (читать в оригинале)

Часто в JavaScript-коде можно увидеть такое: return !0;  Зачем это нужно?

Это такой хитрый способ записать true и результат минимизации JavaScript для экономии веб-траффика. Ведь для передачи !1 нужно всего 2 байта, а для передачи true — целых 4!

А почему не return 1, ведь это тоже дает true и занимает всего один байт?

А потому, что результат return 1 будет типа number, и если кто-то будет обрабатывать это строгими операторами типа === или !== , то получит ожидаемый результат от !0, а не от 1. Утащил со StackOveflow.

См. также: JavaScript-компилятор Closure.

Тэги: 
javascript


Простейший способ сделать уникальный дизайн пста в Drupal

2014-07-16 14:24:02 (читать в оригинале)

В Drupal можно применять стили к отдельным постам, придавая уникальный вид любому посту, сохраняя при этом общий дизайна сайта.

Достичь этого эффекта легко с помощью чистого CSS, не устанавливая никаких дополнительных модулей, но сделав только два движения:

  1. Под друпаловским тэгом <!--break--> в теле поста дописать стили, при этом можно переопределить любой существующий стиль документа, например, спрятав ненужные элементы, колонки и т.п. Дописывая стиль под тэгом break, мы предотвратим влияние этого стиля на другие страницы сайта.
  2. Пост опубликовать с разрешением на включение тэга style. Например, используя текстовый формат Full HTML или формат Filtered HTML, настроенный с  разрешением тэга style. В противном случае система публикации Drupal автоматически отфильтрует тэг стиля и эффекта не будет.

Таким образом можно делать уникальные посты, страницы, вакансии и т.п.

Пример простой стилизации поста

В этом посте отключим полностью заголовок, подвал, левую колонку, в HTML-коде сразу после тэга <!--break--> вставив следующее:

<style type="text/css">
  #sidebar,
  #breadcrumb,
  #footer,
  #header {
    display:none
  }
  #wrap #content {
    float: none;
  }
  .container .eleven.columns {
    width: auto;
  }
</style>
 
Как видите, это легко, достаточно лишь знать названия существующих стилей документа. Для более системных действий вас могут заинтересовать модули CSS, CSS Injector и JS Injector.
 
Уникальный дизайн — это оригинально!
 
 
Тэги: 
Drupal
css
верстка
Полезные советы


Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 

 


Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по сумме баллов (758) в категории «Истории»
Изменения рейтинга
Категория «Люди»
Взлеты Топ 5
Падения Топ 5


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.